Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймер. Скорость выполнения арифм-х операций. 
V
    Опции темы
Joker07
Дата 5.7.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Привет Vingrad. Помогите пж-та разобраться с программой, определяющей скорость выполнения трех операций: сложение и вычитание двух слов, находящихся в регистрах, и умножения двух слов. 
Скорость тут определяется путем фиксации и чтения счетчика канала 0. 
Ассемблер я начал изучать совсем недавно, поэтому не совсем понимаю, как работает код программы.
Кто понял о чем речь, пж-та, добавьте свои комментарии и исправьте мои, я один не справлюсь  smile 
Код

data segment
mess_add db '‚Время выполнения операции add', 10, 13, '$'
mess_sub db '‚Время выполнения операции sub', 10, 13, '$'
mess_mul db '‚Время выполнения операции mul', 10, 13, '$'
mess_time db '0,0000'; время
mess db 5 dup(0), '  бҐЄг­¤', 13, 10, '$';буфер
_wait db 'Ќ ¦¬ЁвҐ «нажмите Enter..', 10, 13, '$'
add_time dw ?; записывается время на операцию сложения
sub_time dw ?; записывается время на операцию вычитания
mul_time dw ?; записывается время на операцию умножения
data ends
code segment
assume cs: code, ds: data
WordToStr proc; процедура, переводит из 16-ричной в 10-ю?
    push dx
    push si
    push cx
    mov ax, di
    mov si, 10
    lea bx, mess; в bx заносится адрес mass
    mov cx, 5
zerop:    mov byte ptr [bx], '0'; цикл, заносим нули в mess
    inc bx
    loop zerop
    dec bx; уменьшение bx на единицу
    xor dx, dx; сравнение dx, обнуляет dx
divide:    div si    ;деление по модулю
    add dl, '0'
    mov byte ptr [bx], dl
    xor dx, dx
    dec bx
    cmp al, 0
    jne divide
    pop cx
    pop si
    pop dx
    ret
WordToStr endp; конец процедуры
start:    mov ax, data
    mov ds, ax

    mov al, 0
    out 43h, al; чтение из порта 43h (таймер)
    nop; пустая операция
    in al, 40h; отсылать в порт
    nop; пустая операция
    mov ah, al
    in al, 40h
    nop
    xchg al, ah; меняет местами значения 
    push ax

    mul bx; умножение или деление

    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx; вычитание ax-dx
    mov dx, 840
    mul dx
    mov mul_time, ax; в mul_time заносим значения ax
nop
nop
nop
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah    ;обмен значениями
    push ax

    sub ax, bx

    mov al, 0
    out 43h, al    ;записать данные в порт
    nop
    in al, 40h        ;считует данные из порта
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx
    mov sub_time, ax
nop
nop
nop
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax

    add ax, bx

    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx        ;умножает dx * al(ax)=ax
    mov add_time, ax
nop
nop
nop
    lea bx, add_time
    lea si, mess_add        ;вычисление и помещение адреса в si
    mov cx, 3; переменная цикла
Print:    mov di, [bx]; Вывод на экран
    push bx
    call WordToStr
    pop bx
    mov dx, si
    mov ah, 09h
    int 21h
    lea dx, mess_time
    mov ah, 09h
    int 21h
    inc bx
    inc bx
    add si, 38
    loop print
quit:    mov ah, 09h
    lea dx, _wait
    int 21h
    mov ah, 08h
    int 21h
    mov ax, 4c00h    
    int 21h            
code ends
end start

PM MAIL   Вверх
MAKCim
Дата 5.7.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



PIT не подходит для вычисления времени выполнения одной инструкции


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Joker07
Дата 6.7.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



А то такое PIT? Это всмысле таймер?
Задание составлял преподаватель, там было указано использовать таймер, канал 0.
PM MAIL   Вверх
W4FhLF
Дата 6.7.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Цитата(Joker07 @  6.7.2008,  11:13 Найти цитируемый пост)
Задание составлял преподаватель


