Почему моя программа работает на Ubuntu gcc, но не на OSX gcc?

Итак, моя домашняя работа, я запустил ее в Ubuntu, и она компилируется отлично и работает так, как должно. Но когда я запускаю это в Mac OSX, он получает ошибку шины. Это почему?

Я компилирую с gcc -m32 source.c -o test

Вот версия Mac OSX (добавлены префиксы подчеркивания):

 #include  #include  #include  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 : mov (%eax),%eax 

Кроме того, я удаляю версию Ubuntu, поэтому есть меньше прокрутки.

Некоторые из ваших инструкций, например …

 mov (%esi), %eax 

… копируют более одного байта из буфера символов за раз. Я предполагаю, что это случайно? Вам следовало бы написать код в C, а затем использовать gcc -S и сравнить с вашим рукописным кодом. Даже если буферы выровнены по границе слова, вы увеличиваете указатели на один байт , поэтому можете попытаться прочитать неизмененную память. Сигбус в основном означает, что вы пытаетесь прочитать ценность памяти слова с адреса, который указывает на байт, который не находится в начале выровненного слова, но некоторые процессоры молча, если медленно сражаются, а другие выручают. Я не знаю аппаратных различий между вашими хостами.