Вывод на экран содержимого регистра bx в 16-ричном виде - Assembler
Формулировка задачи:
Добрый вечер всем. Имеется код подсчета двоичных нулей в переменной размером двойное слово. Не могу вывести на экран количество нулей, хранящихся в регистре bx. Вывести нужно в 16-тиричном виде. Пробовала статейку (Ввод и вывод чисел в различных системах счисления) - результата нет. Заранее спасибо за помощь и пояснения.
.model small
.stack 100h
.data
mes1 DB 'Zadannoe 4islo:', 13, 10, '$'
mes2 DB '', 13, 10, '$'
mes3 DB 'Kolichestvo nylei:', 13, 10, '$'
PER dd 1110101000100010b
KOL equ 1
.code
Start:
MOV AX, @DATA
MOV DS, AX
xor AX, AX
xor BX, BX
mov AH, 09h ; выводить
mov DX, OFFSET mes1 ; сообщение
int 21h ; на экран
lea si,PER ; загружаем в si адрес нашего двоичного числа
mov cx, KOL ; пересылаем в регистр cx количество элементов
call ShowArray ; вызов процедуры вывода на экран
mov dx,[si] ; пересылаем в dx значение элемента
mov cx,16 ; пересылаем в cx количество битов в элементах
met: rcl dx,1
JNC met_1
met_2: loop met
mov AH, 09h ; выводить
mov DX, OFFSET mes2 ; сообщение
int 21h ; на экран
mov DX, OFFSET mes2
int 21h
mov DX, OFFSET mes3
int 21h
JMP met_3
met_1: inc bl
JMP met_2
met_3:
mov AX, 4C00h
int 21h
ShowArray proc
@@for:
mov ax, [si] ; пересылаем в регистр ax, значение массива
call ShowWord ; вызов процедуры
mov al, ' ' ; пробел между элементами
int 29h ;
add si, 2 ; +
loop @@for ; вычитает единицу из CX, если больше нуля то
; переход на указанную метку
ret ; вернуться из подпрограммы
ShowArray endp
;--------------------
ShowWord proc
push ax ; загружаем ax в стек (значение в ячейку памяти)
push dx ; загружаем dx в стек
push cx ; загружаем cx в стек
mov cx,16 ; пересылаем в cx, количество битов
mov dx, ax ; пересылаем в регистр dx
@@ForEachBit:
mov al, '0' ; пересылка в al, символьную строку
shl dx, 1 ; сдвиг dx влево, кол-во сдвигов
adc al, 0 ; сложение двух операндов, прибавляя к ним значение cx
int 29h
loop @@ForEachBit ; переход к метке, если больше 0
pop cx ; выгружаем cx из стека
pop dx ; выгружаем dx из стека
pop ax ; выгружаем ax из стека
ret ; вернуться из подпрограммы
ShowWord endp
END StartРешение задачи: «Вывод на экран содержимого регистра bx в 16-ричном виде»
textual
Листинг программы
.model small .386 .data mes1 db 'zadannoe 4islo: $' mes2 db 13,10,'$' mes3 db 'kolichestvo nylei: $' per dw 1001010000010100b .stack db 255 dup(?) .code start: mov ax,@data mov ds,ax mov ah,09h lea dx,mes1 int 21h mov dx,per call showword xor ax,ax mov cx,16 met: shl dx,1 jc met1 inc al met1: loop met push ax mov ah,09h lea dx,mes2 int 21h mov ah,09h lea dx,mes3 int 21h pop ax mov bx,16 xor cx,cx get: xor dx,dx div bx push dx inc cx or ax,ax jnz get cmp cx,1 jne big mov ah,02h mov dl,'0' int 21h big: mov ah,02h print: pop dx cmp dl,09h jbe skip add dl,7 skip: add dl,30h int 21h loop print mov ah,02h mov dl,'h' int 21h mov ah,4Ch mov al,00h int 21h showword proc push ax push dx push cx mov cx,16 foreachbit: mov al,'0' shl dx,1 adc al,0 int 29h loop foreachbit pop cx pop dx pop ax ret showword endp end start
Объяснение кода листинга программы
Список действий в коде:
- Устанавливаем сегменты данных и кода в регистры ds и cs соответственно.
- Выводим на экран сообщение с содержимым регистра per в 16-ричном виде.
- Очищаем стек.
- Переходим к циклу, который выводит на экран каждый бит регистра per в шестнадцатеричном виде.
- Возвращаемся из процедуры showword.
- Завершаем работу программы.