我做了这个程序,打印出一个16位数字(范围应为0-65535),
贝娄是代码,如果我用这个cmp ax,32767
替换问题所在的行(代码中的大号)(将数字作为16位预设)一切正常但是当我将65535作为最大值会混淆输出(只打印1个字符)。
我认为汇编中的16位寄存器可以取0-(2 ^ 16-1)范围内的数字,就像8位寄存器可以取0-(2 ^ 8-1)< / p>
emfanisi_arithmou proc near ;ax the digit
cmp ax,10
jl l101
cmp ax,100
jl l102
cmp ax,1000
jl l103
cmp ax,10000
jl l104
cmp ax,65535; <- HERE , HEY HERE DO YOU SEE ME?
jle l105
l101:
mov cx,1
jmp loop105
l102:
mov cx,2
jmp loop105
l103:
mov cx,3
jmp loop105
l104:
mov cx,4
jmp loop105
l105:
mov cx,5
loop105:
mov dx,0
mov bx,cx
dec bx
shl bx,1
mov bx,powerof10[bx]
div bx
push dx
mov dl,al
add dl,48
mov ah,2
int 21h
pop ax
loop loop105
ret
emfanisi_arithmou endp
powerof10 dw 1,10,100,1000,10000;in the data segment
答案 0 :(得分:3)
使用JBE
代替JLE
。
CMP
设置状态标志,就好像第二个操作数是从第一个操作数中减去的一样。
如果设置零标志,或者符号标志与溢出标志不同,则JLE
跳转。如果设置了进位标志,或者设置了零标志,则会JBE
跳转。
英特尔指令集参考很好地总结了它:
术语“less”和“greater”用于比较签名 整数和术语“上方”和“下方”用于未签名 整数。