ХАНДЫФАР

Инструкция DAA


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


DAA - Десятичная корректировка регистра AL после сложения.


Корректирует сумму двух упакованных значений BCD для создания упакованного результата BCD. Регистр al является подразумеваемым исходным и целевым операндами. Инструкция daa полезна только тогда, когда она следует за инструкцией add, которая добавляет (двоичное сложение) два 2-значных, упакованных значения BCD и сохраняет результат в байтах в регистре al. Затем инструкция daa корректирует содержимое регистра al таким образом, чтобы оно содержало правильный 2-значный, упакованный результат BCD. Если обнаружен десятичный перенос, флаги CF и AF устанавливаются соответственно.


Флаги CF и AF устанавливаются, если корректировка значения приводит к переносу десятичной дроби в любой цифре результата. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Флаг OF не определён.


Предположим, что регистр al содержит уже упакованное значение (3816), а регистр bl содержит уже упакованное значение (4516). После выполнения инструкции add al, bl а регистр al будет содержать значение (7D16), а не (8316), затем и инструкция daa корректирует результат в регистре al что бы было правильное упакованное значение. Это тоже самое что и 38 + 45 = 83.


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

В качестве примера рассмотрим случай, когда нам нужно выполнить сложение (88 + 74 + 75 + 87). Затем выведем результат сложение на экран.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____al, 88h
  8. ________add_____al, 74h
  9. ________daa
  10. ________adc_____ah, 0
  11. ________add_____al, 75h
  12. ________daa
  13. ________adc_____ah, 0
  14. ________add_____al, 87h
  15. ________daa
  16. ________adc_____ah, 0
  17. ________mov_____bx, ax
  18. ________mov_____ah, 02h
  19. ________mov_____dl, bh
  20. ________or______dl, 30h
  21. ________int_____21h
  22. ________mov_____cl, 4
  23. ________shl_____bx, cl
  24. ________mov_____dl, bh
  25. ________or______dl, 30h
  26. ________int_____21h
  27. ________shr_____bx, cl
  28. ________and_____bl, 0Fh
  29. ________mov_____dl, bl
  30. ________or______dl, 30h
  31. ________int_____21h
  32. ________mov_____ax, 4C00h
  33. ________int_____21h
  34. ____main endp
  35. code ends
  36. end main

Инструкция DAA


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


DAA - Десятичная корректировка регистра AL после сложения.


Корректирует сумму двух упакованных значений BCD для создания упакованного результата BCD. Регистр al является подразумеваемым исходным и целевым операндами. Инструкция daa полезна только тогда, когда она следует за инструкцией add, которая добавляет (двоичное сложение) два 2-значных, упакованных значения BCD и сохраняет результат в байтах в регистре al. Затем инструкция daa корректирует содержимое регистра al таким образом, чтобы оно содержало правильный 2-значный, упакованный результат BCD. Если обнаружен десятичный перенос, флаги CF и AF устанавливаются соответственно.


Флаги CF и AF устанавливаются, если корректировка значения приводит к переносу десятичной дроби в любой цифре результата. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Флаг OF не определён.


Предположим, что регистр al содержит уже упакованное значение (3816), а регистр bl содержит уже упакованное значение (4516). После выполнения инструкции add al, bl а регистр al будет содержать значение (7D16), а не (8316), затем и инструкция daa корректирует результат в регистре al что бы было правильное упакованное значение. Это тоже самое что и 38 + 45 = 83.


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

В качестве примера рассмотрим случай, когда нам нужно выполнить сложение (88 + 74 + 75 + 87). Затем выведем результат сложение на экран.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____al, 88h____; Копируем упакованное значение 88 в регистр al
  8. ________add_____al, 74h____; К регистру al прибавляем упакованное значение 74
  9. ________daa________________; Выполняем корректировку содержимого регистра al
  10. ________adc_____ah, 0______; Выполняем сложение с переносом ah + 0
  11. ________add_____al, 75h____; К регистру al прибавляем упакованное значение 75
  12. ________daa________________; Выполняем корректировку содержимого регистра al
  13. ________adc_____ah, 0______; Выполняем сложение с переносом ah + 0
  14. ________add_____al, 87h____; К регистру al прибавляем упакованное значение 87
  15. ________daa________________; Выполняем корректировку содержимого регистра al
  16. ________adc_____ah, 0______; Выполняем сложение с переносом ah + 0
  17. ________mov_____bx, ax_____; Копируем значение регистра ax в регистр bx
  18. ________mov_____ah, 02h____; Копируем значение функции вывода на консоль в регистр ah
  19. ________mov_____dl, bh_____; Копируем число из регистра bh в регистр dl
  20. ________or______dl, 30h____; Выполняем преобразование значения в регистре dl в ASCII число
  21. ________int_____21h________; Вызываем прерывание DOS
  22. ________mov_____cl, 4______; Копируем число 4 в регистр cl
  23. ________shl_____bx, cl_____; Сдвигаем биты влево в bx на количество указанное в cl
  24. ________mov_____dl, bh_____; Копируем число из регистра bh в регистр dl
  25. ________or______dl, 30h____; Выполняем преобразование значения в регистре dl в ASCII число
  26. ________int_____21h________; Вызываем прерывание DOS
  27. ________shr_____bx, cl_____; Сдвигаем биты вправо в bx на количество указанное в cl
  28. ________and_____bl, 0Fh____; Обнуляем старший полубайт регистра bl
  29. ________mov_____dl, bl_____; Копируем число из регистра bl в регистр dl
  30. ________or______dl, 30h____; Выполняем преобразование значения в регистре dl в ASCII число
  31. ________int_____21h________; Вызываем прерывание DOS
  32. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  33. ________int_____21h _______; Вызываем прерывание DOS
  34. ____main endp _____________; Конец процедуры main
  35. code ends _________________; Конец сегмента кода
  36. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda