Здравствуйте, 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]