Я написал программу ac, которая использует библиотеку WINAPI (в частности, WSA-Sockets), и вместо компиляции исходного кода попросил компилятор испустить источник сборки вместо этого изучить, как он работает на более низком уровне.x86 WinAPI - Я не понимаю, как некоторые аргументы функции ссылаются в моей программе
При пересечении этой строки ниже я заметил в сборке, что нет ссылки на первый аргумент моей функции WINAPI. Функция MAKEWORD в WSAStartup.
Что на самом деле происходит здесь? Там нет ссылки в моей сборке кода 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 [email protected]
test eax, eax
je SHORT [email protected]
Примечание: Функция WSAStartup инициирует использование Winsock DLL процессом.
я могу предоставить больше информации, если это необходимо
'MAKEWORD' просто компилятор макросъемки (не функция), которая упаковывает байты в WORD - вы должны быть в состоянии найти определение в коллекции заголовка компилятора где-то (это, вероятно, выглядит примерно так:' #define MAKEWORD (x, y) (x << 8 + y) '. Посмотрите на байты в значении, которое нажимается на стек - 0x02, 0x02. –
' lea' - это «загружаемый эффективный адрес», который загружает адрес вычисленный из 'DWORD PTR _wsa $ [ebp]' в 'eax',' 514' выглядит как syscall для 'ioctl' (32-разрядный). Оба' eax' и '514' помещаются в стек, а затем похоже, что вызов выполняется для выполнения вашего запроса 'ioctl', с возвратом в' eax', проверенным после вызова. –
@ DavidC.Rankin: Ther e не является кодом IOCTL. Там также нет syscall. '514' - это первый аргумент, переданный в [WSAStartup] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms742213.aspx) (нажата на стек справа налево). Syscall происходит, когда код вызывает 'DWORD PTR __imp__WSAStartup @ 8'. «Test eax, eax», скорее всего, является сборкой версии 'if'. – IInspectable