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

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

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

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

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

textual
Листинг программы
printf proc
       push     ax
       push     bx 
       push     cx
       push     dx 
       push     si ;запоминаем используемые регистры
       mov      dx, ax         ;запоминаем число
       mov      bx, offset hex_numbers    ;это для преобразования в символ
       mov      si, offset string_number  ;сюда помещаем символы
       add      si, 3      ;начинаем с конца строки
       mov      cx, 4      ;всего надо 4 раза сдвинуть регистр AX
printf_0:
       mov      ax, dx
       and      ax, 000Fh  ;выделяем 4 младших бита
       xlat                ;преобразуем к символу
       mov      [si], al   ;запоминаем в строке
       dec      si
       shr      dx, 4      ;сдвигаем исходное число
       loop     printf_0
       ;печать числа на экран
       mov      ah, 9
       mov      dx, offset string_number
       int      21h
       pop      si
       pop      dx
       pop      cx 
       pop      bx
       pop      ax
       ret      ;выход из процедуры
printf endp
 
code ends
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
Похожие ответы