Скажи преподавателю, что он муд...

На каком процессоре и в какой среде запускается программа?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MAKCim
Дата 6.7.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Цитата(Joker07 @  6.7.2008,  11:13 Найти цитируемый пост)
А то такое PIT? Это всмысле таймер?

Programmable Interrupt Timer

Цитата(Joker07 @  6.7.2008,  11:13 Найти цитируемый пост)
Задание составлял преподаватель, там было указано использовать таймер, канал 0. 

какой результат выполнения?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Joker07
Дата 6.7.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Результат выполнения на процессоре Athlon 3000+, Среда - Windows XP:
Время выполнения одной операции add
0,000007560
Время выполнения одной операции sub
0,000005880
Время выполнения одной операции mul
0,000009240
PM MAIL   Вверх
W4FhLF
Дата 6.7.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Цитата(Joker07 @  6.7.2008,  13:59 Найти цитируемый пост)
Результат выполнения на процессоре Athlon 3000+, Среда - Windows XP


Тут есть несколько ньюансов, которые делают твою задачу в общем случае неразрешимой, по-крайней мере в той постановке, которая здесь имеется.

1. Исходник написан под DOS, а ты его исполняешь под Windows XP. приложения MSDOS в Windows XP исполняются в режиме эмуляции внутри вритуальной машины. Поидее Windows должна эмулировать поведение, но в данном случае я не знаю какие именно данные возвращаются при чтение из портов. 

2. Для современных процессоров такая величина как "время исполнения одной инструкции" в общем-то отсутствует. Наиболее приближённая величина это instruction execution latency(латентность исполнения инструкции), т.е. это кол-во тактов, которое требуется для исполнения всех микроопераций составляющих одну машинную инструкцию. При этом предполагается, что инструкцию и данные находятся в кеше первого уровня, инструкция декодирована(разложена на микрооперации или МОПы) и "в процессоре" нет других инструкций, которые бы потребовали моментального исполнения. 
В общем, данная величина охарактеризовывает время исполнения инструкции в идеальных условиях для одного поколения процессоров. Так вот латентности для инструкций обычно публикваются производителями процессоров в спец. справочниках. 
Для твоего процессора, согласно Software Optimization Guide for AMD64 Processors (с) AMD, инструкции add reg16,reg16 / sub reg16,reg16 выполняются за 1 такт, а инструкция mul reg16 за 4. 

3. Частота таймера на системной плате слишком низка. 

Это сообщение отредактировал(а) W4FhLF - 6.7.2008, 15:20


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Joker07
Дата 6.7.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Да уж smile Но в любом случае прогу надо сдавать, при этом объяснить принцип подсчета этих арифметических операций и как оно реализовано. Поэтому прошу о помощи. 
PM MAIL   Вверх
W4FhLF
Дата 6.7.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Цитата(Joker07 @  6.7.2008,  17:26 Найти цитируемый пост)
Но в любом случае прогу надо сдавать, при этом объяснить принцип подсчета этих арифметических операций и как оно реализовано.


Программа работает неверно, она выдаёт неверные результаты. Более того, задача в текущей постановке сама по себе неверна. В итоге ты получишь неверное представление о предмете изучения, а преподаватель продолжит "учить". 

А что тебе конкретно непонятно в коде выше?

PS Где учишься, если не секрет?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Joker07
Дата 6.7.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Я понимаю работу программы только в общем ключе - программа работает с таймером, используя канал 0, при помощи функции 40h. При помощи 43h записывает данные в порт, используя 40h считывает данные из порта. А что там передается в регистры, т.е. что с чем складывается/вычитается/умножается, как это конкретно по коду происходит (построчно), я не понимаю.
PS Учусь в ДГТУ (г.Ростов-на-Дону).
PPS Прогу уже показывал, про саму работу программы препод отозвался нормально, типа работает. Теперь нужно объяснить ему, но как, я ведь сам толком не понимаю...

