-
-
[原创]【ARM】STM LDM 入栈出栈的N种姿势总结
-
发表于:
2017-9-29 15:49
8718
-
[原创]【ARM】STM LDM 入栈出栈的N种姿势总结
1 STMFD 满递减
(1) STMFD SP , {R1-R4}
执行前
![]()

执行后
![]()

规律总结:
(1)最低编号REG对应->最低内存地址
(2)指令执行后SP指向没有发生改变.
(2)如果是带!的
STMFD SP !, {R1-R4}
执行前
![]()

执行后
![]()

规律总结:
指令有!时,SP的值最终发生了变化。
执行前
![]()

执行后
带!的
(2) LDMFD SP! , {R1-R4}
执行前
执行后
![]()

重要的事情重复三遍:
不管那种寻址, 低地址 永远对应 低编号寄存器.
不管那种寻址,
低地址 永远对应 低编号寄存器.
不管那种寻址,
低地址 永远对应 低编号寄存器.
---------------------------------------------------------------------------------------
指令集版本:arm v5te 32bit
其寻址方式和x86中的push和pop差不多.
但是在ARM中还存在其他方式的入栈出栈,
比如STMFA STMIB STMFD STMDB STMEA
STMIA STMED STMDA LDMFA LDMDA LDMFD
LDMIA LDMEA LDMDB LDMED LDMIB ~~~
是不是懵逼了,好吧,现在这篇帖子,
就试图通过调试观察把它们的区别分清。
一 、先解释栈寻址的类型,什么是 空递增 空递减 满递增 满递减。
二 、概念看起来还是有点模糊
如果你拿不准,指令执行完,SP和堆栈到底是个什么指向,
可以收藏这篇帖子,以备查询。
下面调试实例来体会,一切以运行结果为准。
目录
1 STMFD 满递减
2 LDMFD 满递减
3 STMFA 满递增
4 LDMFA 满递增
5 STMEA 空递增
6 LDMEA 空递增
7 STMED 空递减
8 LDMED 空递减
1 STMFD 满递减
(1) STMFD SP , {R1-R4}
执行前
![]()

执行后
![]()

规律总结:
(1)最低编号REG对应->最低内存地址
(2)指令执行后SP指向没有发生改变.
(2)如果是带!的
STMFD SP !, {R1-R4}
执行前
![]()

执行后
![]()

规律总结:
指令有!时,SP的值最终发生了变化。
2 LDMFD 满递减
(1) LDMFD SP , {R1-R4}
执行前
![]()

执行后
![]()

带!的
(2) LDMFD SP! , {R1-R4}
执行前
![]()

执行后
![]()

3 STMFA 满递增
STMFA SP! , {R1-R4}
4 LDMFA 满递增
LDMFA SP! , {R1-R4}
5 STMEA 空递增
STMEA SP! , {R1-R4}
6 LDMEA 空递增
LDMEA SP! , {R1-R4}
7 STMED 空递减
STMED SP! , {R1-R4}
8 LDMED 空递减
LDMED SP! , {R1-R4}
三、要强调的一些东西
1 REG列表的编号顺序,必须从小到大,按顺序写。
2 读写时,REG和MEM的对应关系是:低编号---对应---低地址.
重要的事情重复三遍:
不管那种寻址, 低地址 永远对应 低编号寄存器.
不管那种寻址,
低地址 永远对应 低编号寄存器.
不管那种寻址,
低地址 永远对应 低编号寄存器.
四、还有IB DB IA DA结尾的是啥玩意。
当Rn != SP时,寻址方式的名称会发生改变,但是操作还是一样的。
---------------------------------------------------------------------------------------
若有错误希望能指出,共同学习进步~
但是在ARM中还存在其他方式的入栈出栈,
比如STMFA STMIB STMFD STMDB STMEA
STMIA STMED STMDA LDMFA LDMDA LDMFD
LDMIA LDMEA LDMDB LDMED LDMIB ~~~
是不是懵逼了,好吧,现在这篇帖子,
就试图通过调试观察把它们的区别分清。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!