Errores de compilación de pasar de intel a AT&T

Iniciado por Nork, 24 Mayo 2009, 15:38 PM

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

Nork

Buenas :-* Estoy pasando un pequeño código que usa la sintaxis de intel a AT&T pero hay uno que se me resiste:

Código (asm) [Seleccionar]
__asm("movl  dword ptr args, %eax");

El error que me da el compilador del Dev C++ es:

Citarjunk `ptr args' after epresionje

He buscado por google pero no he encontrado nada de momento,

alguien tiene alguna idea?

Gracias!


P.D: No sé porque no sale bien el error :S Debería salir ex-pres-sion pero no sé porque se traduce a epresionje xD
C' Est La Vie

Arkangel_0x7C5

es por lo de: dword ptr

Seria movl 8(%ebp), %eax

si args es el primer argumento, si es el segundo seria 0xC(%ebp)
Si es una variable local entonces seria a partir de -4(%ebp) hacia abajo.
Y si es una gloval ($args).

Saludos

Nork

No entiendo, si dword ptr hace referencia a los argumentos que tiene que ver ebp? Y como sé que número menor que -5 tengo que poner?

Soy prácticamente nulo en asm y me pierdo en según que cosas :/


Gracias!
C' Est La Vie

ny0x

porque windows usa stdcall y atraves de esta los parametros se pasan en la pila, y ebp sirve como indice para apuntar a los valores guardados en la pila. ebp + 8 primer parametro ebp + 12 segundo ebp + 4 es la direccion de retorno. pero como es at&t es 12(%ebp) 8(%ebp).
bueno eso tengo entendido :P

Arkangel_0x7C5

#4
pues mira, ebp marca siempre el principio del espacio de pila. A medida que haces push el valor de esp, que marca la cima de la pila disminuye.

cuando haces:

push Param2
push Param1
call    MiFuncion

El call pone en la pila eip que luego usara el ret para volver, eso son esp+4 para el primer parámetro.
Después se hace push ebp, lo que son entonces esp+8 para el primer parámetro.

Y luego se copia el valor de esp en ebp.por lo que el primer parámetro es siempre ebp+8.

Y las locales, lo que se hace es restarle el tamaño de las var local a esp. Con lo que si tienes una variable local que ocupa 4bytes y es la primera, la encontraras en ebp-4. si es la segunda pues estara en ebp-(sizeVar1+sizeVar2).

Esto son cosas que se ven muy claras con el OllyDbg al depurar un programa que tu mismo has hecho en asm.

Saludos

EDITO:Ya esta YST tildes y todo.

YST

Una correción ortografica a arkangel es EIP ( IP ) no EPI :P 


Yo le enseñe a Kayser a usar objetos en ASM


Nork

C' Est La Vie