Я пишу на ассемблере и пытаюсь понять, как выполнить системный вызов execve, но вместо того, чтобы распечатывать вывод на терминал, я хотел бы знать, где он хранится, чтобы я мог использовать его позже, вроде как конвейерные команды.
Например, вот сборка для выполнения команды 'what' через execve, по сути выполняющая команду '$ which ls':
GLOBAL _start
SECTION .TEXT
_start:
XOR EAX,EAX
PUSH EAX
PUSH 0x68636968
PUSH 0x772f6e69
PUSH 0x622f7273
PUSH 0x752f2f2f
MOV EBX, ESP
PUSH EAX
PUSH 0x736c
MOV ESI, ESP
XOR EDX, EDX
PUSH EDX
PUSH ESI
PUSH EBX
MOV ECX, ESP
MOV AL, 0x0B; EXECVE SYSCALL NUMBER
INT 0x80
Строки 7-10 помещают в стек адрес /usr/bin/which
, а строка 13 помещает в стек аргумент ls
. Затем он помещает массив аргументов в стек и сохраняет его в ECX, где EBX указывает на адрес местоположения /usr/bin/which
, а EAX установлен на номер системного вызова 0xb (11) для системного вызова execve. При выполнении он возвращает /bin/ls
, местоположение ls
, которое мы просили его найти.
Как мне сохранить этот результат /bin/ls
где-нибудь для другого использования? Например, если бы я хотел продолжать писать код и использовать возвращаемое здесь как часть следующего фрагмента кода, как мне сохранить возвращаемое значение либо в регистре, либо в стеке?