gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:15 27 4
gpt4 key购买 nike

所以我的作业是,我在 Ubuntu 中运行了它,它编译得很好并且运行正常。但是当我在 Mac OSX 中运行它时,它会出现总线错误。这是为什么?

我正在使用 gcc -m32 source.c -o test 进行编译

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

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char phrase[] = "slow but sure";
int sz;
int phrasesz;
char *arg;
char *result;

// Add any extra variables you may need here.

int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: %s takes 1 string argument.\n", argv[0]);
exit(1);
}

// Allocate memory and copy argument string into arg.

sz = strlen(argv[1]) + 1;
arg = malloc(sz);
strcpy(arg, argv[1]);

// Allocate lots of memory for the result.

phrasesz = strlen(phrase) + 1;
result = malloc(sz * phrasesz);

// Now copy phrase into result, while replacing SPACE
// with SPACE+arg+SPACE.

__asm__("\n\
leal _phrase, %esi\n\
movl _result, %ebx\n\
outerLoop:\n\
cmpb $0, (%esi)\n\
je finished\n\
forLoop:\n\
cmpb $32,(%esi)\n\
je endLoop\n\
cmpb $0, (%esi)\n\
je finished\n\
mov (%esi), %eax\n\
mov %eax, (%ebx)\n\
incl %ebx\n\
incl %esi\n\
jmp forLoop\n\
endLoop:\n\
mov (%esi), %eax\n\
mov %eax, (%ebx)\n\
incl %ebx\n\
incl %esi\n\
movl _arg, %edx\n\
copyArgv1IntoResult:\n\
cmpb $0, (%edx)\n\
je finishedCopyingArgv1\n\
mov (%edx), %ecx\n\
mov %ecx, (%ebx)\n\
incl %ebx\n\
incl %edx\n\
jmp copyArgv1IntoResult\n\
finishedCopyingArgv1:\n\
movb $32, (%ebx)\n\
incl %ebx\n\
jmp outerLoop\n\
finished:\n\
movb $0, (%ebx)\n\
");

printf("%s\n", result);
return 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

此外,我正在删除 Ubuntu 版本,这样滚动就更少了。

最佳答案

您的一些说明,例如...

mov     (%esi), %eax

...一次从字符缓冲区复制一个以上的字节。我认为这是偶然的?你最好用 C 语言编写代码,然后使用 gcc -S 并与你手写的代码进行比较。即使缓冲区与字边界对齐,您也会将指针递增一个字节,因此一定会尝试进行未对齐的内存读取。 sigbus 基本上意味着您正在尝试从指向一个不在对齐字开头的字节的地址读取一个字的内存值(value),但是如果缓慢地战斗,一些 CPU 会默默地进行,而其他 CPU 则会退出。我不知道你们主机之间的硬件差异。

关于c - 为什么我的程序在 Ubuntu gcc 上运行而不是 OSX gcc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com