Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
栈stack
关于函数和栈调用的疑惑
发布于 2023-08-12 23:53:26 浏览:307
订阅该版
1. 编译器为 arm-none-eabi-gcc v10.3.1,优化等级为 -O0 2. 示例代码如下 ```c rt_thread_t s_test_thread = NULL; void test_func(void) { char array[10] = {0}; array[1] = 1; array[9] = 9; uint32_t num = 10; char buf[32] = {0}; buf[15] = 15; buf[31] = 31; } void test_func2(void) { char array[10] = {0}; } void test_func3(void) { char array[200] = {0}; } void test_thread(void *args) { test_func(); test_func2(); test_func3(); while (1) { sleep(1); } } int main(void) { s_test_thread = rt_thread_create("test", test_thread, NULL, 4 * 1024, 15, 10); rt_thread_startup(s_test_thread); while (1) { sleep(1); } return 0; } ``` 3. 反汇编代码如下 ```c void test_func(void) { 8000b80: b480 push {r7} 8000b82: b08d sub sp, #52 ; 0x34 8000b84: af00 add r7, sp, #0 char array[10] = {0}; 8000b86: 2300 movs r3, #0 8000b88: 623b str r3, [r7, #32] 8000b8a: f107 0324 add.w r3, r7, #36 ; 0x24 8000b8e: 2200 movs r2, #0 8000b90: 601a str r2, [r3, #0] 8000b92: 809a strh r2, [r3, #4] array[1] = 1; 8000b94: 2301 movs r3, #1 8000b96: f887 3021 strb.w r3, [r7, #33] ; 0x21 array[9] = 9; 8000b9a: 2309 movs r3, #9 8000b9c: f887 3029 strb.w r3, [r7, #41] ; 0x29 uint32_t num = 10; 8000ba0: 230a movs r3, #10 8000ba2: 62fb str r3, [r7, #44] ; 0x2c char buf[32] = {0}; 8000ba4: 2300 movs r3, #0 8000ba6: 603b str r3, [r7, #0] 8000ba8: 1d3b adds r3, r7, #4 8000baa: 2200 movs r2, #0 8000bac: 601a str r2, [r3, #0] 8000bae: 605a str r2, [r3, #4] 8000bb0: 609a str r2, [r3, #8] 8000bb2: 60da str r2, [r3, #12] 8000bb4: 611a str r2, [r3, #16] 8000bb6: 615a str r2, [r3, #20] 8000bb8: 619a str r2, [r3, #24] buf[15] = 15; 8000bba: 230f movs r3, #15 8000bbc: 73fb strb r3, [r7, #15] buf[31] = 31; 8000bbe: 231f movs r3, #31 8000bc0: 77fb strb r3, [r7, #31] } 8000bc2: bf00 nop 8000bc4: 3734 adds r7, #52 ; 0x34 8000bc6: 46bd mov sp, r7 8000bc8: bc80 pop {r7} 8000bca: 4770 bx lr void test_func2(void) { 8000bcc: b480 push {r7} 8000bce: b085 sub sp, #20 8000bd0: af00 add r7, sp, #0 char array[10] = {0}; 8000bd2: 2300 movs r3, #0 8000bd4: 607b str r3, [r7, #4] 8000bd6: f107 0308 add.w r3, r7, #8 8000bda: 2200 movs r2, #0 8000bdc: 601a str r2, [r3, #0] 8000bde: 809a strh r2, [r3, #4] } 8000be0: bf00 nop 8000be2: 3714 adds r7, #20 8000be4: 46bd mov sp, r7 8000be6: bc80 pop {r7} 8000be8: 4770 bx lr void test_func3(void) { 8000bea: b580 push {r7, lr} 8000bec: b0b2 sub sp, #200 ; 0xc8 8000bee: af00 add r7, sp, #0 char array[200] = {0}; 8000bf0: 2300 movs r3, #0 8000bf2: 603b str r3, [r7, #0] 8000bf4: 1d3b adds r3, r7, #4 8000bf6: 22c4 movs r2, #196 ; 0xc4 8000bf8: 2100 movs r1, #0 8000bfa: 4618 mov r0, r3 8000bfc: f03b fd82 bl 803c704
} 8000c00: bf00 nop 8000c02: 37c8 adds r7, #200 ; 0xc8 8000c04: 46bd mov sp, r7 8000c06: bd80 pop {r7, pc} ``` **疑问**: 1. 在 `test_func` 函数中,用到的栈空间为 46(10 + 4 + 32)字节,却预留 52 字节的空间,这多出来的 6 字节的用途是什么? 2. 在 `test_func2` 函数中,用到的栈空间为 10 字节,却预留 20 字节的空间,这多出来的 10 字节的用途是什么? 3. 在 `test_func3` 函数中,用到的栈空间为 200 字节,预留 200 字节的空间,刚刚好,和上面的两个函数不一样,这是为什么呢?
查看更多
aozima
2023-08-13
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
- 不同类型变量在一块会有对齐和填充 - 因有可能有浮点运算的原因,arm的函数栈要求8字节对齐 - 例如test_func2里面其实有对push/pop,`+20=24` - 更多的信息的内部行为,可能就得去研究gcc源码,以及生成的中间产物来理解了。
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
307
关于作者
Recca
这家伙很懒,什么也没写!
提问
8
回答
3
被采纳
0
关注TA
发私信
相关问题
1
局部变量的存储在哪段内存区域
2
内联函数不压栈,会因为中断导致栈内现场被破坏吗
3
串口输出线程输出异常
4
idle->sp被改写,导致内存溢出
5
如何在调试状态下查看线程堆栈的占用量?
6
map文件堆栈分配查看
7
请教线程堆栈的作用以及大小设置
8
如何打印出函数调用栈
9
线程初始化时栈地址为什么加4
10
rtthread中的栈设置请教?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
组件 lwip v2.0.3 版本使用 netdev网卡的 ping 功能
2
简单两步配置RTT源码阅读环境 vsc+clangd
3
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
4
LVGL使用字库IC芯片显示中文
5
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
4
次点赞
用RTT跑流水灯
1
篇文章
2
次点赞
catcatbing
1
篇文章
2
次点赞
YZRD
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部