2015-06-13 5 views
0

У меня есть кусок ассемблера который делает write system call (это правильно?) Череззапись системных вызовов Аргумент Регистры

call [email protected] 

Прежде чем сделать это, значение rax, адрес rsp, edi, rsi и rdx установлены/изменены.

Как узнать, какие регистры используются в качестве аргументов для вызовов записи или системных функций вообще?

Я думаю, что для записи это rsp, edi и rsi поскольку в C он принимает 3 аргумента:

ssize_t write(int fd, const void *buf, size_t nbytes); 
+2

Посмотрите его [здесь] (http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64). – Michael

ответ

2

Когда вы call [email protected] не непосредственно вызвать системный вызов write(2), но крошечное обертка вокруг этого (крошечная функция C, которая выполняет команду syscall и устанавливает errno при сбое).

Таким образом, эта функция write использует стандарт C calling convention, определенный в ABI (прикладной двоичный интерфейс). Для Linux x86-64 читайте SysV ABI interface for x86-64

Также прочитайте также vdso(7), чтобы узнать, как на самом деле выполняются некоторые системные вызовы. Другие могут использовать машинную инструкцию SYSENTER и т. Д. Некоторые детали приведены в спецификации ABI (stricto sensu, real syscall не использует ни одного стека и передает аргументы & результатов через регистры). Читайте также Linux Assembly HowTo (более сфокусированный на 32 бит x86).

Кроме того, C standard libraries для Linux являются free software, как правило, GNU glibc или, возможно, musl-libc и т.д ... Так что изучать исходный код, чтобы понять, как exacty write реализуется.

Смежные вопросы