0

试图在汇编程序中实现一个与系统无关的套接字 api 作为私有项目,我编写了以下代码来将字符串地址(DNS 或直接 IP)解析为 sockaddr 记录。 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 位上工作。

4

0 回答 0