为什么我的程序运行在Ubuntu gcc上而不是OSX gcc上?

为什么我的程序运行在Ubuntu gcc上而不是OSX gcc上?,c,gcc,inline-assembly,C,Gcc,Inline Assembly,所以我的家庭作业,我在Ubuntu中运行了它,它编译得很好,运行方式和它应该的一样。但是当我在MacOSX中运行这个程序时,它会得到一个总线错误。为什么呢 我正在使用gcc-m32 source.c-o测试编译 以下是Mac OSX版本(添加了前缀下划线): #包括 #包括 #包括 字符短语[]=“缓慢但肯定”; int sz; 国际用语; char*arg; 字符*结果; //在此处添加您可能需要的任何额外变量。 int main(int argc,char*argv[]){ 如果(argc!

所以我的家庭作业,我在Ubuntu中运行了它,它编译得很好,运行方式和它应该的一样。但是当我在MacOSX中运行这个程序时,它会得到一个总线错误。为什么呢

我正在使用
gcc-m32 source.c-o测试编译

以下是Mac OSX版本(添加了前缀下划线):

#包括
#包括
#包括
字符短语[]=“缓慢但肯定”;
int sz;
国际用语;
char*arg;
字符*结果;
//在此处添加您可能需要的任何额外变量。
int main(int argc,char*argv[]){
如果(argc!=2){
printf(“用法:%s接受1个字符串参数。\n”,argv[0]);
出口(1);
}
//分配内存并将参数字符串复制到arg中。
sz=strlen(argv[1])+1;
arg=malloc(sz);
strcpy(arg,argv[1]);
//为结果分配大量内存。
短语sz=strlen(短语)+1;
结果=malloc(sz*phrasesz);
//现在将短语复制到结果中,同时替换空格
//使用空格+arg+空格。
__asm\uuuu(“\n\
学习短语%esi\n\
movl\u结果,%ebx\n\
外部环路:\n\
cmpb$0,(%esi)\n\
je已完成\n\
forLoop:\n\
cmpb$32,(%esi)\n\
je endLoop\n\
cmpb$0,(%esi)\n\
je已完成\n\
mov(%esi),%eax\n\
mov%eax,(%ebx)\n\
包含%ebx\n\
包括%esi\n\
jmp forLoop\n\
结束循环:\n\
mov(%esi),%eax\n\
mov%eax,(%ebx)\n\
包含%ebx\n\
包括%esi\n\
移动参数%edx\n\
copyArgv1IntoResult:\n\
cmpb$0,(%edx)\n\
je已完成复制argv1\n\
mov(%edx),%ecx\n\
mov%ecx,(%ebx)\n\
包含%ebx\n\
包含%edx\n\
jmp copyArgv1IntoResult\n\
已完成的复制argv1:\n\
movb$32,(%ebx)\n\
包含%ebx\n\
jmp外部环路\n\
已完成:\n\
movb$0,(%ebx)\n\
");
printf(“%s\n”,结果);
返回0;
}
更新:

我在gdb调试器中运行了它,这就是我得到的错误

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00001ee8 in finished ()
1: x/i $pc  0x1ee8 <finished+11>:   mov    (%eax),%eax
程序收到信号EXC\u访问错误,无法访问内存。
原因:地址0x00000000处的内核保护失败
0x00001ee8已完成()
1:x/i$pc 0x1ee8:mov(%eax),%eax

另外,我正在删除Ubuntu版本,这样可以减少滚动。

您的一些说明,如

mov     (%esi), %eax

…正在一次从字符缓冲区复制多个字节。我想那是偶然的?您最好用C编写代码,然后使用gcc-S并与手工编写的代码进行比较。即使缓冲区与字边界对齐,指针也会增加一个字节,因此肯定会尝试未对齐的内存读取。sigbus基本上意味着您正试图从一个地址读取一个字的内存,该地址指向一个字节,该字节不在对齐字的开头,但如果一些CPU缓慢地继续战斗,而另一些CPU退出,则会保持沉默。我不知道主机之间的硬件差异。

您的一些说明,如

mov     (%esi), %eax
…正在一次从字符缓冲区复制多个字节。我想那是偶然的?您最好用C编写代码,然后使用gcc-S并与手工编写的代码进行比较。即使缓冲区与字边界对齐,指针也会增加一个字节,因此肯定会尝试未对齐的内存读取。sigbus基本上意味着您正试图从一个地址读取一个字的内存,该地址指向一个字节,该字节不在对齐字的开头,但如果一些CPU缓慢地继续战斗,而另一些CPU退出,则会保持沉默。我不知道主机之间的硬件差异。

我运行它时,它只是说“总线错误”。我运行它时,它只是说“总线错误”。