Linux сборка горе - PullRequest
       8

Linux сборка горе

0 голосов
/ 29 октября 2009

Неужели нет способа вывести строку ascii в сборке на стандартный вывод без использования всех четырех регистров общего назначения?

Ответы [ 3 ]

6 голосов
/ 29 октября 2009

Да, для параметров требуется три регистра, плюс один для номера системного вызова ...

Но, x86 имеет pusha и popa, которые будут выдвигать и извлекать все регистры в одной инструкции.

$ cat hwa.S
write = 0x04
exit  = 0xfc
.text
_start:
        pusha
        movl    $1, %ebx
        lea     str, %ecx
        movl    $len, %edx
        movl    $write, %eax
        int     $0x80
        popa
        xorl    %ebx, %ebx
        movl    $exit, %eax
        int     $0x80
.data
str:    .ascii "Hello, world!\n"
len = . -str
.globl  _start
$ as -o hwa.o hwa.S
$ ld hwa.o
$ ./a.out
Hello, world!
1 голос
/ 29 октября 2009

Вы можете написать функцию, которая принимает необходимые аргументы из стека.

1 голос
/ 29 октября 2009

Ну что ж. Если вы связались с libc, вы можете позвонить puts, тогда у вас будет несколько регистров сохранения вызываемого абонента ...: -)

Но да. Интерфейс системного вызова передается по регистру. К сожалению.

Не будь таким шокированным. Это было бы так же, если бы вы выполняли вызов функции в некоторых соглашениях о вызовах. Для многих платформ это довольно стандартно. (Включая все известные мне компиляторы amd64 ...)

...