не удалось вызвать системный вызов с помощью встроенного ассемблера gcc (64-разрядная версия)

Я пытаюсь вызвать системный вызов write с помощью встроенного ассемблера (gcc 4.2.1, Mac OS 10.7.5), код успешно компилируется, но вывода нет вообще. Это полный код:

int main()
{
    char s[] = "Test\n";
    // write(1, s, 5);
    asm(
        "movq $1, %%rax;"
        "movq $1, %%rdi;"
        "movq %0, %%rsi;"
        "movq $5, %%rdx;"
        "syscall;"
        :
        : "r"(s)
        : "%rax", "%rdi", "%rsi", "%rdx"
    );
}

Скомпилируйте с помощью gcc:

$ gcc main.c -o test

Бежать:

$ ./test

Запустив код с отладчиком Xcode 4.5, я получаю эту ошибку:

Thread 1: EXC_SYSCALL (code=1, subcode=0x1)

Что не так с кодом? Он успешно работает с Ubuntu 12.04 LTS.

Спасибо!


person qwertz    schedule 06.10.2012    source источник
comment
Системные вызовы не обязательно имеют одинаковые номера в Linux и Mac OS X. Вы можете найти много информации, просто отправившись в Google. Вот ссылка, описывающая перевод простой программы из Linux в Mac OS X: thexploit.com/secdev/mac-os-x-64-bit-assembly-system-calls   -  person Carl Norum    schedule 06.10.2012


Ответы (1)


Как я уже упоминал в своем комментарии выше, номер системного вызова отличается. Вам нужно поставить 0x2000004 в %rax, чтобы эта программа работала на Mac OS X.

Я также не совсем уверен, как ваша программа работает в Ubuntu, поскольку в вашем примере вы используете номер системного вызова exit 1, а не 4 для write.

person Carl Norum    schedule 06.10.2012
comment
Цифры в 32-битной и 64-битной версии Linux не совпадают. Посмотрите здесь: acsu.buffalo.edu/~charngda/linux_syscalls_64bit.html< /а> - person qwertz; 06.10.2012