Иллюстрированный самоучитель по Assembler


Использование средств 32-разрядных процессоров в программировании - часть 6


mov EBX,3600 ; Коэффициент преобразования в секунды

mul EBX ;Преобразуем часы в секунды в EDX:EAX

mov temp,EAX ;Сохраним часы в temp

mov EAX,min ;Возьмем минуты

mov EBX,60 ;Коэффициент преобразования в секунды

mul EBX ;Преобразуем минуты в секунды в EDX:EAX

add temp,EAX ;Прибавим минуты в temp

mov EAX,sec ;Возьмем секунды

add temp,EAX ;Прибавим секунды в temp

mov EAX,temp ;Число секунд

mov EBX,18 ;Будем умножать на 18

mul EBX ;Умножим на 18

mov time,EAX ;Сохраним в time

xor EDX,EDX ;Подготовимся к делению

mov EAX,temp ;Будем делить число секунд

mov EBX,5 ;Будем делить на 5

div EBX ;Поделим

add time,EAX ;Прибавим к time

xor EDX,EDX ;Подготовимся к делению

mov EAX,temp ;Будем делить число секунд

mov EBX,154 ;Будем делить на 154

div EBX ;Поделим

add time,EAX ;Прибавим к time

;Имитация рабочего цикла программы с опросом флага

...

;Завершим программу, восстановив сначала исходный вектор

...

main endp

new_08 proc

...

new_08 endp

old_08 dd 0

hour dd 13 ;Часы

min dd 45 ;Минуты

sec dd 0 ;Секунды

time dd 0 ;Вычисленное время в тактах таймера

temp dd 0 ;Ячейка для промежуточного результат

flag db 0 ;Флаг наступления заданного времени

msg db "Время наступило!$'

code ends

end main

Рассмотрим некоторые детали приведенного примера.

Три ячейки для хранения заданного времени (часов, минут и секунд) объявлены оператором dd, как двойные слова для упрощения программы и ускорения загрузки этих значений в расширенный регистр ЕАХ. Если бы мы, экономя память, отводимую по данные, объявили бы эти ячейки как байты, то загрузка, например, числа часов в регистр ЕАХ выглядела бы следующим образом:

xor EAX,EAX

mov AL,hour

Для преобразования часов в секунды мы должны число часов умножить на 3600. Оба сомножителя (3600 и максимум 23) представляют собой небольшие числа, которые поместились бы в 16-разрядный регистр. Однако результат может достигнуть величины 82800, которая в регистр АХ уже не поместится. Если бы мы выполнили умножение двух 16-разрядных регистров, например, АХ на ВХ, то результат (по правилам выполнения команды mul) оказался бы в паре регистров DX:AX, и нам пришлось бы эти два числа объединять в одно несколькими операциями переноса и сдвига:




Начало  Назад  Вперед



Книжный магазин