Вывод на экран содержимого регистра 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

Объяснение кода листинга программы

Список действий в коде:

  1. Устанавливаем сегменты данных и кода в регистры ds и cs соответственно.
  2. Выводим на экран сообщение с содержимым регистра per в 16-ричном виде.
  3. Очищаем стек.
  4. Переходим к циклу, который выводит на экран каждый бит регистра per в шестнадцатеричном виде.
  5. Возвращаемся из процедуры showword.
  6. Завершаем работу программы.

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы