Вывести каждый байт каждого числа в 16-тиричной системе счисления - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, практически недавно начал изучать ассемблер и возникла такая проблема, не могу разобраться в задаче, друзья немного помогли с программой, но все равно нет желаемого результата. Задача такая : Задан массив размером двойное число, вывести каждый байт каждого числа в 16-тиричной системе счисления. Вроде с самой программой все ок, а вот правильно настроить вывод никак не могу, подскажите пожалуйста, что нужно добавить или исправить.
dseg segment
 
a dw 32000,25690,19483,4,5
n dw 5
temp dw 0
dseg ends

cseg segment
 
assume cs:cseg,ds:dseg
 
start:xor di,di
 
again: mov al,byte ptr a[di]
    cbw
mov temp, di
 
 test    ax, ax
  jns     oi1
 
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
 
oi1:  
    xor     cx, cx
    mov     bx, 16 ;
oi2:
    xor     dx,dx
    div     bx
 
    push    dx
    inc     cx
 
    test    ax, ax
    jnz     oi2
 
    mov     ah, 02h
oi3:
    pop     dx

   cmp     dl,9
   jbe     oi4
   add     dl,7
oi4:
    add     dl, '0'
    int     21h
 
    loop    oi3
    
    ret
    
    mov di,temp
    mov al,byte ptr a[di]+1
 
    cbw
    mov temp, di

 test    ax, ax
  jns     oi5
 
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
 
oi5:  
    xor     cx, cx
    mov     bx, 16 
oi6:
    xor     dx,dx
    div     bx
 
    push    dx
    inc     cx
 
    test    ax, ax
    jnz     oi6
 
    mov     ah, 02h
oi7:
    pop     dx
.
 
   cmp     dl,9
   jbe     oi8
   add     dl,7
oi8:
    add     dl, '0'
    int     21h
 
    loop    oi7
    
    ret

mov di,temp
add di,2
cmp di,n
jne again
 
cseg ends
end start

Решение задачи: «Вывести каждый байт каждого числа в 16-тиричной системе счисления»

textual
Листинг программы
.model  small
.aam    macro   power
    db  0D4h, power
    endm
 
.data
a   dw 32000,25690,19483,4,5
a_  label byte
a_size = a_ - a
n   dw 5
temp    dw 0
.code
 
start:  mov ax, @data
    mov ds, ax
    lea si, a
    mov cx, a_size
@@: lodsb
    call    cvt
    call    crlf
    loop    @@
    xor ax, ax
    int 16h
    mov ax, 4c00h
    int 21h
 
cvt:    .aam     16              ; al / 16 -> ah - десятки, al - единицы
    or  ax, 3030h       ; преобразуем в символы ASCII
    call    @0              ; десятки  выводим первыми
@0: xchg    al, ah          ; меняем местами 
    cmp al, 39h         ; если код символа 
    jbe @1              ; больше '9'?
    add al, 7           ; то корректируем его до 'A'-'F'
@1: int 29h         ; выводим на экран
    ret
 
crlf:   mov ax, 0D0Ah   ; перевод строки
    int 29h
    xchg    ah,al
    int 29h
    ret
 
    end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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