为什么以下8086汇编代码仅显示最多2559的数字?

时间:2017-09-14 03:22:13

标签: x86-16 emu8086

我想做什么?

我想从用户那里获得一个16位数字并在控制台上打印它。

有什么问题?

我的代码工作正常如果输入的数字小于2600但是我输入2600的那一刻显示" 40"对于2601" 41"等等。不应该显示高达65535的数字吗?因为我将值存储在bx寄存器中,该寄存器是16位,最多可以存储65535.那么为什么只有2559?

我的代码:

.model small
.data

msg db 10,13,'Enter a 16bit number: $'             
newline db 10,13,'$'

.code
main:

mov ax, @data
mov ds, ax

mov cl, 10
mov bx, 0

mov ah, 09h
lea dx, msg
int 21h

call get16bitNum

mov ah, 09h
lea dx, newline
int 21h

mov ax, '$'

push ax

mov ax, bx      

store:  

div cl
cmp al, 0 
mov bh, 0
mov bl, ah    
push bx
je continue        
mov ah, 0
jmp store

continue:

pop ax
cmp ax, '$'
je ext 
mov bx, ax
mov ah, 02h
mov dx, bx
add dx, 48
int 21h


jmp continue

ext:        

mov ah, 04ch
int 21h

proc get16bitNum

aggregate:

mov ah, 01h 
int 21h

cmp al, 13
je return 

mov ah, 0
sub al, 48     

mov dx, bx
mov bx, ax
mov ax, dx

mul cl
add bx,ax         
jmp aggregate                        

return:

ret    

endp                

end main

2 个答案:

答案 0 :(得分:2)

8 div产生8位商和余数 当你将2600除以10时,你得到一个8位商,失去更高的位。

您应该使用 16 位除法。

答案 1 :(得分:2)

您实际上并未检索到16位数字!

您在BX中保留了所需的输入,因此您需要将整个BX乘以10.您可以使用字大小的乘法来执行此操作。

proc get16bitNum
  aggregate:
    mov  ah, 01h 
    int  21h
    cmp  al, 13
    je   return 
    mov  ah, 0
    sub  al, 48    ;AX is 0 to 9
    xchg ax, bx    ;New digit temporarily in BX
    mov  cx, 10
    mul  cx        ;Product is in DX:AX, but we won't use DX!
    add  bx ,ax    ;Add new digit
    jmp  aggregate                        
 return:
    ret

您不显示16位数字

将数字转换为文本的过程肯定需要使用字大小的部门

有关如何执行此操作的优秀说明,请参阅最近的帖子Displaying numbers with DOS。它详细解释了转换数字时需要了解的所有内容。它甚至使用相同的方法在堆栈中推送一些值(你使用 $ 字符)来知道数字的结束位置。

PS。如果您发现the linked post中的信息有用,请不要犹豫不决。 (当然,我希望你的答案也有用!)