组件 8086,16 位寄存器和 CMP 的范围



我做了这个打印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会跳跃。

正如英特尔指令集参考很好地总结的那样:

术语"更少"和"更大"用于比较已签名 整数和术语"上面"和"下面"用于无符号 整数。

最新更新