尝试在汇编程序中实现一个独立于系统的套接字api作为私有项目,我编写了以下代码来解析sockaddr记录的字符串地址(DNS或直接IP)。 MSDN告诉我使用getaddrinfo。
[import getaddrinfo Ws2_32.dll]
[extern getaddrinfo]
[section .data use32 class=data]
google db 'www.google.com', 0
[section .code use32 class=code]
main:
push ebp
mov ebp, esp
call socket.initialise ; calls successfully (debugger) WSAStartup
push google
call address.translate
[...]
; address.translate(string) : address
address.translate:
push ebp
mov ebp, esp
sub esp, 0x04
.prepareSystemCall:
xor eax, eax
mov dword [ebp-0x04], eax
.callSystemLookup:
lea edx, [ebp-0x04]
push edx
push 0
push 0
push dword [ebp+0x08]
call [getaddrinfo] ; never returns
.return:
leave
ret 4
但getaddrinfo的调用永远不会返回,因此没有错误代码或其他内容。为了找到问题,我在c中编写了相同的程序,它可以工作(!?)并查看生成的汇编程序代码:
004016DD 83EC 08 sub esp, 8
004016E0 C745 DC 00000000 mov [dword ss:ebp-24], 0
004016E7 8D45 DC lea eax, [dword ss:ebp-24]
004016EA 894424 0C mov [dword ss:esp+C], eax
004016EE C74424 08 00000000 mov [dword ss:esp+8], 0
004016F6 C74424 04 00000000 mov [dword ss:esp+4], 0
004016FE C70424 64504000 mov [dword ss:esp], a.00405064 ; ASCII "www.google.de"
00401705 E8 12020000 call <jmp.&ws2_32.getaddrinfo>
它并不相同,但在调用之前,两个示例中的堆栈完全相同。为什么getaddrinfo不会返回?
我使用nasm和alink在Windows 7 64位上工作。