hola
tuve curiosidad de pasar el socket que hice a 64 bits, pero tambien tuve problemas para vincular obj a exe, ya que gcc en windows solo funciona para 32bits, hay una version para 64 pero me tira errores, asi que opte por golink, pero encontre que se podia usar masm desde Visual studio, asi que opte por usar masm
hay algunas diferencias en entre nasm y masm sobre el codigo, pero tenia entendido que es mas universal asm, asi que para no complicarme hice el mismo codigo que ya tenia pero con las diferencias de masm, el codigo al compilarlo no me produce errores, pero aparece la pantalla de interrupcion que menciona que hay un error en ejecucion, desafortunadamente ollydbg tampoco funciona para ejecutables de 64 bits y no tengo mucha experiencia con el debugger que viene por defecto en visual studio, pero puse algunos break y tira el error en el primer "call", y posiblemente son todos los call
en nasm normalmente lo uso asi
mov[valor], eax
call [valor]
pero creo en masm eso no funciona, ya googlé varias veces, pero no encuentro como usar call en masm para 64 bits, o cual es la diferencia, etc, todo lo que encuentro es para 32bits
alguien podria explicarme, porque no funciona el codigo que hice?, acabo de empezar en estos dias con masm, asi que todavia hay diferencias que no comprendo, y siento que lo mas recomendable para ensamblador en windows seria masm y en linux seria nasm
por cierto, si me recomiendan mejor usar el IDE de masm en vez de Visual studio, puedo hacer el cambio, lo que sucede es que uso Visual Studio para programar en C o visual basic, aunque me gusta mas usar MinGW con codeblocks, pero ya que tengo esa IDE instalada, decidi mejor programar alli tambien en ensamblador
les dejo el codigo
extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC
.data
wstart db 400 dup (0)
wsdll db 'ws2_32.dll',0
wsaddr dq ?
WStp db 'WSAStartup',0
wstaddr dq ?
soc db 'socket',0
socaddr dq ?
conn db 'connect',0
conaddr dq ?
sen db 'send',0
senaddr dq ?
sre db "hola mundo",0
.code
Start proc
push rbp
mov rbp, rsp
mov rdx, offset[wsdll]
call LoadLibraryA
mov[wsaddr], rax
mov r8, offset[WStp]
mov r9, [wsaddr]
call GetProcAddress
mov[wstaddr], rax
lea rcx,[wstart]
push rcx
push 2
call [wstaddr]
mov r8, offset[soc]
mov r9, offset[wsaddr]
call GetProcAddress
mov[wstaddr], rax
push 0
push 1
push 2
call [wstaddr]
mov[socaddr], rax
mov r8, offset[conn]
mov r9, offset[wsaddr]
call GetProcAddress
mov[conaddr], rax
push 16
xor rax, rax
mov rax, 0100007f5c110002h
push rax
push qword ptr[socaddr]
call [conaddr]
mov r8, offset[sen]
mov r9, offset[wsaddr]
call GetProcAddress
mov[senaddr], rax
push 0
push 50
mov rcx, offset [sre]
push rcx
push qword ptr[socaddr]
call [senaddr]
xor ecx, ecx
call ExitProcess
mov rsp, rbp
pop rbp
Start endp
End
si encuetran codigo muy raro, es que use varias formas que encontraba en google pero ninguna funciono, aunque espero siga siendo entendible
salu2
Otra vez sin linea de comandos eh, yo use MASM:
ml64 /Zi /DEBUG sock64.asm /link /entry:Start /subsystem:console kernel32.lib
Otra vez tenes que DEPURAR tu codigo.
¿De donde sacaste la informacion sobre la convencion de llamadas en x64? El primer parametro va en RCX, el segundo en RDX, el tercero en R8, el cuarto en R9 y despues en la pila. Obviamente al llamar a LoadLibraryA no le estas pasando el nombre de la DLL donde se debe (en RCX) asi que esta retorna 0. Ahora segui vos con el resto ...
http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
disculpa, lo que sucede es que en visual studio se configura en opciones como se va a compilar sin necesidad de linea de comandos y lo de las llamadas lo saque de donde encontraba información en google, por eso esta revuelto
pero gracias, voy a seguir estudiando lo que mencionas
salu2
De nadas ::)
Ademas, se debe de seguir correctamente la convension de llamadas para 64-bits,
Se deja un padding que se le llama shadow space antes de llamar a una funcion y algunos detalles mas aqui:
http://en.wikipedia.org/wiki/X86_calling_conventions
mirar M x64 calling convention