Завершим программу, восстановив сначала исходный
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, и нам пришлось бы эти два числа объединять в одно несколькими операциями переноса и сдвига:
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий