【发布时间】:2013-12-24 01:00:34
【问题描述】:
我正在使用这段代码,但它在调试时给了我Segmentation fault。我正在使用 MinGW 进行编译:
#include <stdio.h>
#include <stdlib.h>
int CallMe(int a, int b)
{
printf("Called.");
return a + b;
}
int main()
{
printf("CallMe at 0x00%x\n", (unsigned int)&CallMe);
printf("Calling CallMe... ");
asm (
"movl $5, (%eax);\r\n"
"movl $4, (%ebx);\r\n"
"call 0x00401334;\r\n"
);
printf("\n");
return 0;
}
函数地址没问题。有什么想法吗?
提前致谢。
【问题讨论】:
-
尝试将 -S 选项传递给编译器以查看生成的程序集(输出将是 .s 文件)。将此与您尝试直接在 C 中调用函数(不使用 asm 块)进行比较。这应该给你一个很好的线索。如果没有,请在此处发布两个输出。
-
你怎么确定“函数地址没问题”?首先它可能不太好,如果操作系统使用地址空间布局随机化 (ASLR),它甚至可能在运行时随机变化。
-
@datenwolf,代码打印函数地址。我假设它根据调用指令打印相同的地址。
-
@davmac:嗯,实际上 printf 调用是错误的。它应该使用
%p格式并转换为void*才有用。此外,GCC 内联汇编允许在调用指令中使用符号,从而避免了硬编码的需要。 -
为什么不直接调用函数名呢?