【发布时间】:2014-05-02 19:12:16
【问题描述】:
我正在尝试通过查看从 clang 生成的程序集来学习 x86 程序集。例如,我想了解如何将 C 中的自动数组初始化为全 0。
int64_t my_array [3000] = {0};
看起来程序集在堆栈上保留 24000B ( 3000 * 64b / 8B/b ) 然后调用 memset。从 memset 的手册页中,它的签名看起来像:
void *
memset(void *b, int c, size_t len);
所以我知道应该在 %rsi 中传递的第二个参数是 0(我希望每个字节设置为的值),第三个参数 (%rdx) 是 $24000,但是第一个参数 (%rdi )?生成的程序集中的两个相关指令似乎是:
leaq -24016(%rbp), %rax
movq %rax, %rdi
但我不明白为什么基指针的 24016 为负数?为什么存储在 %rax 然后立即移动到 %rdi(可能是因为我只是没有进行优化编译)?
无论哪种方式,我都不确定如何将数组第一个字节的地址传递给 memset。我也在 OSX 上,所以我已经不得不将堆栈指针偏移 8B 才能组装。
【问题讨论】: