Измерение длительности операции
Код:
.586
.model small
.stack 100h
.data
x dw 156
y dw 139
oldcount dw 0
z dt 18.2
.code
begin:
mov ax,@data
mov ds,ax
finit
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov oldcount,dx ; сохраняем начальное значение
;-------------
; измеряем длительность этого цикла
mov ax,x
mov bx,y
xor cx,cx
for1:
inc cx
add ax,bx
cmp cx,10000
jl for1
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov bx,oldcount ; считываем старое значение
sub dx,bx ; берем разность
;-----------------
push bx ; заносим в стек
fld z ; заносим 18.2
fdiv ; делим
pop ax ; результат в ах
;----------------------
OutInt proc ; выведение на экран
aam
add ax,3030h
mov dl,ah
mov dh,al
mov ah,02
int 21h
mov dl,dh
int 21h
OutInt endp
;-----------------------
mov ax,4c00h
int 21h
end begin
Но программа толком не работает. Подскажите, может что-то не так - может нужно использовать иное прерывание (например int 2ch я пробовал, но что-то тоже не работает). И результат на экран тоже не получается вывести - та процедура, что я использовал, отказывается выводить время на экран. Программа должна выводить на экран время выполнения в микросекундах.
Помогите пожалуйста разобраться с этой задачей или предложите свой вариант решения! Спасибо1
Если в Windows,то смею вас расстроить–прерывания в юзермоде не работают
Что ты имеешь ввиду? Мне нужно перевести такты в секунды и вывести их на экран. Объясни, как ты это понимаешь.
Дело в том, что на разных компах разная частота. И вообще Джордейн предлагает делить на 18.2, потому что таймер производит 18.2 такта в секунду
вешаете обработчик прерывания на часики . ставите в режим будильника с временем FF . теперь между прерываниями пройдёт ровно 1 секунда .
разность счётчика тактов в двух прерываниях и есть точная частота в данном конкретном процессоре .
Небольшая справка: Джордейн как бэ не актуален последние лет ~20.
PS: rdtsc и иже с ним в помощь, ну а спид степ и аут оф ордер с друзьями пока подождут.
PS: rdtsc и иже с ним в помощь, ну а спид степ и аут оф ордер с друзьями пока подождут.
Зачем писать новый таймер ( будильник ) если уже есть готовый
586
.model small
.stack 100h
.data
x dw 156
y dw 139
oldcount dw 0
z dt 18.2
.code
begin:
mov ax,@data
mov ds,ax
finit
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov oldcount,dx ; сохраняем начальное значение
;-------------
; измеряем длительность этого цикла
mov ax,x
mov bx,y
xor cx,cx
for1:
inc cx
add ax,bx
cmp cx,10000
jl for1
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov bx,oldcount ; считываем старое значение
sub dx,bx ; берем разность
взяли результат первого и второго замеров ( до цикла и после его выполнения ) взяли разность и получили время выполнения цикла в тактах таймера (частота которого 18,2 такта в секунду) результат в BX (в гексосистеме 16-ричной ) дальше наверное нужно поделить это число на 18,2 , перевести результат из 16-ричной в 10-тичную систему и вывести на экран ...я не помню как зделать перевод . Если кто шарит -напишите как зделать перевод и вывести результат на экран и получим готовую прогу.
.586
.model small
.stack 100h
.data
x dw 156
y dw 139
ascii db 5 dup ("0"),'$'
oldcount dw 0
.code
begin:
mov ax,@data
mov ds,ax
finit
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov oldcount,dx ; сохраняем начальное значение
;-------------
; измеряем длительность этого цикла
mov ax,x
mov bx,y
xor cx,cx
for1:
inc cx
add ax,bx
cmp cx,10000
jl for1
;-------------
mov ah,0
int 1ah ; получаем значение счетчика
mov bx,oldcount ; считываем старое значение
sub dx,bx ; берем разность
;---------
mov di,10
mov si,offset ascii+4; конец строки для вывода числа на экран
mov ax,bx; число в АХ, максимальное число, которое можно вывести таким способом 65535 (=0FFFFh)
a1: xor dx,dx
div di
or [si],dl; вывожу на своё место и добавляю к остатку от деления код 30h чтобы получилась ASCII-цифра
dec si; двигаюсь к началу строки
test ax,ax; всё разделили?
jnz a1; если нет, то продолжаю делить дальше
mov ah,9; вывожу строку на экран
mov dx,offset ascii
int 21h
xor ax,ax; жду пока не нажмут любую клавишу
int 16h
mov ah,4Ch; выхожу из программы
int 21h
end begin
Ребята объясните почему выделенные команды не работают? (выбивается ошибка типа offset 32 bit). Эта программа переводит значение из ВХ в десятичную систему и выводит его на экран - только нужно с этими строчками разобраться....