【发布时间】:2026-01-29 10:45:02
【问题描述】:
我有 4 个示例函数:
void test_func1(void)
{
return;
}
void test_func2(int a)
{
return;
}
int test_func3(void)
{
return 0;
}
void test_func4(void)
{
int a;
a = a + 1;
return;
}
我用vxworks中的powerpc交叉编译工具编译,得到如下汇编代码,生成的elf文件和“objdump -d”命令。
00000f2c <test_func1>:
f2c: 94 21 ff f0 stwu r1,-16(r1)
f30: 93 e1 00 0c stw r31,12(r1)
f34: 7c 3f 0b 78 mr r31,r1
f38: 81 61 00 00 lwz r11,0(r1)
f3c: 83 eb ff fc lwz r31,-4(r11)
f40: 7d 61 5b 78 mr r1,r11
f44: 4e 80 00 20 blr
00000f48 <test_func2>:
f48: 94 21 ff e0 stwu r1,-32(r1)
f4c: 93 e1 00 1c stw r31,28(r1)
f50: 7c 3f 0b 78 mr r31,r1
f54: 90 7f 00 08 stw r3,8(r31)
f58: 81 61 00 00 lwz r11,0(r1)
f5c: 83 eb ff fc lwz r31,-4(r11)
f60: 7d 61 5b 78 mr r1,r11
f64: 4e 80 00 20 blr
00000f68 <test_func3>:
f68: 94 21 ff f0 stwu r1,-16(r1)
f6c: 93 e1 00 0c stw r31,12(r1)
f70: 7c 3f 0b 78 mr r31,r1
f74: 38 00 00 00 li r0,0
f78: 7c 03 03 78 mr r3,r0
f7c: 81 61 00 00 lwz r11,0(r1)
f80: 83 eb ff fc lwz r31,-4(r11)
f84: 7d 61 5b 78 mr r1,r11
f88: 4e 80 00 20 blr
00000f8c <test_func4>:
f8c: 94 21 ff d0 stwu r1,-48(r1)
f90: 93 e1 00 2c stw r31,44(r1)
f94: 7c 3f 0b 78 mr r31,r1
f98: 81 3f 00 08 lwz r9,8(r31)
f9c: 38 09 00 01 addi r0,r9,1
fa0: 90 1f 00 08 stw r0,8(r31)
fa4: 81 61 00 00 lwz r11,0(r1)
fa8: 83 eb ff fc lwz r31,-4(r11)
fac: 7d 61 5b 78 mr r1,r11
fb0: 4e 80 00 20 blr
最后,我在linux内核脚本目录checkstack.pl中使用了堆栈检查工具,并获取了它们的堆栈使用情况:
0x0f8c test_func4 [filecheck2.o]: 48
0x0f48 test_func2 [filecheck2.o]: 32
0x0f2c test_func1 [filecheck2.o]: 16
0x0f68 test_func3 [filecheck2.o]: 16
堆栈大小是汇编代码到第一条语句的结果
f2c: 94 21 ff f0 stwu r1,-16(r1)
f48: 94 21 ff e0 stwu r1,-32(r1)
f68: 94 21 ff f0 stwu r1,-16(r1)
f8c: 94 21 ff d0 stwu r1,-48(r1)
我的问题是为什么堆栈使用不同?尤其是函数“test_func2”和“test_func4”?
【问题讨论】:
-
您是否熟悉参数如何传递给函数,以及局部变量如何在内存中分配?
-
一点。我可以理解它们的含义并获得堆栈内存布局,但仍然无法理解为什么使用比实际参数和分配的局部变量更多的堆栈大小?只是对齐目的?还是其他原因?