1

OpenSolaris syscall 呼び出し規約 (x86) とは何ですか?

Fe コンソールに文字列を表示するプログラムを 32bit アセンブリで書きたいと思っています。これには、「書き込み」syscall (番号 4) を使用したいと思います。書き込みの C 定義は次のとおりです。

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

fildesbuf、およびnbyte引数を保持するレジスタはどれですか? どの割り込みを呼び出す必要がありますか?

4

1 に答える 1

2

を呼び出す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に配置します。そして、書き込みシステムコールへの引数はすでにスタックにプッシュされています。

于 2010-08-04T07:41:06.740 に答える