Инструкция AAS


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

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

Инструкция AAS в Ассемблере исправляет BCD-значение после вычитания. Синтаксис:

AAS

Команда AAS не имеет операндов.

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

Алгоритм работы команды AAS:

  • Если младшие четыре бита регистра AL > 9 или флаг AF = 1, то
    • AL = AL - 6
    • AH = AH - 1
    • AF = 1
    • CF = 1
  • Иначе
    • AF = 0
    • CF = 0
  • В любом случае очистить старшие четыре бита регистра AL

Команда AAS используется после выполнения команд SUB и SBB, с помощью которых одно неупакованное десятичное число вычитается из второго числа, а результат операции помещается в регистр AL.

Команда AAS исправляет итог вычитания таким образом, что значение в регистре AL всегда будет соответствовать представлению чисел в формате ASCII (и BCD).

Исправление разности с помощью инструкции AAS требуется только в том случае, когда результатом является отрицательное число. Ниже в примере мы из числа 1 вычитаем число 7, а затем выполняем ASCII-коррекцию с помощью команды AAS.

  .model  tiny
  .code
  ORG     100h
	
start:	

  MOV AH, 0       
  MOV AL, 1
  SUB AL, 7  ;AH = 00, AL = FA = (1-7)
  AAS        ;AH = FF, AL = 04 = (1-7)+10  
  
  RET

  END	start

После выполнения команды SUB в регистре AX находится значение 00FAh. поскольку в регистре AL находится отрицательное значение (1-7 = -6 = FAh).

Так как FAh > 9 (знак при сравнении в данном случае не учитывается), то при выполнении команды AAS было выполнено вычитание числа 6 из регистра AL, вычитание числа 1 из регистра АН, и установлены флаги переноса CF и полупереноса AF.

В итоге в регистре АН получилось довольно странное число: FF04h, которое вроде как должно быть равным -6. Давайте подумаем, как образовалось это значение.

Из регистра АН, который был равен 0, мы вычли 1. То есть число FF в регистре АН вполне объяснимо. А вот с регистром AL будет более запутано.

Итак, после выполнения команды SUB там находится число -6 (FAh). Команда AAS в данном случае должна отнять от этого значения число 6, то есть:

-6 - 6 = -12 = F4h

Но команда AAS в любом случае обнуляет старшие четыре бита регистра AL, поэтому у нас в этом регистре число 04, а в регистре АХ, соответственно, число FF04h.

То есть результат (-6) дополняется до десяти (-6+10 = 4).

Ну или если так будет понятнее, то (без учёта старших четырёх битов регистра AL):

10 - 6 = 4 или Ah - 6 = 4

Да, немного странно. Но если вам надо будет использовать дальше этот результат, например, вывести полученное число на дисплей, то можно поступить, например, так:

MOV BL, 10 SUB BL, AL ;BL = 6

Напоследок, как всегда, о происхождении аббревиатуры AAS.

AAS - это ASCII Adjust After Subtraction - ASCII-коррекция после вычитания.



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

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

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