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处(它是向下自减的)

Part10-C语言环境初始化-栈初始化lesson1的更多相关文章
- c语言环境初始化&c语言和汇编混合编程
bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...
- Android app内语言环境切换
逻辑很简单: 1 app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...
- Go语言goroutine调度器初始化(12)
本文是<Go语言调度器源代码情景分析>系列的第12篇,也是第二章的第2小节. 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调 ...
- Kali Linux渗透测试实战 1.2 环境安装及初始化
1.2 环境安装及初始化 目录(?)[-] 环境安装及初始化 下载映像 安装虚拟机 安装Kali Linux 安装中文输入法 安装VirtualBox增强工具 配置共享目录和剪贴板 运行 Metasp ...
- c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
/* c++描述将2进制数转化成10进制数 问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存, 还是在哪里可以加上delete 2.如果栈满了,我要分配多点空间,我想的办法 ...
- Linux内核--网络栈实现分析(一)--网络栈初始化
本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏, ...
- Linux内核--网络栈实现分析(一)--网络栈初始化--转
转载地址 http://blog.csdn.net/yming0221/article/details/7488828 作者:闫明 本文分析基于内核Linux Kernel 1.2.13 以后的系列博 ...
- C语言标记化结构初始化语法
C语言标记化结构初始化语法 (designated initializer),而且还是一个ISO标准. #include <stdio.h> #include <stdlib.h&g ...
- Swift5 语言指南(十六) 初始化
初始化是准备要使用的类,结构或枚举的实例的过程.此过程涉及为该实例上的每个存储属性设置初始值,并执行在新实例准备好使用之前所需的任何其他设置或初始化. 您可以通过定义实现这个初始化过程初始化,这就像特 ...
随机推荐
- fn project AWS Lambda 格式 functions
Creating Lambda Functions Creating Lambda functions is not much different than using regular funct ...
- oracle truncate闪回数据库恢复
1.创建试验表 conn scott/tiger create table truncate_test as select * from user_objects; select count(*) f ...
- PHP Tools for VS2017 key/破解 [搬运]
看看结果 搬运地址 : (自己敲吧...) 这里面破解的只有一年 时间可以在文中提供的 ------------------------------------------------------- ...
- Linux下搭建 NFS
一.NFS简介 NFS是Network File System的缩写,即网络文件系统.一种使用于分散式文件协定,有SUN公司开发.功能是通过网络让不同的机器.不同的操作系统能够分享个人数据,让应用程序 ...
- delphi2010多线程编程教程
多线程编程(1) - 先入门再说. 多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样). 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解 ...
- How to get the MD5 checksum for a file: md5sum, digest, csum, fciv
LINUX: md5sum fileName In Linux, the md5sum utility can be used: aemtux1:/ % md5sum binary.file 0c46 ...
- 【转】JMeter入门
一.JMeter概述 JMeter就是一个测试工具,相比于LoadRunner等测试工具,此工具免费,且比较好用,但是前提当然是安装Java环境: JMeter可以做 (1)压力测试及性能测试: (2 ...
- 主流ETL工具
主流ETL产品: Ascential公司的Datastage(Datastage在2005年被IBM收购).Informatica公司的Powercenter. NCR Teradata公司的ETL ...
- js实现可拖动的布局
思路:采用flex布局,js即时修改固定列的宽度 注意:父元素需设置position:relative:因offsetLeft和offsetTop是相对于具有定位的(position:absolute ...
- Linux - 归档和压缩
归档 归档就是将多个文件或目录合并成一个文件 归档的目的就是方便备份.还原及文件的传输操作 tar 命令:将多个文件或目录归档到一个文件中,可以根据需要只还原归档文件中的某些指定的文件 c:创建,v: ...