Part10-C语言环境初始化-栈初始化lesson1

1、概念解析

ARM系统使用的是满栈!

ARM采用降栈!!!

栈帧

每一个进程会有一个栈,该进程中的每一个函数会分割栈的一部分,那么每一个函数使用的那部分栈就叫做栈帧。那么所有栈帧组成了整个栈。

子函数func里面保存了main函数的上边界FP和下边界SP。

2、栈的作用

保存局部变量

代码样例

编译之:

arm-linux-gcc -g  stack1.c -o stack1

反汇编之:arm-linux-objdump -D -S stack1 >dump

dump里面的结果

首先是push {sp},具体是将str fp,[sp,#-4]!,里面让sp先减4再存。加一个!号,表示使sp-4,但不会对sp本身有影响

add fp,sp,#0把sp加0的值赋值给fp,实际就是把sp赋给fp,让fp也指向栈顶,

sub sp,sp,#12

执行c语言的a++,它是ldr r3,[fp,#-8],从这个地址的内容拿到r3,该地址的内容实际上就是a的值,然后再add r3,r3,#1,加1后再存回原来的地方。

传递参数

在c语言传递参数的过程当中,如果参数的个数小于或等于4的就用r0到r3,如果大于的话就要用栈来传递

保存寄存器的值

3、栈初始化编程

就是对sp指针进行赋值,

6410内存256MB内存位置0x20000000+64MB

210内存512MB内存位置0x50000000+64MB(0x4000000)

2440内存64MB,内存位置0x30000000+64MB

那么我们把sp指针统一指到内存的64MB处(它是向下自减的)

 

posted on   gary_123  阅读(246)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示