Инструкция AAD


Лучшие книги по Ассемблеру Лучшие книги по Ассемблеру

Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее...

Инструкция AAD в Ассемблере подготавливает два BCD-значения для деления. У этой команды нет операндов.

Команда AAD работает согласно следующему алгоритму:

AL = AH * 10 + AL
AH = 0

Флаги ZF, SF и PF изменяются в зависимости от результата выполнения команды. Остальные флаги имеют неопределённое состояние.

Команда AAD преобразует неупакованное двоично-десятичное число, которое находится в регистре АХ. Делается это таким образом, чтобы последующее деление привело к десятичному результату.

Команда AAD может использоваться с любой системой счисления. Машинный код этой команды D5h 0Ah. В этом коде второй байт можно заменить на другое число.

Действие инструкции AAD заключается в том (см. алгоритм выше), что содержимое регистра АН умножается на второй байт команды (по умолчанию это 0Ah) и складывается с содержимым регистра AL. После этого регистр АН обнуляется. Команду AAD можно также использовать для быстрого умножения на число с записью результата в AL.

Пример программы:

  .model  tiny
  .code
  ORG     100h
	
start:	

  MOV AX, 0307h       ;Делимое в BCD-формате
  AAD                 ;AX = 0025h = 37
  MOV BL, 5           ;Делитель
  DIV BL              ;AX = 0207h
  ;37 / 5 = 7 (с остатком 2 в регистре АН)	
  
  RET

  END	start

Здесь мы помещаем в регистр АХ число 37 в BCD-формате. Затем с помощью команды AAD преобразуем его в десятичное число. Далее делим его на 5 и получаем 7 в регистре AL и 2 в регистре АН (остаток от деления).

А теперь об умножении с помощью команды AAD. Для того, чтобы умножить содержимое регистра АН не на 10, как это делается по умолчанию, а на другое число, нам надо перед этим записать в то место памяти, где расположен второй байт команды AAD, другое значение.

Для этого нам надо знать адрес этого байта. Наша программа начинается с адреса DS:100h (значение 100h определено в начале программы директивой ORG). Зная количество команд в программе перед командой AAD и сколько какая команда занимает места в памяти, мы можем вычислить этот адрес. Ну а если говорить об эмуляторе Emu8086, то мы просто можем посмотреть этот адрес в окне отображения памяти (см. видео выше).

А код будет примерно таким:

MOV [BYTE PTR DS:0113h], 2  ;Множитель            
MOV AX, 0300h               ;AH - умножаемое число 
AAD                         ;Теперь AL = 6

Здесь красным выделен адрес второго байта команды AAD. В вашем случае этот адрес, разумеется, может быть другим.

Ну и напоследок о том, как образовалась мнемоника AAD.

AAD - это ASCII Adjust before Division - ASCII-коррекция перед делением.



Первые шаги в программирование Первые шаги в программирование

Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su