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

推荐阅读最新更新时间:2024-11-17 09:34

stm32学习笔记之USB中断配置初始化函数
● 中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上: ─ USB低优先级中断(通道20):可由所有USB事件触发(正确传输,USB复位等)。固件在处理中断前应当首先确定中断源。 ─ USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。 ─ USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。 USB_HP_CAN1_TX_IRQn= 19, /*! USB Device High Priority or CAN1 TX Interrupts */ USB_LP_CAN1_RX0_IRQn = 20, /*! USB Dev
[单片机]
stm32学习笔记之USB中断配置<font color='red'>初始化</font>函数
基于BASIC语言的BASCOM-8051开发环境单片机编程系统
BASCOM-8051开发环境是以BASIC语言为基础的单片机编程系统,具有易学易用、功能强大、开发周期短等特点。   一、命令分类示例   1、伪指令   伪指令是一些对开发环境的设置指令,如:$Large是说明应用程序大于2K;$Asm~$End Asm是使用汇编语言;$CrySTal是说明单片机应用系统中的时钟频率等等。   2、一般命令   这一类命令和BASIC语言中的命令用法、功能是一样的。如:For、To、Step、If、Else、End If、While……Wend、Select Case等,初学者十分容易掌握。   3、针对单片机硬件的命令   主要提供了直接对单片机及其外部硬
[单片机]
单总线技术及其应用
目前常用的微机与外设串行总线主要有我们熟悉的12C总线,SPI总线,SCI总线。其中12C总线是以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线是以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),SCI总线是以异步方式进行通讯(一条数据输入线,一条数据输出线)。这些总线至少需要有两条或两条以上的信号线。近年来,美国的达拉斯半导体公司(DALLAS SEMICONDUCTOR)推出了一套单总线(1-Wire Bus)技术,与上述总线不同,它采用单根信号线,即传输时钟,又传输数据,而且数据传输是双向的,在其线路简单、硬件开销少、成本低廉、便于总线的扩展和维护等优点。 单总线适用于单个主机系统,能够
[嵌入式]
定时器/计数器的初始化值的计算与计数程序举例
由于定时器/ 计数器 的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始货的步骤一般如下: 1、确定工作方式(即对TMOD赋值); 2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1); 3、根据需要开放定时器/计数器的中断(直接对IE位赋值); 4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。 下面介绍一下确定时时/计数器初值的具体方法。 因为在不同工作方式下计数器位数不同,因而最大计数值也不同。 现假设
[单片机]
STM32F103标准库开发----CAN总线通信实验----初始化/波特率
一、CAN总线通信初始化配置 1. CAN总线通信初始化配置流程 CAN总线GPIO和时钟配置 CAN总线接收中断优先级配置 CAN总线初始化配置 2. CAN总线GPIO和时钟配置 CAN引脚配置 CAN时钟配置: PA11和PA12引脚,CAN GPIO初始化,具体代码如下: /*CAN GPIO 和时钟配置 */ void CAN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /*GPIOA端口时钟使能*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
[单片机]
STM32F103标准库开发----CAN总线通信实验----<font color='red'>初始化</font>/波特率
MSP430 串口初始化,及串口操作
#include msp430x14x.h /* 关于UART0串口的配置,及操作函数说明 */ /* 一、uart0初始化*/ void uart0_idev_init(void) { P3SEL |= BIT4 + BIT5; // 1. 选择P3.4和P3.5做UART0通信端口 ME1 |= UTXE0 + URXE0; // 2. 使能USART0的发送和接受 UCTL0 |= CHAR; // 3. 选择8位字符 UTCTL0 |= SSEL0; // 4. 选择时钟源, ACLK :SSEL0 //
[单片机]
STM32F10x uart初始化以及寄存器说明
USART(Universal Synchronous Asynchronous Receiver Transmitter) 也就是通用同步异步收发。它根据NRZ非同步串行数据工业标准,提供了灵活的全双工数据交换功能。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及硬件控制操作(需要增加两个管脚,分别是CTS/RTS)。 这里我只简单讲讲如何用USART模块来实现标准EIA-232 串口通讯。 我们首先使用的是硬件控制,然后以中断方式实现了uart数据的收发。 1.uart管脚和clk初始化很简单,整个流程如下: int main(){
[单片机]
STM32F0(9)串口初始化
// 只初始化了RX功能,因为之前没有用到Tx功能,所以没有配置 void PM25_UART2_Init(void) // 串口UART2初始化 { RCC- APB1ENR |= RCC_APB1ENR_USART2EN; // 串口时钟使能 RCC- AHBENR |= RCC_AHBENR_GPIOAEN; // 打开串口所对应的GPIO引脚时钟 GPIOA- AFR |= 0x00001000; // 开启复用功能的对应AFIO(对应截图) GPIOA- MODER |= GPIO_MODER_MODER3_1; // 开启GPIO复用模式 GPIOA- MODER &= ~GPIO_MOD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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