0

我正在重写 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 标志?

4

1 回答 1

3

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

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

于 2013-03-31T10:13:06.147 回答