Что выполняется в данных строках? - Assembler

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. printf proc
  2. push ax bx cx dx si ;запоминаем используемые регистры
  3. mov dx, ax ;запоминаем число
  4. mov bx, offset hex_numbers ;это для преобразования в символ
  5. mov si, offset string_number ;сюда помещаем символы
  6. add si, 3 ;начинаем с конца строки
  7. mov cx, 4 ;всего надо 4 раза сдвинуть регистр AX
  8. printf_0:
  9. mov ax, dx
  10. and ax, 000Fh ;выделяем 4 младших бита
  11. xlat ;преобразуем к символу
  12. mov [si], al ;запоминаем в строке
  13. dec si
  14. shr dx, 4 ;сдвигаем исходное число
  15. loop printf_0
  16. ;печать числа на экран
  17. mov ah, 9
  18. mov dx, offset string_number
  19. int 21h
  20. pop si dx cx bx ax
  21. ret ;выход из процедуры
  22. printf endp
Это процедура вывода. Что конкретно происходит в строках 16-21?

Решение задачи: «Что выполняется в данных строках?»

textual
Листинг программы
  1. printf proc
  2.        push     ax
  3.        push     bx
  4.        push     cx
  5.        push     dx
  6.        push     si ;запоминаем используемые регистры
  7.        mov      dx, ax         ;запоминаем число
  8.        mov      bx, offset hex_numbers    ;это для преобразования в символ
  9.        mov      si, offset string_number  ;сюда помещаем символы
  10.        add      si, 3      ;начинаем с конца строки
  11.        mov      cx, 4      ;всего надо 4 раза сдвинуть регистр AX
  12. printf_0:
  13.        mov      ax, dx
  14.        and      ax, 000Fh  ;выделяем 4 младших бита
  15.        xlat                ;преобразуем к символу
  16.        mov      [si], al   ;запоминаем в строке
  17.        dec      si
  18.        shr      dx, 4      ;сдвигаем исходное число
  19.        loop     printf_0
  20.        ;печать числа на экран
  21.        mov      ah, 9
  22.        mov      dx, offset string_number
  23.        int      21h
  24.        pop      si
  25.        pop      dx
  26.        pop      cx
  27.        pop      bx
  28.        pop      ax
  29.        ret      ;выход из процедуры
  30. printf endp
  31.  
  32. code ends
  33. end start

Объяснение кода листинга программы

  1. Объявление процедуры printf.
  2. Сохранение значений регистров в стеке: ax, bx, cx, dx, si.
  3. Копирование значения из регистра ax в регистр dx.
  4. Загрузка адреса массива hex_numbers в регистр bx.
  5. Загрузка адреса массива string_number в регистр si.
  6. Смещение указателя si на 3 байта относительно его текущего адреса.
  7. Установка значения 4 в регистр cx.
  8. Начало цикла printf_0. а. Копирование значения из регистра dx в регистр ax. б. Логическое И для регистра ax с 000Fh, чтобы получить 4 младших бита. в. Преобразование символа с помощью инструкции xlat. г. Сохранение значения регистра al по адресу, на который указывает si. д. Уменьшение указателя si. е. Сдвиг значения в регистре dx на 4 бита вправо. ж. Проверка условия цикла printf_0 (пока регистр cx не равен 0).
  9. Вывод строки string_number на экран.
  10. Восстановление значений регистров из стека: si, dx, cx, bx, ax.
  11. Завершение процедуры и возврат из нее.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.444 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы