如何解决在 C 中的 CHAR 之后存储 INT 需要 7 个字节而不是 4
我正在研究以下 C 代码片段:
char x = 'a';
int y = 5;
运行 gdb 后,我遇到以下程序集:
mov BYTE PTR [ebp-1],0x61
mov DWORD PTR [ebp-8],0x5
为什么 ebp
减少了 7 而不是 4?如果我用 char x = 'a'
替换 int x = 2
,我不会看到这种行为。
解决方法
在您的 C 实现中,int
对象必须存储在四的倍数的地址处,通常是由于硬件对齐要求或功能。已知 EBP 寄存器中的地址是 4 的倍数(可能是 16 的倍数,具体取决于您的 C 实现)。所以 [ebp-5]
不会是四个字节的倍数,[ebp-6]
或 [ebp-7]
也不会。编译器必须转到 [ebp-8]
才能得到下一个 4 的倍数。
([ebp-2]
、[ebp-3]
和 [ebp-4]
不被考虑,因为在这些地址中的任何一个开始一个四字节的 int
将与 {{1} } 用于 [ebp-1]
。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。