一.为什么要保证堆栈8字节对齐
AAPCS规则要求堆栈保持8字节对齐。如果不对齐,调用一般的函数也是没问题的。但是当调用需要严格遵守AAPCS规则的函数时可能会出错。
例如调用sprintf输出一个浮点数时,栈必须是8字节对齐的,否则结果可能会出错。
实验验证:
- #include "stdio.h"
- #include "string.h"
- float fff=1.234;
- char buf[128];
- int main(void)
- {
- sprintf(buf,"%.3f\n\r",fff);//A
- while(1);
- }
复制代码
1.在A处设置断点,让程序全速运行至A
2.在MDK中修改MSP的值使MSP满足8字节对齐
3.全速运行程序,观察buf中的字符为 1.234 结果正确
4.回到第2步,修改MSP使之只满足4字节对齐而不满足8字节对齐
5.全速运行程序,观察buf中的字符为 -2.000 结果错误
该实验证明了调用sprintf输出一个浮点数必须要保证栈8字节对齐。
二.编译器为我们做了什么
先看一个实验