- •Лабораторная работа №1. Использование арифметических и логических команд процессора при составлении программ на языке ассемблера
- •2.1.2 Команды вычитания
- •2.1.3 Использование команд neg и cmp
- •2.1.4 Умножение и деление беззнаковых чисел
- •Программа 2.2. Muldiv.Asm
- •2.1.5 Умножение и деление знаковых значений
- •2.2 Логические команды процессора
- •2.2.1 Логические операторы
- •2.2.2 Сдвиги битов
2.1.3 Использование команд neg и cmp
При выполнении команды neg процессор вычитает соответствующее значение из 0. Это значение может быть записано в регистр или память. При вычитании значения из 0 получается дополнительный код числа, что эквивалентно изменению всех нулей на единицы, единиц на нули и прибавлением 1.
neg ax ; Получение двоичного дополнения ax
neg [value] ; Получение двоичного дополнения [value]
Большинство цифровых процессоров выполняют сравнение значений путем вычитания одного из другого, проверяя затем результат. После выполнения таким способом операции сравнения устанавливаются биты различных флагов. Описывая тем самым результат. Сmp выполняет вычитание аналогично команде sub, однако сохраняет при этом только значения флагов, которые могут проверяться другими командами.
2.1.4 Умножение и деление беззнаковых чисел
Для правильного умножения и деления требуется помещать значения в соответствующие регистры. После операции необходимо правильно извлекать ответ. Для наглядности, запустите программу 2.2 в Turbo Debuger и понаблюдайте за работой команд mul, imul, div и idiv. Для ассемблирования, компоновки программы и загрузки в Turbo Debuger выполните следующие команды:
Программа 2.2. Muldiv.Asm
-
%TITLE
«Использование
команд mul,
div, imul, idiv»
IDEAL
MODEL
small
STACK
256
DATASEG
exCode
DB
0
opByte
DB
8
opWord
DW
100
sourceB
DB
64
sourceW
DW
4000
CODESEG
Start:
mov
ax, @data
;Установить DOS адрес
mov
ds, ax
; сегмента данных
mov
al, [opByte]
mul
[sourcB]
;axal*[sourceb]
mov
ax, [opword]
mul
[sourceW]
; ax, dxax*[sourceW]
mov
ax, [opWord]
mul
ax
;ax, dxax*ax
mov
ax, [opWord]
div
[sourceB]
;alax div [sourceB]
mov
ax, [opWord]
mov
dx,[opWord]
div
[sourceW]
;axax, dx div [sourceW]
Exit:
mov
ah, 04Ch
;Ф-ция DOS/ Выход из ;программы
mov
al, [exCode]
;Возврат значения кода ;ошибки
int
21h
;Вызов DOS. Останов ;программы
END
Start
;Конец программы/точка ;выхода
При выполнении беззнакового умножения и деления необходимо использовать определенные регистры и иметь ввиду, что 32-битовый результат и операнды записываются в два регистра—dx и ax. Операнд-источник для команды mul и div может располагаться в памяти либо в любом другом регистре общего назначения. Так как размер операнда-источника определяет размер результата, то случайное перемножение вместо байтовых переменных, переменных длиной в слово вызовет изменение регистра dx.
