我正在使用LDRE指令检查一些反汇编。 e.g:
LDRLE R3, #0x1234
我在指令列表中找不到这个。所以我的问题是,LDRLE指令做了什么?
我的猜测,如果指令由c代码表示:
// LDRLE R3, #0x1234
R3 = R3 <= 0x1234 ? R3 : 0x1234
答案 0 :(得分:3)
LDRLE
指令实际上是LDR(从内存加载寄存器)指令,条件执行限定符“LE”(小于或等于)。
当N标志和V标志不同时,条件“LE”为“真”,当Z位置位时,条件“LE”也为真(Z,N和V是PSR中4个标志位中的3个) 。您可以在处理器的PSR布局上找到ARM的信息。
换句话说,只有当PSR中的当前标志的“LE”条件为真时,才会执行此LDR
指令。这些标志可能会受到执行之前到LDRLE
指令的指令的影响。换句话说,LE条件是根据之前的指令的效果来评估的,而不是当前指令的操作数的值(在这种情况下,{{1指令)。
最后,如果执行指令,该指令会做什么(每个当前PSR标志条件LE为真)?它将(立即)值0x1234加载到寄存器R3中。
答案 1 :(得分:0)
如果CPSR寄存器中的位数小于设置,它会将0x1234中的值加载到R3中。
在C中的: if(LESS_THAN_BIT_SET)r3 = *(0x1234);
因此,如果在之前的指令中设置了小于或等于位:
mov r0, #0
cmp r0, #1 ; equivalent to subs r0, r0, #1
然后执行带有LE条件标志的任何指令,否则它将被视为NOP。
这是手册页: http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/Chdehgih.html
答案 2 :(得分:0)
ARM ISA尝试在每条指令上公开可用的硬件资源,例如:由于CPU上有一个桶形移位器,每个指令都可以移位/旋转其中一个操作数,并且由于CPU上有条件代码,每条指令都可以有条件地执行。
因此,关于ARM程序集的指令可能类似于:
ADD[cond][S]
其中cond
是用两个字母编码的条件,允许条件执行,S
允许判断当前指令是否应该影响条件代码(非常有用并结合条件执行)。
然后,您必须仅使用第一部分(在此示例中为ADD
)查找指令。