いいじまです。

> > ・ connectのアセンブラソースには
> > > レジスタ EAX に 0x66 を、EBX に 3 を、ECX には呼び出し元から
> > > 渡されたディスクリプタをセットして、割り込み 0x80 を発生させる
> >   というコードが書かれてある。

枝葉末節ですが、ソース読んで上記記述のミスに気づきました。ECX に渡される
のは、ディスクリプタの値ではなく、引数3つを記録しているスタック上の領域
へのポインタです。つまり、connect() は
        int connect(s, saddr, len);
と定義されていますが、呼び出されたときに、ESP が示すアドレスには、
        int32_t stack[4] = {戻り先アドレス, s, saddr, len};
という形でデータが格納されています。
で、ECX には、この表記でいうと &stack[1] に相当するものがセットされます。

MS-DOS での open() や execvp() の実装を知っている人間からすると、ちょっと
汚いコードに感じますね。まあ Linux の場合は MS-DOS と違って libc とカーネ
ルは実質的に一体のものだからいいんですけど。


> ENTRY (__socket)
> 
>         /* Save registers.  */
>         movl %ebx, %edx
> 
>         movl $SYS_ify(socketcall), %eax /* System call number in %eax.  */
> 
>         /* Use ## so `socket' is a separate token that might be #define'd.  */
>         movl $P(SOCKOP_,socket), %ebx   /* Subcode is first arg to syscall.  */
>         lea 4(%esp), %ecx               /* Address of args is 2nd arg.  */

========================================================================
飯嶋 浩光 / でるもんた・いいじま   http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta           mailto:delmonta@ht.sakura.ne.jp