простая сборка syscall не работает - PullRequest
1 голос
/ 28 января 2011

Я следую этим видеоурокам на языке ассемблера.Я в основном пытаюсь проработать пример "Привет, мир".Вот что у меня есть:

.data
str:
        .ascii "Hello World"

.text
.globl _start

_start:
        movl    $4, %eax
        movl    $1, %ebx
        movl    $str, %ecx
        movl    $11, %edx
        int     $0x80

        movl    $1, %eax
        movl    $0, %ebx
        int     $0x80

Это компилируется просто отлично, но когда я запускаю его, текст не выводится на терминал.Понятия не имею, что я делаю не так.Какое бы значение я ни поместил в регистр ecx, ничего не изменится, ничего не произойдет.

Кроме того, другой вопрос, как работает системный вызов при вызове инструкции int 0x80?Некоторые данные были перемещены в регистры, но когда мы попадаем в системный вызов, он не «использует» ни одно из этих значений.Идет ли он и получает то, что было перемещено в эти регистры самостоятельно?

Некоторая системная информация, которая может быть полезна:

dominic-@-freebsd-9 ~/dev/asm/tutorial > uname -a
FreeBSD freebsd-9 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006     root@perseus.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

Ответы [ 3 ]

1 голос
/ 28 января 2011

Я думаю, вам нужна эмуляция Linux, чтобы это работало. За подробностями обращайтесь к Руководству разработчика .

1 голос
/ 31 января 2011

FreeBSD имеет более «обычный» вызов конвенция, где номер системного вызова находится в eax, а параметры включены стек

ознакомьтесь с разделом freebsd этого привет-мира в сборке, посвященной

Я перехожу между ubuntu и netbsd, и это помогло мне написать ассемблер для обоих

* bsd использует стек для хранения аргументов файла des и длины записываемых байтов, в linux он просто хранится в регистрах eax и ebx, что в стиле linux, как у вас в вашем примере.

в Linux: _start:; указать точку входа компоновщика mov edx, len; длина сообщения MOV ECX, MSG; сообщение для записи mov ebx, 1; дескриптор файла (stdout) mov eax, 4; номер системного вызова (sys_write) int 0x80; вызвать ядро ​​

в freebsd:

_syscall:
    int0x80;system call
    ret 

_start:;tell linker entry point

    pushd word len;message length
    pushd word msg;message to write
    pushd word 1;file descriptor (stdout)
    move ax,0x4;system call number (sys_write)
    call _syscall;call kernel

использовать версию стека для системных вызовов на * bsd

0 голосов
/ 28 января 2011

Вам нужно установить% ebx равным 0 (стандартный вывод). Ваше текущее значение (1) означает стандартный ввод.

...