2011-04-07 2 views
1

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

Я компиляции с 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; 
} 

Update:

Я запустил его в 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, поэтому есть меньше прокрутки.

+0

Он просто говорит «Ошибка шины», когда я запускаю его. – Strawberry

ответ

1

Некоторые из ваших команд, как ...

mov  (%esi), %eax 

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

Смежные вопросы