Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Измерение длительности операции

66K
08 марта 2011 года
swatkiev
8 / / 08.03.2011
Доброго времени суток! Есть цикл, длительность которого нужно измерить, желательно в микро- или милисекундах с помощью системного таймера. Вычитал в Джордейне примерчик и на его основе написал программу.

Код:

.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
7
08 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
И как же она «толком не работает»?А вы точно в DOSе запускаете?
Если в Windows,то смею вас расстроить–прерывания в юзермоде не работают
66K
08 марта 2011 года
swatkiev
8 / / 08.03.2011
Естественно в ДОСе)) Я не знаю как перевести значение измерения из тактов в единицы измерения (сотые доли секунды) и вывести значение на экран
252
09 марта 2011 года
koderAlex
1.4K / / 07.09.2005
а прочитать регистр счётчика тактов процессора не судьба ?
66K
09 марта 2011 года
swatkiev
8 / / 08.03.2011
Цитата: koderAlex
а прочитать регистр счётчика тактов процессора не судьба ?



Что ты имеешь ввиду? Мне нужно перевести такты в секунды и вывести их на экран. Объясни, как ты это понимаешь.

252
09 марта 2011 года
koderAlex
1.4K / / 07.09.2005
посчитал такты цикла и дели их на тактовую частоту . получиш время выполнения в секундах .
66K
09 марта 2011 года
swatkiev
8 / / 08.03.2011
Цитата: koderAlex
посчитал такты цикла и дели их на тактовую частоту . получиш время выполнения в секундах .



Дело в том, что на разных компах разная частота. И вообще Джордейн предлагает делить на 18.2, потому что таймер производит 18.2 такта в секунду

252
09 марта 2011 года
koderAlex
1.4K / / 07.09.2005
Цитата: swatkiev
Дело в том, что на разных компах разная частота. И вообще Джордейн предлагает делить на 18.2, потому что таймер производит 18.2 такта в секунду



вешаете обработчик прерывания на часики . ставите в режим будильника с временем FF . теперь между прерываниями пройдёт ровно 1 секунда .
разность счётчика тактов в двух прерываниях и есть точная частота в данном конкретном процессоре .

260
09 марта 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: swatkiev
Дело в том, что на разных компах разная частота. И вообще Джордейн предлагает делить на 18.2, потому что таймер производит 18.2 такта в секунду



Небольшая справка: Джордейн как бэ не актуален последние лет ~20.

PS: rdtsc и иже с ним в помощь, ну а спид степ и аут оф ордер с друзьями пока подождут.

69K
09 марта 2011 года
Hunter557
1 / / 08.03.2011
Цитата: Ramon
Небольшая справка: Джордейн как бэ не актуален последние лет ~20.

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-тичную систему и вывести на экран ...я не помню как зделать перевод . Если кто шарит -напишите как зделать перевод и вывести результат на экран и получим готовую прогу.

252
10 марта 2011 года
koderAlex
1.4K / / 07.09.2005
18,2 - это приблизительное число . так что не рекомендуется . )
66K
10 марта 2011 года
swatkiev
8 / / 08.03.2011
Цитата: koderAlex
18,2 - это приблизительное число . так что не рекомендуется . )



.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). Эта программа переводит значение из ВХ в десятичную систему и выводит его на экран - только нужно с этими строчками разобраться....

66K
10 марта 2011 года
swatkiev
8 / / 08.03.2011
Все заработало - просто инструкции 586 убрал
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог