栈的概念(局部变量的入栈和出栈)

您所在的位置:网站首页 c语言入栈和出栈的区别 栈的概念(局部变量的入栈和出栈)

栈的概念(局部变量的入栈和出栈)

2024-07-12 16:17| 来源: 网络整理| 查看: 265

栈的概念 ARM架构

​ 在了解变量为什么保存在栈中之前,我们需要简单的了解一下ARM的架构和汇编指令。

在M3内核中,CPU有16个寄存器R0-R15,还有一个程序状态寄存器PSR。

寄存器名称R0 - R12暂存数据R13栈指针SPR14保存返回地址LRR15程序计数器PC 汇编指令

读内存:Load

# 示例 LDR R0, [R1, #4] ; 读地址"R1+4", 得到的4字节数据存入R0

写内存:Stroe

# 示例 STR R0, [R1, #4] ; 把R0的4字节数据写入地址"R1+4"

加减

ADD R0, R1, R2 ; R0=R1+R2 ADD R0, R0, #1 ; R0=R0+1 SUB R0, R1, R2 ; R0=R1-R2 SUB R0, R0, #1 ; R0=R0-1

比较

CMP R0, R1 ; 结果保存在PSR(程序状态寄存器)

跳转

B main ; Branch, 直接跳转 BL main ; Branch and Link, 先把返回地址保存在LR寄存器里再跳转 反汇编

反汇编的指令如下:

fromelf --text -a -c --output=xxx.dis xxx.axf 局部变量的定义

​ 局部变量是保存在栈中的,那么栈又是什么东西?变量又是怎么入栈和出栈的?

​ 栈是一块内存,由用户指定栈的指针,在keil中可以设置。单片机上电执行的第一句一般是设置栈,而不是执行main函数,如下所示:

RESET __Vectors 0x08000000: 20010000 ... DCD 536936448 0x08000004: 08000009 .... DCD 134217737 Reset_Handler 0x08000008: f000f81a .... BL main ; 0x8000040

单片机上电从0x08000000开始执行,20010000是设置栈指针,08000009是跳转到08000008位置开始执行,最低位表示使用的是何种指令集。0表示ARM指令集(32位),1表示Thumb指令集(16位)。

int main() { volatile int a = 1; volatile char b = 'b'; }

上面代码用汇编语言如下所示:

PUSH {r2,r3,lr} ;把LR和R3、R2压入栈中 R2、R3给变量a,b占位 MOVS r0,#1 ;把1赋值给R0 STR r0,[sp,#4] ;把R0存到sp+4的地址中 MOVS r0,#0x62 ;把0x62赋值给R0 STR r0,[sp,#0] ;把R0存到sp+0地址中 MOVS r0,#0 ;R0清零 POP {r2,r3,pc} ;R2 R3 PC出栈 PC = LR MOVS r0,r0

SP为当前栈指针的位置,栈空间如下图所示:

栈 LR = 返回地址


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3