【问题标题】:Assembly 8086 ,range of a 16 bit register and cmp汇编8086,一个16位寄存器和cmp的范围
【发布时间】:2014-01-01 20:38:58
【问题描述】:

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

【问题讨论】:

  • 仔细查看jl 的含义以及它与jb 的区别。

标签: assembly cpu-registers x86-16


【解决方案1】:

使用JBE 而不是JLE

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

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

术语“更少”和“更大”用于比较有符号的 整数和术语“上方”和“下方”用于无符号 整数。

【讨论】:

  • 哦,我不知道,这同样适用于 8 位数字吗?
  • 是的。 CPU 寄存器中的值本身没有符号或无符号。有些操作计算结果,就好像操作数的有符号或无符号一样(有时它是相同的操作,这要归功于二进制补码魔法)。
猜你喜欢
  • 2014-12-15
  • 2014-04-04
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多