gcc在函数调用后破坏rax值

时间:2013-03-31 09:50:10

标签: gcc assembly nasm intel

我正在重写ASM中的一些C函数来练习。 我的memset函数将RAX设置为RDI寄存器中传递的相同地址。 但是gcc正在使用AL指令扩展CDQE的值。

char super[] = "suuuuuuuuuuper";

res = memset(super, 't', 4);
printf("memset = {%s} (%p) res = %p\n", super, super, res);

输出:

memset = {ttttuuuuuuuper} (0x7fffffd30250) res = 0xffffffffffd30250

如果我尝试访问res中存储的地址,则会发生分段错误。 我只需编辑二进制文件并将CQDE调用替换为两个NOP指令,它就会完美运行。

但是我想知道是否还有别的东西,例如GCC旗帜以避免这个电话?

1 个答案:

答案 0 :(得分:3)

确保调用memset()的代码看到了memset()的正确原型,因此它知道该函数返回void*而不是int

当然,您还需要将-fno-builtin-memset选项传递给编译器(或类似的东西),以确保编译器完全调用您的函数。