Schönen guten Tag,
ich arbeite seit einiger Zeit mir Assembler und versuche dabei via getaddrinfo eine Domain aufzulösen. Jedoch scheint sich getaddrinfo bei dem Aufruf aufzuhängen, das Programm beendet sich nie. Interessant wird es allerdings wenn ich das gleiche Programm in C schreibe. Betrachte ich den dortingen Assemblercode im Debugger, so ist dieser exakt der gleiche wie meiner. Dennoch hängt sich das Programm auf ..
Code:
[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
Hier noch der entsprechende Code des C programms:
Code:
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>
Ich bin mittlerweile echt am verzweifeln und habe keine Ahnung woran es liegt. Der Stack sieht bei beiden Aufruf exakt gleich aus, die variante in C funktioniert jedoch?
Interessant ist auch, dass es auf anderen Rechner teilweise funktioniert. Ich benutze Windows 7 x64, das Program ist in x86 geschrieben. Auf Windows XP x86 lief es einwand frei.