Что выполняется в данных строках? - 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
Решение задачи: «Что выполняется в данных строках?»
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
Объяснение кода листинга программы
- Объявление процедуры
printf
. - Сохранение значений регистров в стеке:
ax
,bx
,cx
,dx
,si
. - Копирование значения из регистра
ax
в регистрdx
. - Загрузка адреса массива
hex_numbers
в регистрbx
. - Загрузка адреса массива
string_number
в регистрsi
. - Смещение указателя
si
на 3 байта относительно его текущего адреса. - Установка значения 4 в регистр
cx
. - Начало цикла
printf_0
. а. Копирование значения из регистраdx
в регистрax
. б. Логическое И для регистраax
с 000Fh, чтобы получить 4 младших бита. в. Преобразование символа с помощью инструкцииxlat
. г. Сохранение значения регистраal
по адресу, на который указываетsi
. д. Уменьшение указателяsi
. е. Сдвиг значения в регистреdx
на 4 бита вправо. ж. Проверка условия циклаprintf_0
(пока регистрcx
не равен 0). - Вывод строки
string_number
на экран. - Восстановление значений регистров из стека:
si
,dx
,cx
,bx
,ax
. - Завершение процедуры и возврат из нее.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д