ХАНДЫФАР

Инструкция AAM


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


AAM - Корректировка регистра AX после умножения

AAM imm8 - Корректировка регистр AX после умножением на числовое основание imm8


Корректирует результат умножения двух распакованных значений BCD для создания пары распакованных значений BCD (база 10). Регистр ax является подразумеваемым исходным и целевым операндом для этой инструкции. Инструкция aam полезна только тогда, когда она следует за инструкцией mul, которая умножает два распакованных значения BCD и сохраняет результат слова в регистре ax. Затем инструкция aam корректирует содержимое регистра ax таким образом, чтобы оно содержало правильный 2-значный результат распакованного значения (база 10) BCD.


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


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


Предположим, что регистр al содержит 1310, (0D16), регистр bl содержит 210, (0216). После выполнения mul bl регистр al будет содержать 2610, (1A16). Затем выполняется инструкция aam которая выполняет корректировку регистра al. В результате регистр ax содержит 020616. 13 * 2 = 26.


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

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

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

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

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

Инструкция AAM


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


__________AAM - Корректировка регистра AX после умножения

__________AAM imm8 - Корректировка регистр AX после умножением на числовое основание imm8


Корректирует результат умножения двух распакованных значений BCD для создания пары распакованных значений BCD (база 10). Регистр ax является подразумеваемым исходным и целевым операндом для этой инструкции. Инструкция aam полезна только тогда, когда она следует за инструкцией mul, которая умножает два распакованных значения BCD и сохраняет результат слова в регистре ax. Затем инструкция aam корректирует содержимое регистра ax таким образом, чтобы оно содержало правильный 2-значный результат распакованного значения (база 10) BCD.


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


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


Предположим, что регистр al содержит 1310, (0D16), регистр bl содержит 210, (0216). После выполнения mul bl регистр al будет содержать 2610, (1A16). Затем выполняется инструкция aam которая выполняет корректировку регистра al. В результате регистр ax содержит 020616. 13 * 2 = 26.


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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____al, 3______; Копируем значение 3 в регистр al
  8. ________mov_____bl, 4______; Копируем значение 4 в регистр bl
  9. ________mul_____bl_________; Выполняем умножение регистра ax на регистр bl
  10. ________mov_____bl, 2______; Копируем значение 2 в регистр bl
  11. ________mul_____bl_________; Выполняем умножение регистра ax на регистр bl
  12. ________aam________________; Выполняем корректировку содержимого регистра al
  13. ________mov_____bx, ax_____; Сохраняем значение регистра ax в регистре bx
  14. ________or______bx, 3030h__; Выполняем преобразование значения в регистре bx в ASCII число
  15. ________mov_____ah, 02h____; Копируем значение функции вывода на консоль в регистр ah
  16. ________mov_____dl, bh_____; Копируем ASCII-число из регистра bh в регистр dl
  17. ________int_____21h________; Вызываем прерывание DOS
  18. ________mov_____dl, bl_____; Копируем ASCII-число из регистра bl в регистр 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

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

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