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

Итак, моя домашняя работа, я запустил ее в 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, чтобы было меньше прокрутки.


person Strawberry    schedule 07.04.2011    source источник
comment
Он просто говорит об ошибке шины, когда я запускаю его.   -  person Strawberry    schedule 07.04.2011


Ответы (1)


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

mov     (%esi), %eax

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

person Tony Delroy    schedule 07.04.2011