x86 WinAPI - я не понимаю, как на некоторые аргументы функций ссылаются в моей программе

Я написал AC-программу, которая использует библиотеку WINAPI (в частности, WSA-Sockets) и вместо компиляции исходного кода попросил компилятор создать исходный код сборки, чтобы изучить, как он работает на более низком уровне.

Когда я наткнулся на эту строку ниже, я заметил в сборке, что нет ссылки на первый аргумент моей функции WINAPI. Функция MAKEWORD в WSAStartup.

Что на самом деле здесь происходит? В моем ассемблерном коде нет ссылок на MAKEWORD, но есть подсказка о push 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 инициирует использование DLL-файла Winsock процессом.

Я могу предоставить больше информации, если это необходимо

3 ответа

Решение

MAKEWORD - это функциональный макрос препроцессора, который определяется как

#define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) |
                        ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))

Так как вы используете его с константами времени компиляции (2 а также 2), компилятор может вычислить окончательное значение, сдвинув второй аргумент на 8 бит влево и добавив первое: 2 << 8 + 2, Результат 512 + 2значение 514, которое вы видите, помещено в стек.

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   ]
.
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
Другие вопросы по тегам