同一条ARM汇编指令,为什么执行的结果不一样?

2025-03-07 08:45:03
推荐回答(2个)
回答1:

指令STMFD和LDMFD分析;

根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD,

通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD的地址计算方法:

STMFD指令的寻址方式为事前递减方式(DB)

而DB寻址方式实际内存地址为:

start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4)

end_address = Rn - 4

STM指令操作的伪代码:

if ConditionPassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

Memory[address] = Ri

address = address + 4

有上面两个伪代码可以得出 STMFD SP!,{R0-R7,LR} 的伪代码如下:

SP = SP - 9×4;

address = SP;

for i = 0 to 7

Memory[address] = Ri;

address = address + 4;

Memory[address] = LR;

LDMFD指令的寻址方式为事后递增方式(IA)

IA内存的实际地址的伪代码

start_address = Rn

end_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4

LDM指令操作的伪代码(未考虑PC寄存器):

if ConditionPassed(cond) then

address = start_address

for i = 0 to 15

if register_list[i] == 1

Ri = Memory[address,4]

address = address + 4

所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是:

address = SP;

for i = 0 to 7

Ri = Memory[address ,4]

address = address + 4;

SP = address;

希望能帮到你...

回答2:

   sub eax,eax   mov esi,1for:mov eax,14H      欲循环的次数     cmp si,ax jg S1——————————————————————code     mov eax,2H        2为步长
     add esp,14H
     add ax,siJMP forS1 NEXT