在汇编8086中从十进制转换为二进制时出现输出问题

问题描述 投票:0回答:1

我正在汇编 8086 中编写一段代码,如果你必须输入一个十进制数,它会将其转换为二进制数,但我面临输出问题。从数字 1 到 2559 输出都很好,但是当我输入 2560 时,它输出 0(实际上它打印空行,但值为 0)。
打印出来是这样的:

十进制:2558 - 二进制:1001 1111 1110
十进制:2559 - 二进制:1001 1111 1111
十进制:2560 - 二进制:什么都没有(但值为 0)
十月:2561 - 二进制:1
十月:2562 - 二进制:10
十月:2563 - 二进制: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

我不知道问题出在哪里。我可以做什么来解决这个问题?

assembly binary type-conversion decimal x86-16
1个回答
0
投票
mul bl

您正在使用字节大小乘法来计算 AL 乘以 BL。由于您似乎希望能够处理不再适合一个字节的数字,因此 GT 255,您最好使用 word-sized 乘法。
知道字大小的乘法使用 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
© www.soinside.com 2019 - 2024. All rights reserved.