我正在汇编 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
我不知道问题出在哪里。我可以做什么来解决这个问题?
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