我在汇编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
我不知道问题出在哪里。如何解决此问题?
1条答案
按热度按时间i34xakig1#
您正在使用字节大小的乘法来计算AL乘以BL。由于您似乎希望能够处理不再适合一个字节的数字,因此GT 255,您最好使用单词大小的乘法。
知道单词大小的乘法使用DX:AX作为其目的地,需要重新组织代码:
如果数字是零,你仍然希望显示一个单一的'0'数字,而不是留下一个空行,我相信这是更混乱。
然后打印转换为下一个更简单的代码: