STMFD相关汇编

2020-01-1313:35:19来源:xgx198831 评论 1,337 views
AREA STMFD,CODE,READONLY
ENTRY
CODE32
START
sub sp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc
mov r0,#0x1d ;将0x1d赋值给r0寄存器
mov r1,#0x1c ;将0x1c赋值给r1寄存器

stmfd sp!,{r0} ;将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d)
第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(fffffffa处放的是0x00),将第二十五位到第三十二位放入
sp+3的位置(fffffffb处放的是0x00).

str r1, [sp,#4] ;将r1中的值压入堆栈,压入过程是,由于r1中的值为32位的,将r0中的低八位放入sp+4(fffffffc处放的是0x1c)这个位置
第九位到第十六位放入sp+5的地址(fffffffd处放的是0x00),将第十七位到第二十四位放入sp+6的位置(fffffffe处放的是0x00),将第二十五位到第三十二位放入
sp+7的位置(ffffffff处放的是0x00).
.

ldmfd sp!,{r2,r3} ;将堆栈中的内容出栈,出栈过程是,将sp这个位置的值放入r2中的低八位,将sp+1这个位置的值放入r2中的第九
位到第十六位,将sp+2这个位置的值放入r2中的第十七位到第二十四位,将sp+3这个位置的值放入r2中的第二十
五位到第三十二位。(即r2中的值为0x0000001d)将sp+4这个位置的值放入r3中的低八位,将sp+5这个位置的值放入r3中的第九位到第十六位,将sp+6这个位置的值放入r3中的第十七位到第二十四位,将sp+4这个位置的值放入r3中的第二十
五位到第三十二位(即r2中的值为0x0000001c)。同时sp=sp+8


一开始,看到 STMFD sp!{R0-R5,LR} 这条命令时真是有点疑惑。现根据自己的理解记录一下。供大家分享!

我们先要理解一下关于堆栈的相关概念.

1,满堆栈:即入栈后堆栈指针sp指向最后一个入栈的元素。也就是sp先减一(加一)再入栈。

2,空堆栈:即入栈后堆栈指针指向最后一个入栈元素的下一个元素。也就是先入栈sp再减一(或加一)。

1,递增堆栈:即堆栈一开始的地址是低地址,向高地址开始递增。就如同一个水杯(假设上面地址大)开口的是大地址,从杯底开始装水。自己画一画图就清楚了。我就偷懒一下不画了。

2,递减堆栈:即堆栈一开始的地址是高地址,向低地址开始递增。就如同还是刚才说的那个水杯,现在开口的是小地址,从大地址开始用,往下走,相当于杯子口朝下。我们用的时候是把水往上一点点压上去。呵呵呵,不过这样的杯子就失去了用途。但在内存上还是可以的。

当然有这些类型就可以构成4种不同的堆栈方式。

还有就是,我们要明确一点就是arm的栈一般我们用满堆栈、递减堆栈。

下面说一下咱们的正题,STMFD sp!{R0-R5,LR}

STMFD 我解释一下 ST(store 存储) M(multiple 多次)F(full 满堆栈)D(decrease 递减堆栈) 合起来就是按满的递减的方式把后面的寄存器里的值都存到sp中。

STMFD sp!{R0-R5,LR} 就这条就是 把 lr r5-r0 依次存到sp中,并且sp会在存数据之前自动减一个数据的空间(别忘了arm是递减的哦)。至于最后一个问题,我想大家肯定还有一个疑惑就是sp后为什么有一个“!”。是这样的如果有 !号,表示在存入数据后sp会指向最后一个存入的数据的地址,否则sp会把自己的值加到一开始的地址。(就是sp在执行完这条指令之后sp指向的地址不变)

好了,下面说一个表,你就明白其他有关命令的用法了。

现在通过下表,可以轻松的解决这个问题:

寻址方式 说明 pop =LDM push =STM
FA 递增满 LDMFA LDMDA STMFA STMIB
FD 递减满 LDMFD LDMIA STMFD STMDB
EA 递增空 LDMEA LDMDB STMEA STMIA
ED 递减空 LDMED LDMIB STMED STMDA

我觉着掌握汇编指令一方面是多用,还有就是我们把汇编指令的英文全称找到或自己按英文理解。这样可能会对你理解这条语句有帮助。

你可以把其他指令按我说的做一做。由于时间关系我就不一一列举

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: