0

私は WINAPI ライブラリ (具体的には WSA - ソケット) を使用する ac プログラムを作成し、ソース コードをコンパイルする代わりに、アセンブリ ソースを発行するようにコンパイラに要求し、それが下位レベルでどのように機能するかを調べました。

以下の行に出くわしたとき、アセンブリに、WINAPI 関数の最初の引数への参照がないことに気付きました。WSAStartup の MAKEWORD 関数です。

ここで実際に何が起こっているのでしょうか? 私のアセンブリ コードには MAKEWORD への参照はありませんが、プッシュ 514 のヒントがあります。


 ; source code   :     if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)

     lea     eax, DWORD PTR _wsa$[ebp]  ;_wsa$ is second arg
     push    eax
     push    514            ; 00000202H ???
     call    DWORD PTR __imp__WSAStartup@8
     test    eax, eax
     je  SHORT $LN4@main

注: WSAStartup 関数は、プロセスによる Winsock DLL の使用を開始します。

必要に応じてさらに情報を提供できます

4

3 に答える 3

1
MAKEWORD(a,b) is a macro that combine two BYTES (LOBYTE & HIBYTE) to make a word as the name says 

the result you have in:  push    514            ; 00000202H
is a (DWORD)(WORD) 0x0202

00 00   02 02 
        HB LB
[WORD]  [WORD]
[    DWORD   ]
.
于 2015-10-19T01:31:24.717 に答える
0
lea  eax, DWORD PTR _wsa$[ebp]     ; eax = pointer to WSADATA structure
push eax                           ; set second argument = eax
push 514                           ; set first argument = version 2.2
call DWORD PTR __imp__WSAStartup@8 ; call WSAStartup
test eax, eax                      ; eax = result. Is it zero?
je   SHORT $LN4@main               ; yes, success. Go do stuff.
                                   ; no, error code starts here
于 2015-10-19T01:27:35.813 に答える