Что выполняется в данных строках? - 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. - Завершение процедуры и возврат из нее.