我想做什么?
我想从用户那里获得一个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
答案 0 :(得分:2)
8 位div
产生8位商和余数
当你将2600除以10时,你得到一个8位商,失去更高的位。
您应该使用 16 位除法。
答案 1 :(得分:2)
您在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
将数字转换为文本的过程肯定需要使用字大小的部门。
有关如何执行此操作的优秀说明,请参阅最近的帖子Displaying numbers with DOS。它详细解释了转换数字时需要了解的所有内容。它甚至使用相同的方法在堆栈中推送一些值(你使用 $ 字符)来知道数字的结束位置。
PS。如果您发现the linked post中的信息有用,请不要犹豫不决。 (当然,我希望你的答案也有用!)