Вопрос

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

Это было полезно?

Решение

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

Но в 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     <*>x80
        popa
        xorl    %ebx, %ebx
        movl    $exit, %eax
        int     <*>x80
.data
str:    .ascii "Hello, world!\n"
len = . -str
.globl  _start
$ as -o hwa.o hwa.S
$ ld hwa.o
$ ./a.out
Hello, world!

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top