汇编语言要求两数相加,分别输出二进制十进制十六进制的结果。bug求解

我的程序十进制结果正确,二进制与十六进制的结果高位会多出一个6,求解

img

img

;问题1,二进制和十六进制输出会奇怪的多出一个6
data segment
    inf1 db 0dh,0ah,"input the first one",0dh,0ah,'$'
    inf2 db "input the second one",0dh,0ah,'$'
    crlf db 0ah,0dh,'$';回车换行

    menu db "1 print binary",0dh,0ah
         db "2 print decimal",0dh,0ah
         db "3 print hex",0dh,0ah
         db "4 exit",0dh,0ah,'$'

data ends

code segment
    assume cs:code,ds:data,es:data
start:
    mov ax,data
    mov ds,ax
    mov dx, offset inf1;输入操作数1
    mov ah,9
    int 21H


    mov ah,1
    int 21H
    mov bh,al;将操作数1移到bh中
    mov dx,offset crlf
    mov ah,9
    int 21H

    mov dx,offset inf2;输入操作数2
    mov ah,9
    int 21H

    mov ah,1
    int 21H
    mov bl,al;将操作数2移到bl中
    lea dx,crlf
    mov ah,9
    int 21H

    mov dx,offset menu
    mov ah,9
    int 21H
    mov ah,8
    int 21H
    cmp al,'1'
    jz binar
    cmp al,'2'
    jz decim
    cmp al,'3'
    jz hexx
    cmp al,'4'
    jz exit
    jmp start

binar: 
    add bl,bh;相加,结果存在bl中
    mov al,bl
    mov bl,8
next1:
    mov dl,0
    shl al,1
    mov bh,al
    adc dl,30h
    mov ah,2
    int 21H
    mov al,BH
    dec bl
    jnz next1
    jmp start

decim:
    add bl,bh
    mov dl,bl
    sub dl,30h
    cmp dl,39h;比较dl和十进制9的大小
    jbe l1;如果小于9,则直接输出
    sub dl,30h
    mov al,dl
    mov ah,0
    mov bl,10
    div bl
    mov dl,al
    mov cl,ah;防止ah中的商被02h冲掉,先把商转移到cl中
    add dl,30h
    mov ah,2
    int 21H
    mov dl,cl
    add dl,30h
    l1:
    mov ah,2
    int 21H
    jmp start

hexx:
    add bl,bh
    mov al,bl
    mov bh,al
    mov cl,4
    shr al,cl
    cmp al,0ah
    jb next2
    add al,7h
    next2:
    add al,30h
    mov dl,al
    mov ah,2
    int 21H
    mov al,BH
    and al,0fh
    cmp al,0ah
    jb next3
    add al,7h
    next3:
    add al,30h
    mov dl,al
    mov ah,2
    int 21H
    jmp start
exit:
    mov ah,4cH
    int 21H

code ends
end start