ХАНДЫФАР

Инструкция AAS


Корректировка регистра AL после вычитания


AAS - Корректировка регистра AL после вычитания


Корректирует результат вычитания двух распакованных значений BCD для создания распакованного результата BCD. Регистр al является подразумеваемым исходным и целевым операндом для этой инструкции. Инструкция aas полезна только тогда, когда она следует за инструкцией sub, которая вычитает одно распакованное значение BCD из другого и сохраняет результат в байтах в регистре al. Затем инструкция aaa корректирует содержимое регистра al таким образом, чтобы оно содержало правильный 1-значный результат распаковки BCD.


Если в результате вычитания был получен десятичный перенос, регистр ah уменьшается на 1, и устанавливаются флаги CF и AF. Если десятичный перенос не произошёл, флаги CF и AF снимаются, а регистр ah остаётся неизменным. В любом случае регистр al остаётся с четырьмя верхними битами, установленными в 0.


Флаги AF и CF устанавливаются равными 1, если имеется десятичное значение; в противном случае они сбрасываются до 0. Флаги OF, SF, ZF и PF не определены.


Предположим, что регистр ax содержит распакованное значение 1410, (010416). После выполнения sub al, 5 регистр ax (01FE16), число 51010. После корректировки содержимого регистра al, значение регистра ax будет (000916). 14 - 5 = 9.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____ax, 0104h
  8. ________sub_____al, 5
  9. ________aas
  10. ________mov_____ax, 4C00h
  11. ________int_____21h
  12. ____main endp
  13. code ends
  14. end main

В качестве примера рассмотрим случай, когда нам нужно вычесть (53 - 6 - 9). Затем выведем результат вычитания на экран.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____ax, 0503h
  8. ________sub_____al, 6
  9. ________aas
  10. ________sub_____al, 9
  11. ________aas
  12. ________mov_____bx, ax
  13. ________or______bx, 3030h
  14. ________mov_____ah, 02h
  15. ________mov_____dl, bh
  16. ________int_____21h
  17. ________mov_____dl, bl
  18. ________int_____21h
  19. ________mov_____ax, 4C00h
  20. ________int_____21h
  21. ____main endp
  22. code ends
  23. end main

Инструкция AAS


Корректировка регистра AL после вычитания


AAS - Корректировка регистра AL после вычитания


Корректирует результат вычитания двух распакованных значений BCD для создания распакованного результата BCD. Регистр al является подразумеваемым исходным и целевым операндом для этой инструкции. Инструкция aas полезна только тогда, когда она следует за инструкцией sub, которая вычитает одно распакованное значение BCD из другого и сохраняет результат в байтах в регистре al. Затем инструкция aaa корректирует содержимое регистра al таким образом, чтобы оно содержало правильный 1-значный результат распаковки BCD.


Если в результате вычитания был получен десятичный перенос, регистр ah уменьшается на 1, и устанавливаются флаги CF и AF. Если десятичный перенос не произошёл, флаги CF и AF снимаются, а регистр ah остаётся неизменным. В любом случае регистр al остаётся с четырьмя верхними битами, установленными в 0.


Флаги AF и CF устанавливаются равными 1, если имеется десятичное значение; в противном случае они сбрасываются до 0. Флаги OF, SF, ZF и PF не определены.


Предположим, что регистр ax содержит распакованное значение 1410, (010416). После выполнения sub al, 5 регистр ax (01FE16), число 51010. После корректировки содержимого регистра al, значение регистра ax будет (000916). 14 - 5 = 9.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____ax, 0104h__; Копируем распакованное значение 14 в регистр ax
  8. ________sub_____al, 5______; Из регистра al вычитаем значение 5
  9. ________aas________________; Выполняем корректировку содержимого регистра al
  10. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  11. ________int_____21h _______; Вызываем прерывание DOS
  12. ____main endp _____________; Конец процедуры main
  13. code ends _________________; Конец сегмента кода
  14. end main __________________; Конец файла. Точкой входа указывается процедура main

В качестве примера рассмотрим случай, когда нам нужно вычесть (53 - 6 - 9). Затем выведем результат вычитания на экран.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____ax, 0503h__; Копируем распакованное значение 53 в регистр ax
  8. ________sub_____al, 6______; Из регистра al вычитаем значение 6
  9. ________aas________________; Выполняем корректировку содержимого регистра al
  10. ________sub_____al, 9______; Из регистра al вычитаем значение 9
  11. ________aas________________; Выполняем корректировку содержимого регистра al
  12. ________mov_____bx, ax_____; Сохраняем значение регистра ax в регистре bx
  13. ________or______bx, 3030h__; Выполняем преобразование значения в регистре bx в ASCII число
  14. ________mov_____ah, 02h____; Копируем значение функции вывода на консоль в регистр ah
  15. ________mov_____dl, bh_____; Копируем ASCII-число из регистра bh в регистр dl
  16. ________int_____21h________; Вызываем прерывание DOS
  17. ________mov_____dl, bl_____; Копируем ASCII-число из регистра bl в регистр dl
  18. ________int_____21h________; Вызываем прерывание DOS
  19. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  20. ________int_____21h _______; Вызываем прерывание DOS
  21. ____main endp _____________; Конец процедуры main
  22. code ends _________________; Конец сегмента кода
  23. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda