Assembly 在跳跃之前,用EOR更换CMP组件

Assembly 在跳跃之前,用EOR更换CMP组件,assembly,arm,Assembly,Arm,我使用的是ARM处理器,但我假设所有处理器的问题都是一样的 我想使用EOR指令(按位异或)而不是CMP,因为我必须在跳转后找到不匹配的位 但是,我不知道为什么会这样 CMP r0, r1 BNE .somewhere 不等于 这是正常的还是我必须再次寻找我的问题 Thank's将r0减去r1(r0-r1),然后为BNE设置一个标志,说明两者是否相等(结果为0)或不相等(结果为非0) 为了在二进制中进行减法,可以使用,取r1,求反,加1,然后再加上r0。如果加法的结果都是0,它将标记为相等。否则

我使用的是ARM处理器,但我假设所有处理器的问题都是一样的

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

但是,我不知道为什么会这样

CMP r0, r1
BNE .somewhere
不等于

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

Thank's

将r0减去r1(r0-r1),然后为BNE设置一个标志,说明两者是否相等(结果为0)或不相等(结果为非0)

为了在二进制中进行减法,可以使用,取r1,求反,加1,然后再加上r0。如果加法的结果都是0,它将标记为相等。否则它将标记为不相等。最重要的是要记住这里有一面旗帜。在本例中,它设置标志。因此,BNE可以正确运行

r0(00100000)[32]

r1(00111000)[56]

r1的求反:(11000111)[-57]#有符号数字的第一位表示是否 通常是负数。1通常在前面这样表示否定。 添加值:#记住它基本上是一个标准或操作,但带有 如果两位均为1,则执行进位功能

(00100000)

(11000111)

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

对r0和r1中的数据执行逻辑位运算,方法是将它们异或在一起,然后将结果存储在r5中

它是这样做的:如果两个位都是0或者两个位都是1,那么XOR结果是0。否则它将产生1

r5(00000000)#为了简单起见,我假设r5是空的

r0(00001111)

r1(0001111)

异或(00010000)

r5(00010000)#将异或结果复制到r5

您使用了S后缀,它触发了标志,从而解决了它,对吗

除了操作之外,还有什么区别?目的地注册。我怀疑您需要存储在r0而不是r5中,因为BNE可能没有检查r5。无论如何,这是我的看法。

CMP
eor
并不“等同”。
CMP
指令基本上是一个丢弃减法结果的
SUBS


有一条ARM指令执行
EORS
,但会丢弃结果。它是
TEQ
。也许您希望这样做而不是
CMP

是的,但我想要的是在比较之后在寄存器中设置不匹配位。在ARM上,EOR之后的S指示指令将设置标志。
EORS r5, r0, r1
BNE .somewhere