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