lbheibai 发表于 2011-12-12 14:54:18

关于比较指令CMP的用法

请问下,汇编里面的指令CMP

ADTimeCount         EQU 0X212

CLR.W &ADTimeCount
CMP.W #65530,&ADTimeCount
JGE   aaaaa
结果怎么都是跳到aaaaa?刚刚学用,不知哪位说下

是不是在MSP汇编里面,定义的变量是带符号?如果我把其改为
CMP.W #32767,&ADTimeCount就正常

但如果改为
CMP.W #32768,&ADTimeCount 就都是跳到aaaaa

变量的最高位感觉是个符号位,可是在51,或者AVR里面不是这样的啊

lbheibai 发表于 2011-12-12 15:04:43

另外发现如果是byte比较,也是,比较的立即数在#127以下还正常,超过就不行,

lbheibai 发表于 2011-12-12 15:49:18

等待中

20061002838 发表于 2011-12-12 15:58:38

回复【楼主位】lbheibai
-----------------------------------------------------------------------

CMP指令是不是不支持16位的立即数寻址啊?
你用软件仿真看看反汇编的是什么指令

lcofjp 发表于 2011-12-12 16:04:35

仔细看汇编指令,JGE是有符号比较跳转,你可以试试JHS或者其他跳转指令

lbheibai 发表于 2011-12-12 17:33:32

回复【3楼】20061002838
-----------------------------------------------------------------------
CMP指令是支持16位的立即数寻址的,如我上面的例子:

CMP.W #32767,&ADTimeCount   ;即0x7fff
JGE   aaaaa
这个是能正常工作的,但改为
CMP.W #32768,&ADTimeCount   ;0x8000
JGE   aaaaa
就不行


回复【4楼】lcofjpC语言砖家
-----------------------------------------------------------------------

你指的有符号比较,意思是会把比较数的最高位当作是符号位?可否讲解下

lcofjp 发表于 2011-12-12 17:52:21

可以这么理解,用JGE的时候就把CMP中的数当有符号数处理。啥叫有符号数,就是最高位是符号位。

具体的跳转指令都是根据状态寄存器中的标志位决定的,怎么不仔细的看下user's guide中的指令详解呢?里面讲的清清楚楚,经过CMP后哪个标志位会变化,就决定怎么跳转,其实说有符号无符号都是人的理解,而处理器只认识标志位。

lbheibai 发表于 2011-12-12 18:01:59

明白了,我本来以为它是跟AVR里面的一样的,没想到这个符号位的问题,谢谢你的解答,我再仔细看下影响到的相关标志位
页: [1]
查看完整版本: 关于比较指令CMP的用法