problema con masm para 64bits

Iniciado por Belial & Grimoire, 5 Agosto 2013, 02:56 AM

0 Miembros y 1 Visitante están viendo este tema.

Belial & Grimoire

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

Código (asm) [Seleccionar]
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

Código (asm) [Seleccionar]

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
.                                 

Eternal Idol

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
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Belial & Grimoire

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
.                                 

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

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