Вы можете написать программу на 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 уже помещены в стек.