好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 havenow 于 2021-3-20 18:34 编辑
栈用来存储临时数据,使用push,pop指令来和栈交互,push和pop是一系列其他的内存相关指令的别名,而不是实际指令,使用push和pop是为了操作简便。
一条数据(32bit)将被放置的实际地址由栈指针定义,这个地址存储在sp寄存器中。
sp可能会指向栈中当前(最新)的的项,或者指向当前项的下一可用的内存槽。
sp当前指向栈中的最后一个项(full实现)
sp指向栈的下一个空白内存槽(empty实现),数据将首先被放置到这里
1
下面总结了不同栈实现方式,可以使用下表来描述在不同情况下,存储多个指令和载入多个指令在不同情形下是如何使用的
2
下面是一个使用full descending栈的例子
.text
.global main
main:
mov r0, #2
push {r0}
mov r0, #3
pop {r0}
bx lr
执行mov r0, #2指令后,sp的地址是0xfffefac0,r0是2
3
执行执行push {r0}指令后,sp的地址是0xfffefac0 – 4 = 0xfffefabc,r0是2
4
执行mov r0, 3指令后,sp的地址是没改变,r0是3;只是用来改变r0的值
5
执行pop {r0}指令后,sp的地址是0xfffefabc + 4 = 0xfffefac0,r0是2
pop指令被执行,sp从地址0xfffefabc读取4字节的数据,让后sp寄存器0xfffefabc + 4。
6
可以看到gdb(cef)中栈的视图是
8
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|