在跳转之前,装配由EORS替换CMP

时间:2011-06-25 21:29:56

标签: assembly arm

我正在使用ARM处理器,但我认为所有处理器的问题都是一样的。

我想使用EOR指令(按位异或)代替CMP,因为我必须在跳转后找到不匹配的位。

但是,我不知道为什么它似乎是那个

CMP r0, r1
BNE .somewhere

不等同于

EORS r5, r0, r1
BNE .somewhere

是正常还是我必须再次寻找我的问题?

感谢的

2 个答案:

答案 0 :(得分:1)

CMPEORS“不等同”。 CMP指令基本上是SUBS,它会丢弃减法的结果。

有一条ARM指令可以执行EORS但会丢弃结果。它是TEQ。也许你想要而不是CMP

答案 1 :(得分:0)

CMP从r0(r0-r1)中减去r1,然后为BNE设置一个标志,以确定两者是否相等(结果为0)或不相等(结果不为0) 。

为了减去二进制,你可以使用"twos compliment",在这里你取r1,否定它,加1,然后将它加到r0。如果加法的结果全为0,则标记为相等。否则它标记为不相等。这里要记住的最重要的事情是有一面旗帜。在这种情况下,它设置"Z"标志。因此BNE可以正常运作。

  

r0(00100000)[32]

     

r1(00111000)[56]

     

否定r1:(11000111)[-57]#有符号数字的第一位表示是否   通常是消极的。 1在这样的前面通常意味着负面。   添加值:#记住它基本上是一个标准的OR操作,但有一个   如果两个位都为1,则进位函数。

     

(00100000)

     

(11000111)

     

ADD

     

(11100111)#这不是0,因此不设置Z标志。

EOR对r0和r1中的数据进行逻辑按位运算,将它们进行异或运算,然后将结果存储在r5中。

它是这样的:如果两个位都为0或两个位都为1,则XOR结果为0.否则产生1。

  

r5(00000000)#为简单起见,我假设r5为空。

     

r0(00001111)

     

r1(00011111)

     

异或(00010000)

     

r5(00010000)#XOR结果复制到r5。

您使用了S后缀,它会触发该标志以便解决它,对吗?

除了操作之外的其他区别是什么?目的地登记。我怀疑你需要存储在r0而不是r5,因为BNE可能不会检查r5。无论如何,这是我对它的看法。