Pasar programa C a ensamblador

Iniciado por dreams88, 7 Febrero 2009, 12:00 PM

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

>FedeX<

#10
Cita de: D4RIO en 11 Febrero 2009, 17:23 PM
De todas formas te falta inicializar una de las variables...

Todas están inicializadas, solo se me olvidó suma2, que no le dí uso...

Cita de: D4RIO en 11 Febrero 2009, 17:23 PM
Igual es un buen aporte puesto que es totalmente válido hacerlo así... pero me pregunto ¿porque no haces el bucle usando ECX?.... esta mal codificado, pero el bucle es un for( x=0 ; x<N ; x++).

Es cierto, pero si hubiese llamadas dentro del bucle, el contador podría perderse...

Entonces así estaría mejor
Código (asm) [Seleccionar]
N = 10
main:
sub ESP,(N+N+2)*4 ; Todas las variables
mov DWORD PTR SS: ESP,2 ; v1[0]
mov DWORD PTR SS: ESP+4,5
mov DWORD PTR SS: ESP+8,7
mov DWORD PTR SS: ESP+12,9
mov DWORD PTR SS: ESP+16,10
mov DWORD PTR SS: ESP+20,10
mov DWORD PTR SS: ESP+24,9
mov DWORD PTR SS: ESP+28,8
mov DWORD PTR SS: ESP+32,7
mov DWORD PTR SS: ESP+36,5 ; v1[9]
mov DWORD PTR SS: ESP+80,0 ; Suma1
mov DWORD PTR SS: ESP+84,0 ; Suma2
mov ECX,N-1
.bucle:
mov EAX,ECX
shl EAX,2
add EAX,ESP
mov EAX,DWORD PTR SS: EAX
add DWORD PTR SS: ESP+80,EAX ; Suma1 += v1[x]
cmp EAX,5
jbe .comparo1
mov EAX,ECX
shl EAX,2
add EAX,ESP
add EAX,40
mov DWORD PTR SS: EAX,5
add DWORD PTR SS: ESP+84,5 ; Suma2 += v2[x]
jmp .comparo1e
.comparo1:
mov EDX,ECX
shl EDX,2
add EDX,ESP
add EDX,40
mov DWORD PTR SS: EDX,EAX
add DWORD PTR SS: ESP+84,EAX ; Suma2 += v2[x]
.comparo1e:
DEC ECX
cmp ECX,-1
jne .bucle
add ESP,(N+N+2)*4 ; Todas las variables
ret



dark_hat

Cita de: D4RIO en 11 Febrero 2009, 17:23 PM
@>FedeX<: El problema con acceder a las variables subiendo por el stack es que no puedes mover el stack pointer de donde está, y si haces push o pop en algún momento todos los accesos a las variables deberían cambiar su offset respecto de éste.

Una puntualización, a las variables de la pila se accede por EBP, y push y pop modifican ESP, por lo que no pasa nada por hacer push o pop a la hora de acceder a las variables locales.
Eso que huele es un poco de incienso,
eso marrón una tableta de turrón...

D4RIO

@dark_hat:
Tenes toda la razon, pero... yo me referia el code que posteo >FedeX< en el que no se hace uso del EBP sino del ESP  ;D ...
Precisamente porque normalmente el acceso a las variables es en la pila y usando EBP, pero como bien postea >FedeX<, en éste caso no es necesario y se puede dejar a EBP libre.  ;)

@>FedeX< :
CitarEs cierto, pero si hubiese llamadas dentro del bucle, el contador podría perderse...
Normalmente las funciones solo modificarán el registro EAX, y para retornar datos >4bytes usarán punteros. De todas formas se puede guardar ECX en el stack si una función trata de modificarlo...

Código (ASM) [Seleccionar]
.comparo1e:
DEC ECX
cmp ECX,-1 ; <<<<<<<<<<<<<<<<< WTH!
jne .bucle


Pero para que usar ECX si vas a usar CMP???  :rolleyes:
Usa ECX y la orden LOOP  ;) ... ese es el uso correcto por el que ECX es el registro contador...
Cuando tenga tiempo lo hago y se los paso... ahora estoy saliendo del trabajo..

bye guys!!
OpenBSDFreeBSD

>FedeX<

Cita de: D4RIO en 11 Febrero 2009, 20:51 PM
Código (ASM) [Seleccionar]
.comparo1e:
DEC ECX
cmp ECX,-1 ; <<<<<<<<<<<<<<<<< WTH!
jne .bucle


Pero para que usar ECX si vas a usar CMP???  :rolleyes:
Usa ECX y la orden LOOP  ;) ... ese es el uso correcto por el que ECX es el registro contador...
Cuando tenga tiempo lo hago y se los paso... ahora estoy saliendo del trabajo..

bye guys!!

Eso habia hecho pero....
Reemplazé la variable x por ECX...
Entonces coloqué:
mov ECX,N-1
y no
mov ECX,N

v1 va solo de
  • a [9]... Es por eso que ECX inicializo como 9 (N-1)

    Ese N-1 hace que loop cuente 9 veces... Del 9 al 1

D4RIO

Eso lo entendi, pero la instrucción loop es precisamente para evitar usar un dec, un cmp un jump... es algo trivial, pero si se puede hacer mejor... just do it!

S2
OpenBSDFreeBSD

Arkangel_0x7C5

pero en los procesadores actuales tarda menos hacer

Código (asm) [Seleccionar]

bucle:
.....
.....
.....
dec ecx
cmp ecx,0
jne bucle


que un loop
Al parecer han abandonado un poco el loop

dark_hat

Cita de: juan113 en 12 Febrero 2009, 00:47 AM
pero en los procesadores actuales tarda menos hacer

Código (asm) [Seleccionar]

bucle:
.....
.....
.....
dec ecx
cmp ecx,0
jne bucle


que un loop
Al parecer han abandonado un poco el loop

O!, curioso, siempre se aprende algo.

http://www.gui.uva.es/udigital/ap06.html
Eso que huele es un poco de incienso,
eso marrón una tableta de turrón...

D4RIO

OpenBSDFreeBSD

Ragnarok

Cita de: juan113 en 12 Febrero 2009, 00:47 AM
pero en los procesadores actuales tarda menos hacer

Código (asm) [Seleccionar]

bucle:
[...]
jne bucle


que un loop

¿por? ¿cuánto tarda cada cosa?
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

dark_hat

Cita de: Ragnarok en 14 Febrero 2009, 09:52 AM
¿por? ¿cuánto tarda cada cosa?

Mira la web que puse:

http://www.gui.uva.es/udigital/ap06.html

Los datos que hay son para 486 pero supongo que no habrá cambiado demasiado.
Eso que huele es un poco de incienso,
eso marrón una tableta de turrón...