Assembly 在跳跃之前,用EOR更换CMP组件
我使用的是ARM处理器,但我假设所有处理器的问题都是一样的 我想使用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,它将标记为相等。否则
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