我必须将16位作为1234输入,并试图显示它。但是它的输出为4660。我试图逐位存储数字,因为当我接受输入时,它将以ASCII形式存储在al
中。之后,我尝试使用shift left(al
)操作将SHL
中的整个位向左移,如果我插入了1,这将在al
中给我10。之后,我插入了第二个并执行移位和旋转操作,如果存储的第二个数字为2,我试图使其以02的形式显示。此外,我对存储在寄存器中的10和02执行了OR
操作。我重复了相同的过程来存储较低的8位数字。但是输出是不同的。
.model small
.stack 100h
.data
.code
main proc
mov ax,@data
mov ds,ax
;taking 16 bit number input
mov ah,01h
int 21h
mov bh,al
mov cl,4
shl bh,cl
mov ah,01h
int 21h
mov cl,4
shl al,cl
mov cl,4
ror al,cl
or bh,al
mov ah,01h
int 21h
mov bl,al
mov cl,4
shl bl,cl
mov ah,01h
int 21h
mov cl,4
shl al,cl
mov cl,4
ror al,cl
or bl,al
;taking 16 bit number input
;displaying number in dos
mov ax,bx
mov bx,10
xor cx,cx
.a:
xor dx,dx
div bx
push dx
inc cx
test ax,ax
jnz .a
.b:
pop dx
add dl,"0"
mov ah,02h
int 21h
loop .b
exit:
mov ah,4ch
int 21h
main endp
end main
答案 0 :(得分:3)
将ASCII数字转换为整数后,您将4位半字节打包到BCD (Bindary Coded Decimal)中,而不是乘以十进制的位值(10的幂)以形成二进制整数。
4660(十进制)= 0x1234 ,因此您正确实现了BCD打包,但这并不是您首先要做的。
左移4等于乘以16,而不是10。
NASM Assembly convert input to integer?表示字符串->使用标准的二进制整数
total = total*10 + digit
算法,从最高有效位开始。
该问与答具有32位代码,但是一旦您理解该算法,它就很容易实现。或者,您也可以使用16位代码在堆栈溢出时搜索其他问答(例如,如果内置搜索无济于事,请使用google)。