Что такое соглашение о вызовах системных вызовов OpenSolaris (x86)?

Что такое соглашение о вызовах системных вызовов OpenSolaris (x86)?

Ф.э. Я хотел бы написать программу на 32-битной сборке, которая выводит строку на консоль. Для этого я хотел бы использовать системный вызов «запись» (№ 4). Определение C для записи:

ssize_t write(int fildes, const void *buf, size_t nbyte)

какие регистры должны содержать аргументы fildes, buf и nbyte? Какое прерывание я должен вызвать?


person antonone    schedule 04.08.2010    source источник


Ответы (1)


Вы можете написать программу на C, которая вызывает write, скомпилировать ее на ассемблере (используйте опцию -S). А затем изучите вывод, чтобы увидеть, как это делает компилятор.

Изменить:

OpenSolaris libc делает это следующим образом:

Сначала, когда вы вызываете write, он проверяет некоторые вещи, а затем вызывает __write:

pushl  0x10(%ebp)
pushl  0xc(%ebp)
pushl  0x8(%ebp)
call   c2730 <__write>

и __write тогда выглядит так:

<__write>:
call c2735 <__write+0x5>
pop    %edx
mov    $0x4,%eax
mov    %esp,%ecx
add    $0x10,%edx
sysenter
jae    c2751 <__write+0x21>
cmp    $0x5b,%eax
je     c2730 <__write>
jmp    2e0d0 <__cerror>
ret

Он помещает номер системного вызова записи в eax (4), указатель стека в ecx и адрес возврата в edx. И аргументы системного вызова записи уже помещены в стек.

person Jaka    schedule 04.08.2010
comment
Компилятор вызывает функцию записи из libc. То же самое, когда я использую функцию «syscall» для вызова системного вызова — она вызывает функцию «syscall» из libc. Я проанализирую реализацию этих функций в libc, когда у меня будет свободное время, но это время еще не пришло :) - person antonone; 04.08.2010