我正在使用ARM处理器,但我认为所有处理器的问题都是一样的。
我想使用EOR指令(按位异或)代替CMP,因为我必须在跳转后找到不匹配的位。
但是,我不知道为什么它似乎是那个
CMP r0, r1
BNE .somewhere
不等同于
EORS r5, r0, r1
BNE .somewhere
是正常还是我必须再次寻找我的问题?
感谢的
答案 0 :(得分:1)
CMP
与EORS
“不等同”。 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。无论如何,这是我对它的看法。