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