Это сообщение отредактировал(а) Joker07 - 6.7.2008, 18:01
PM MAIL   Вверх
MAKCim
Дата 6.7.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Цитата(Joker07 @  6.7.2008,  17:56 Найти цитируемый пост)
А что там передается в регистры, т.е. что с чем складывается/вычитается/умножается, как это конкретно по коду происходит (построчно), я не понимаю.

Код

start:    
    mov ax, data
    mov ds, ax
    mov al, 0

; запись в TCW (Timer Control Word Register) значения, которое определяет 
; команду LTCH_CMD (Сounter Latch Command), т. е фиксацию значения счетчика для последующего чтения через in
    out 43h, al
    nop
    in al, 40h ; читаем байт 0 счетчика для 0-го канала
    nop

    mov ah, al
    in al, 40h ; читаем байт 1 счетчика для 0-го канала
    nop
    xchg al, ah ; получаем 16-ти разрядное значение счетчика для 0-го канала
    push ax


аналогичные действия производятся после выполнения нужной инструкции
в итоге мы получаем 2 значения счетчика: перед и после выполнения инструкции
второе меньше первого, т. к счетчик уменьшается
разность двух значений "определяет время выполнения инструкции"


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Joker07
Дата 6.7.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Спасибо. Но я все еще много чего не понимаю, а именно:
Код

push ax              ; заносим ax в буфер... а зачем?

    mul bx; умножение чего с чем? значение bx умножить на что?

    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx;  вычисление времени на операцию умножения?
    mov dx, 840 ;зачем???
    mul dx ; еще раз умножение, но зачем и чего с чем?
    mov mul_time, ax ; заносим в mul_time время на операцию умножения
nop
nop
nop; зачем стоко пустых операторов?
; 
;
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
; зачем проделывать пишется этот код еще раз? Ведь мы нашли время...
;

    sub ax, bx ; делаем операцию вычитания, время выполнения которой будем считать?

    mov al, 0
    out 43h, al    ;записать данные в порт
    nop
    in al, 40h        ;считует данные из порта
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx
    mov sub_time, ax ; получение времени на операцию вычитания
nop
nop
nop


    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
; аналогично... не пойму зачем писать это


    add ax, bx ; делаем операцию сложения, время выполнения которой будем считать?

    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx        ;умножает dx * al(ax)=ax - это не мой коммент, вообщем зачем?
    mov add_time, ax ; получение времени на операцию вычитания
nop
nop
nop
    lea bx, add_time
    lea si, mess_add        ;вычисление и помещение адреса в si
    mov cx, 3; переменная цикла

PM MAIL   Вверх
MAKCim
Дата 7.7.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Код

push ax              ; сохраняем 16-ти разрядное значение счетчика до выполнения инструкции
    mul bx ; dx:ax = ax * bx
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx ; да
    mov dx, 840 ; перевод в наносекунды (1 тик = 1 / 1193181 с, 1000000 мк = 1 с, 1 тик = 1000000 мк / 1193181 ~ 0.840 мк = 840 нс)
    mul dx ; получение количества наносекунд
    mov mul_time, ax
nop
nop
nop ; возможно выравнивание

    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax

; определяем время выполнения инструкции sub
    sub ax, bx ; да
    mov al, 0
    out 43h, al  
    nop
    in al, 40h       
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx
    mov sub_time, ax
nop
nop
nop
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax

    add ax, bx ; да
    mov al, 0
    out 43h, al
    nop
    in al, 40h
    nop
    mov ah, al
    in al, 40h
    nop
    xchg al, ah
    push ax
    pop dx
    pop ax
    sub ax, dx
    mov dx, 840
    mul dx        
    mov add_time, ax 
nop
nop
nop
    lea bx, add_time
    lea si, mess_add        ;вычисление и помещение адреса в si
    mov cx, 3; переменная цикла



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Joker07
Дата 7.7.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Теперь понятно.  smile  Спасибо большое MAKCim, W4FhLF!!!  smile 

Это сообщение отредактировал(а) Joker07 - 7.7.2008, 14:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.4549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.