assembly 汇编8086中十进制转换为二进制时的输出问题

sy5wg1nm  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(109)

我在汇编8086中写了一段代码,你必须输入一个十进制数,它将其转换为二进制数,但我面临着输出问题。从1到2559的输出都很好,但是当我输入2560时,它输出0(实际上它打印了空行,但是值是0)。
它打印如下:
dec:2558 - binary:1001 1111 1110
dec:2559 - binary:1001 1111 1111
dec:2560 - binary:nothing(但值为0)
dec:2561 - binary:1
dec:2562 - binary:10
dec:2563 - binary:11
代码如下:

.model small
.stack 100h
.data
    message1 db "Enter a decimal number: $"
    message2 db "Binary number: $"
    message3 db "Success!", 10, 13,'$'
    new_line db 10,13,'$'
    number dw 0
.code
    mov ax, @data
    mov ds, ax
    
    mov ah, 9
    lea dx, message1
    int 21h
    
    mov bl, 10
    
    input:
        mov dx, 0
        mov ah, 1
        int 21h
        
        cmp al, 13
        je next
        
        sub al, 48
        mov ah, 0
        
        mov dx, ax
        mov ax, number
        mul bl
        
        add ax, dx
        
        mov number, ax
        
        jmp input
    next:
        mov ah, 9
        lea dx, new_line
        int 21h
    
        mov ax, number
        mov cx, 0
        mov dx, 0
    converting:
        cmp ax, 0
        je msg
        
        mov bx, 2
        div bx
        push dx
        inc cx
        mov dx, 0
        jmp converting
    msg:
        mov ah, 9
        lea dx, message2
        int 21h
    printing:
        cmp cx, 0
        je the_end
        
        pop dx
        add dx, 48
        
        mov ah, 2
        int 21h
        dec cx
        jmp printing
        
    the_end:
        mov ah, 9
        lea dx, new_line
        int 21h

        mov ah, 9
        lea dx, message3
        int 21h
    
    mov ah, 4Ch
    int 21h
end

我不知道问题出在哪里。如何解决此问题?

i34xakig

i34xakig1#

mul bl

您正在使用字节大小的乘法来计算AL乘以BL。由于您似乎希望能够处理不再适合一个字节的数字,因此GT 255,您最好使用单词大小的乘法。
知道单词大小的乘法使用DX:AX作为其目的地,需要重新组织代码:

input:
    mov  ah, 01h   ; DOS.GetCharacter
    int  21h       ; -> AL
    cmp  al, 13
    je   next
    sub  al, 48    ; Convert from ["0","9"] to [0,9]
    cbw            ; -> AX holds the new digit
    mov  bx, 10
    xchg bx, ax    ; -> AX is 10, BX holds the new digit
    mul  number    ; Your assembler knows this is a word-sized multiplication
    add  ax, bx    ; Number * 10 + NewDigit
    mov  number, ax
    jmp  input
next:
mov bx, 2
div bx
  • 转换为二进制不应该使用实际的除以2*。只需将数字向右移动,然后将SHR的进位添加到字符'0'。如果CF=0,字符将保持为'0',如果CF=1,字符将变为'1'。

如果数字是零,你仍然希望显示一个单一的'0'数字,而不是留下一个空行,我相信这是更混乱。

mov  ax, number
    xor  cx, cx    ; Number of binary digits [1,16]
converting:
    inc  cx
    mov  dx, '0'
    shr  ax, 1     ; -> CF
    adc  dx, 0
    push dx        ; (*)
    test ax, ax
    jnz  converting

然后打印转换为下一个更简单的代码:

printing:
    pop  dx        ; (*)
    mov  ah, 02h   ; DOS.PrintCharacter
    int  21h
    loop printing

相关问题