Консультация № 181162
08.12.2010, 10:28
102.26 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следующей задачи:

Посчитать за какое время процессор выполнит 1 000 000 команд mov DI, SI; add DI, SI; mul SI. Для подсчёта времени использовать вектор 1Ch. Выводить на экран преобразованное в ASCII коды число тиков таймера, затраченное на операцию.

Для решения использовать Tasm без использования директивы model, операционная система ДОС, формат ЕХЕ. Приложите к решению пожалуйста блок-схему.

Обсуждение

давно
Посетитель
7438
7205
08.12.2010, 12:37
общий
Хм, один тик таймера (55 мсек) - это очень много
1000000 циклов пролетят и не заметите... Будете получать "число тиков таймера, затраченное на операцию" = 0
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.12.2010, 12:45
общий
Давайте, хотя бы, 100 000 000
На моем, не сильно быстром (2.4Гц), получается порядка 18
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.12.2010, 14:30
общий
это ответ
Здравствуйте, Ivan Afonin!
Программа готова.
Увеличил число выполнения цикла до 100 000 000. Иначе, выходит слишком быстро.
А так - порядка секунды...

181162-block-sch.doc (42.0 кб)
В блок-схеме счетчик отработки фрагмента для наглядности я сделал, как одну переменную "Счетчик"
Хотя там, на самом деле, два вложенных цикла
[code h=200];Посчитать за какое время процессор выполнит 1 000 000 команд
;mov DI, SI
;add DI, SI
;mul SI
;Для подсчёта времени использовать вектор 1Ch.
;Выводить на экран преобразованное в ASCII коды число тиков таймера,
;затраченное на операцию.

.186 ;чтобы можно было использовать push <число>
assume cs:code, ds:data
code segment para public 'code'
start:
mov ax, 351ch
int 21h ;узнаем вектор 1ch в es:bx

mov ax, data
mov ds, ax ;ds = data

mov Off_1c, bx ;сохраним старый адрес в сегменте данных
mov Seg_1c, es

lea dx, new_1c ;установим новый адрес
push cs ;обработчика прерывания 1ch
pop ds ;ds:dx
mov ax, 251ch
int 21h

mov ax, data
mov ds, ax ;ds = data

mov si, 123 ;что-нибудь, чтобы что-то там считало :)
mov bx, Ticks ;сохраним значение счетчика тиков в bx
mov cx, 10000 ;будем считать 10000 * 10000 = 100 000 000 циклов
Loop_1:
push cx
mov cx, 10000
Loop_2:
mov di, si ;тестовые команды
add di, si
mul si

loop Loop_2
pop cx
loop Loop_1

mov ax, Ticks ;новое число тиков
sub ax, bx ;число затраченных тиков

push ax ds ;сохраним ax и ds
lds dx, dword ptr Off_1c ;ds:dx - адрес старого вектора
mov ax, 251ch
int 21h ;восстановим!
pop ds ;ds = data

lea dx, sTicks ;выведем пояснение
mov ah, 9
int 21h

pop ax ;число тиков
call PutNumber ;выведем
Exit:
lea dx, sPress ;выведем приглашение нажать на любую клавишу
mov ah, 9
int 21h

mov ah, 0 ;ждем
int 16h

mov ax, 4c00h
int 21h ;выход в ДОС

PutNumber proc ;преобразование числа из ax в строку и вывод на экран
xor cx, cx ;счетчик разрядов
mov bx, 10 ;делим на 10
DivLoop: ;цикл преобразования в разряды
cwd ;подготавливаем dx:ax к делению
idiv bx ;dx = очередному младшему разряду
push dx ;сохраним в стеке
inc cx ;считаем
test ax, ax ;продолжаем, пока не дойдем до 0
jnz DivLoop
PrLoop: ;цикл вывода в обратном порядке
pop ax ;берем число 0-9 из стека
or al, '0' ;преобразовываем в символ '0'-'9'
int 29h ;выводим
loop PrLoop
ret
PutNumber endp

new_1c: ;подпрограмма отработки 1ch
push ds ;сохраним ds
push data
pop ds ;ds = data
inc Ticks ;инкремент Ticks в сегменте данных!
pushf ;вызовем старый обработчик, сначала надо pushf, т.к. выход по iret!
call dword ptr Off_1c;адрес в переменной в сегменте данных
pop ds ;восстановим ds
iret ;возврат из прерывания
code ends

data segment para public 'data'
Off_1c dw 0 ;смещение старого вектора 1c
Seg_1c dw 0 ;сегмент старого вектора 1c
Ticks dw 0 ;счетчик имков таймера
sTicks db 'Ticks count = $'
sPress db 0dh,0ah,'Press any key$'
bStr db 16 dup (?) ;строка для формирования числовой строки
data ends

end start
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.12.2010, 14:31
общий
Блок-схему предоставлю позже (дома сделаю )
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
08.12.2010, 15:41
общий
Адресаты:
Можно и больше сделать, принципиальной разницы в этом нет
давно
Посетитель
7438
7205
09.12.2010, 15:17
общий
И тут добавил блок-схему
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа