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

发布者:EtherealEssence最新更新时间:2024-10-14 来源: cnblogs关键字:初始化 手机看文章 扫描二维码
随时随地手机看文章

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

上一篇:Part9---代码搬移不可少
下一篇:Part10-C语言环境初始化-Bss段初始化lesson2

推荐阅读最新更新时间:2026-03-25 11:24

初始化ARM处理器各模式下的堆指针SP(R13)
程序设计思路:通过状态寄存器与通用寄存器之间数据传输指令MRS/MSR实现,修改时应采用“读取-修改-写回”三个步骤来实现。每次只需修改相应的域即可,如本次程序只修改C控制域。同时应注意系统模式与用户模式共用SP,只需初始化其一即可。 程序代码如下: (1)在GNU ARM开发环境下编程: .equ _ISR_STARTADDRESS, 0xC7FF000 @设置栈的内存基地址 .equ UserStack, _ISR_STARTADDRESS @用户模式堆栈地址0x7FF000 .equ SVCStack, _ISR_STARTADDRESS+256 @管理模式堆栈地址0x7FF100 .equ UndefStac
[单片机]
基于ARM的硬件启动程序设计-初始化
ARM有7种运行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。所以,对于程序中需要用的每一种 处理器模式,都要给SP定义一个堆栈地址。流程为:修改状态寄存器内的状态位,使处理器切换到需要的模式,然后给SP赋值。需要注意的是:不要切换到 User模式进行该模式下的堆栈设置,因为进入User模式后就不能再操作CPSR返回到其他模式了。 先定义各种模式对应的CPSR寄存器M 的值,该值决定了进入何种模式,可参考相关数据手册。 Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT
[单片机]
TQ2440国嵌学院gboot-初始化
栈:后进先出的方式 满栈:SP指针指向最后一个入栈的数据 空栈:SP指针指向即将入栈数据的空位置 ARM采用满栈的方式 升栈:SP指针从低地址到高地址 降栈:SP指针从高地址到低地址 ARM采用降栈 ARM采用的是满降栈 栈的主要作为是:保存局部变量 由于我们这里是TQ2440的开发板,开发板的SDRAM为64M,有ARM是降栈的方式,采用最高地址是栈的初始地址,TQ2440的内存的地址是0X30000000,然后加上64M就是最高的内存地址,也就是SP指针指向0X34000000, 代码如下 init_stack: ldr sp,=0x34000000 mov
[单片机]
Part10-C语言环境初始化-C与汇编混合编程lesson4
1、为什么要混合编程 汇编语言:执行效率高;编写繁琐; 执行效率高;能够更直接地控制处理器。 c语言:可读性强,移植性好,调试方便。 1、汇编调用c函数 2、c调用汇编函数 汇编语言定义的函数(标号),需要把它定义为全局的。 在start.s中修改 在main.c中修改 3、c内嵌汇编 1、格式 输出部分:在使用汇编语句过程中,可能会把c语言中的变量的值修改了,就把这些变量放在这个部分。 输入部分:是在使用汇编时,从c语言中拿到一些参数来使用。 破坏描述部分:就是修改了某些寄存器的值,然后把对应寄存器放在这里 2、范例 这里的%0表示0号参数,汇编语句的作用是把%0处的参数写入c1寄存器,那么这个%0来自于输入
[单片机]
Part10-<font color='red'>C语言</font><font color='red'>环境</font><font color='red'>初始化</font>-C与汇编混合编程lesson4
基于S3C6410的ARM11学习(十三) C语言环境初始化
如今,汇编的部分,就剩下最后一步了。C语言环境初始化。因为后面的代码要用C语言来写了。毕竟C语言编写比汇编要容易对了,而且c程序具有易读性。 C程序要运行,一个最重要的东西就是栈了。因为有栈,c程序才能在程序跳转的时候,保存上文。然后在程序返回的时候,将保存的上文恢复。这样,才保证了调用函数之前和之后的上下文是不变的。 使用汇编代码写的话,是不用设置栈的,因为保护上下文是要用汇编在代码中自行写出的,而C代码是靠编译器编译自动加上的。 栈,有4种。 从图中可以看出四种栈的区别。栈都是放在内存空间的,因为要随时读写。栈的起始地址放在内存的高地址出,那么增长方向就是向下增长,这种就是递减栈。如果栈的起始地址放
[单片机]
基于S3C6410的ARM11学习(十三) <font color='red'>C语言</font><font color='red'>环境</font><font color='red'>初始化</font>
ARM裸机程序开发(十):C语言环境初始化
Part1 栈初始化 一、满/空栈 1.1 满栈:当堆栈指针SP总是指向最后压入堆栈的数据(ARM采用) 1.2 空栈:当堆栈指针SP总是指向下一个将要放入数据的空位置 二、升/降 栈 根据入栈时,SP指针的移动方向分:若从低——》高 为升栈,从高到低为降栈(ARM使用) 三、栈帧 定义:一个函数所使用的那一部分栈,称为栈帧 栈帧的两个边界 :fp(r11) 、 sp(r13) 三、栈作用 3.1 保存局部变量 3.2 传递参数 :当传递的参数大于4个时,使用栈来传递,否则,用通用寄存器来传递 3.3 传递寄存器的值 Part2 BSS段1初始化 Part3 从汇编跳
[单片机]
在ARM开发环境C语言的设置堆指针和清理BSS段的作用概述
以前稍微写过操作系统上的C程序,感受不出来:BSS段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了ARM上环境似乎没有那么简单了,C的环境要自己来创建,不然就不能用。这也深刻的感受到了C语言中原来难以理解的概念。 裸机建立C语言环境-设置堆栈指针 这个是使用C语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。 裸机建立C语言环境-清理BSS段 如果C语言中用到的全局变量或者静态变量,这个编译的时候是把它们放到了BSS段,这个段在内存中。怎么建成的?手动写一个链接脚本,添加__bss_start __bss_end变量来表示BSS段的开始和结束。如下: SECTION
[单片机]
在ARM开发<font color='red'>环境</font>下<font color='red'>C语言</font>的设置堆<font color='red'>栈</font>指针和清理BSS段的作用概述
ARM-bootloader-C语言环境设计
一、栈初始化 1、概念解析 1.1栈 栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出。栈底是第一个进栈的数据所处的位置,栈顶是最后进栈数据所处的位置。 1.2满栈和空栈 根据SP指针指向的位置,栈可以分为满栈和空栈。 1、满栈:当堆栈指针SP总是指向最后压入堆栈的数据 2、空栈:当堆栈指针SP总是指向下一个将要放入数据的空位置 ARM采用的是满栈 1.3、升/降栈 1、升栈:随着数据的入栈,SP指针从低地址- 高地址移动 2、降栈:随着数据的入栈,SP指针从高地址- 低地址移动 ARM采用的是降栈。有时候我们会说ARM采用的是满降栈。 1.4、栈帧
[单片机]
ARM-bootloader-<font color='red'>C语言</font><font color='red'>环境</font>设计
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved