Что такое соглашение о вызовах системного вызова OpenSolaris (x86)? - PullRequest
1 голос
/ 04 августа 2010

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

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

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

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

1 Ответ

2 голосов
/ 04 августа 2010

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

Edit:

OpenSolaris libc делает это так:

Сначала, когда вы звоните, пишите, проверьте некоторые вещи, а затем вызываете __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. И аргументы системного вызова write уже помещены в стек.

...