汇编8086,范围为16位寄存器和cmp

时间:2014-01-01 20:38:58

标签: assembly cpu-registers x86-16

我做了这个程序,打印出一个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

1 个答案:

答案 0 :(得分:3)

使用JBE代替JLE

CMP设置状态标志,就好像第二个操作数是从第一个操作数中减去的一样。 如果设置零标志,或者符号标志溢出标志不同,则JLE跳转。如果设置了进位标志,或者设置了零标志,则会JBE跳转。

英特尔指令集参考很好地总结了它:

  

术语“less”和“greater”用于比较签名   整数和术语“上方”和“下方”用于未签名   整数。