ХАНДЫФАР

Инструкция AAD


Корректировка регистра AX перед делением


AAD - Корректировка регистра AX перед делением

AAD imm8 - Корректировка регистр AX перед делением на числовое основание imm8


Корректирует две распакованные цифры BCD (наименее значимую цифру в регистре al и наиболее значимую цифру в регистре ah) таким образом, чтобы операция деления, выполненная над результатом, давала правильное распакованное значение BCD. Инструкция aad полезна только тогда, когда она предшествует инструкции div, которая делит (двоичное деление) скорректированное значение в регистре ax на распакованное значение BCD.


Инструкция aad устанавливает значение в регистре al равным (al + (10 * ah)), а затем очищает регистр ah до 00h. Значение в регистре ax тогда равно двоичному эквиваленту исходного распакованного двузначного числа (основание 10) в регистрах ah и al.


Обобщённая версия этой инструкции позволяет корректировать две неупакованные цифры любой числовой базы, устанавливая байт imm8 в выбранную числовую базу (например, 08h для восьмеричной системы счисления, 0Ah для десятичной системы счисления или 0Ch для чисел с основанием 12). Мнемоника aad интерпретируется всеми ассемблерами как означающая корректировку значений ASCII (база 10). Чтобы скорректировать значения в другой базе чисел, инструкция должна быть закодирована вручную машинным кодом (D5 imm8).


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


Предположим, что регистр ax содержит (010716), регистр bl содержит 210, (0216). После выполнения aad регистр al будет содержать 1710, (1116), число 17 в шестнадцатеричном формате. Затем выполняется инструкция div которая выполняет деление значения в регистре al на значение в регистре bl. В результате регистр ax содержит 010816. В регистре al сохраняется частное от деления, а в регистре ah - остаток. 17 / 2 = 8, остаток - 1.


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

В качестве примера рассмотрим случай, когда нам нужно поделить (53 / 3 / 2). Затем выведем результат деления на экран. Можете самостоятельно вывести остаток, который находится в регистре dx на экран.

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

Инструкция AAD


Корректировка регистра AX перед делением


___________AAD - Корректировка регистра AX перед делением

___________AAD imm8 - Корректировка регистр AX перед делением на числовое основание imm8


Корректирует две распакованные цифры BCD (наименее значимую цифру в регистре al и наиболее значимую цифру в регистре ah) таким образом, чтобы операция деления, выполненная над результатом, давала правильное распакованное значение BCD. Инструкция aad полезна только тогда, когда она предшествует инструкции div, которая делит (двоичное деление) скорректированное значение в регистре ax на распакованное значение BCD.


Инструкция aad устанавливает значение в регистре al равным (al + (10 * ah)), а затем очищает регистр ah до 00h. Значение в регистре ax тогда равно двоичному эквиваленту исходного распакованного двузначного числа (основание 10) в регистрах ah и al.


Обобщённая версия этой инструкции позволяет корректировать две неупакованные цифры любой числовой базы, устанавливая байт imm8 в выбранную числовую базу (например, 08h для восьмеричной системы счисления, 0Ah для десятичной системы счисления или 0Ch для чисел с основанием 12). Мнемоника aad интерпретируется всеми ассемблерами как означающая корректировку значений ASCII (база 10). Чтобы скорректировать значения в другой базе чисел, инструкция должна быть закодирована вручную машинным кодом (D5 imm8).


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


Предположим, что регистр ax содержит (010716), регистр bl содержит 210, (0216). После выполнения aad регистр al будет содержать 1710, (1116), число 17 в шестнадцатеричном формате. Затем выполняется инструкция div которая выполняет деление значения в регистре al на значение в регистре bl. В результате регистр ax содержит 010816. В регистре al сохраняется частное от деления, а в регистре ah - остаток. 17 / 2 = 8, остаток - 1.


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

В качестве примера рассмотрим случай, когда нам нужно поделить (53 / 3 / 2). Затем выведем результат деления на экран. Можете самостоятельно вывести остаток, который находится в регистре dx на экран.

  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. ________mov_____bx, 3______; Копируем значение 3 в регистр bx
  9. ________aad________________; Выполняем корректировку содержимого регистра ax
  10. ________xor_____dx, dx_____; Обнуляем значение регистра dx
  11. ________div_____bx_________; Выполняем деление регистра ax на регистр bx
  12. ________mov_____bx, 2______; Копируем значение 2 в регистр bx
  13. ________aad________________; Выполняем корректировку содержимого регистра ax
  14. ________xor_____dx, dx_____; Обнуляем значение регистра dx
  15. ________div_____bx_________; Выполняем деление регистра ax на регистр bx
  16. ________or______al, 30h____; Выполняем преобразование значения в регистре al в ASCII число
  17. ________mov_____ah, 02h____; Копируем значение функции вывода на консоль в регистр ah
  18. ________mov_____dl, al_____; Копируем ASCII-число из регистра al в регистр dl
  19. ________int_____21h________; Вызываем прерывание DOS
  20. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  21. ________int_____21h _______; Вызываем прерывание DOS
  22. ____main endp _____________; Конец процедуры main
  23. code ends _________________; Конец сегмента кода
  24. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda