Вывод на экран содержимого регистра 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.
- Завершаем работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д