我做了这个打印16位数字的过程(范围应该是0-65535),下面是代码,如果我用这个cmp ax,32767
替换问题所在的行(代码中的大 HERE)(将数字作为 16 位预符号),一切正常,但是当我将 65535 作为最大值时,它会弄乱输出(仅打印 1 个字符)。
我的想法是汇编中的 16 位寄存器可以取 0-(2^16-1) 范围内的数字,就像 8 位寄存器可以取 0-(2^8-1) 范围内的数字一样
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
使用 JBE
而不是 JLE
。
CMP
设置状态标志,就好像第二个操作数是从第一个操作数中减去的一样。 如果设置了零标志,或者符号标志与溢出标志不同,则JLE
跳转。 如果设置了进位标志或设置了零标志,JBE
会跳跃。
正如英特尔指令集参考很好地总结的那样:
术语"更少"和"更大"用于比较已签名 整数和术语"上面"和"下面"用于无符号 整数。