我的ARM9代码中有一个使用varargs的数据转换功能。 我几年来一直在使用arm-elf yagarto发行版 没有问题。最近,我们升级到了arm-eabi-none 来自yagarto网站的yagarto包,我发现我们现在拥有 浮点值的问题。我最终发现的是 那个双打被强制转换为8字节的边界,并且是现有的 varargs浮点处理程序并不期望在args中找到空白。
我可以手动检查指针并将其强制为8字节 边界(事实上,我这样做了,完全解决了这个问题),但是 我想知道为什么会突然发生这种情况。
是否有编译器开关指定堆栈上的数据对齐方式, 或者在函数调用中,或类似的东西?为什么会这样呢 在32位(4字节)架构上默认为8字节边界??
我很感激任何人都可以提供的任何建议或见解 这些问题。
代码很简单:
.....
float floatValue = 10.0;
int intValue = 10;
char buffer[32];
...
snprintf (buffer, 32, "%g", floatValue); /* Here we are getting junk value bcz of 8-byte*/
snprintf (buffer, 32, "%lld", intValue); /* Here we are getting junk value bcz of 8-byte */
....
我们使用的GCC版本是4.7.1
编制选项:
`mabi=aapcs-linux
`mcpu=arm7tdmi/mcpu=arm946e-s`
`mfloat-abi=softfp`
`-mfloat-abi=softfp`
`-mfpu=vfp`
`-mstructure-size-boundary=8`
`-fomit-frame-pointer`
`-fshort-wchar`
`-fno-short-enums`