【发布时间】:2011-04-26 00:50:59
【问题描述】:
当我尝试在 Snow Leopard 上运行使用 gcc 4.2.1 编译的这段代码时,出现“总线错误”
#include <stdio.h>
/*__declspec(naked)*/ void
doStuff(unsigned long int val, unsigned long int flags, unsigned char *result)
{
__asm{
push eax
push ebx
push ecx
push edx
mov eax, dword ptr[esp + 24]//val
mov ebx, dword ptr[esp + 28]//flags
//mov ecx, dword ptr[esp + 32]//result
and eax, ebx
mov result, eax
pop edx
pop ecx
pop ebx
pop eax
ret
}
}
int main(int argc, char *argv[])
{
unsigned long val = 0xAA00A1F2;
unsigned long flags = 0x00100001;
unsigned char result = 0x0;
doStuff(val, flags, &result);
printf("Result is: %2Xh\n", result);
return 0;
}
我正在使用以下命令编译gcc -fasm-blocks -m32 -o so so.c,没有任何错误或警告。我正在尝试在 doStuff() 函数中运行一些汇编指令并将答案分配给结果。我做错了什么?
注意:这在 Windows 上的 Visual Studio 中运行良好,但我必须注释掉 declspec(naked) 才能让 gcc 在 Mac 上编译它。
【问题讨论】:
-
@styfle - 也许你的 mac os 是 64 位的,堆栈上的每个元素都是 8 字节长?你能检查一下吗?
-
@MByD 我有一个 64 位 CPU(Core 2 Duo),但 64 位内核未启用,这就是为什么我在编译时需要 -m32 参数,否则我会得到
suffix or operands invalid for push错误。 -
@MByD 或者它可能已启用,这就是我需要 -m32 参数的原因。现在我很困惑。另外,如果字长有问题,编译/汇编时会不会出错?
-
@styfle - 我不知道,我只是想给一个方向:)
-
@MByD 谢谢你的意见。你能在你的机器上编译和运行它吗?