Re: [Q] source code of connect system call
いいじまです。
> > ・ 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
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735