Как стать программистом Как устроен компьютер. Что такое программа. Как написать свою программу. И многое другое узнаете вы из этой книги. Получить бесплатно! |
Инструкция 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-коррекция после вычитания.
Подписаться на Дзен-канал
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься». У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение. Подробнее... |