Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: dreams88 en 7 Febrero 2009, 12:00 pm



Título: Pasar programa C a ensamblador
Publicado por: dreams88 en 7 Febrero 2009, 12:00 pm
¡Hola!

Me gustaría pasar este programa de C a ensamblador subDLX. El programa es el siguiente:

#include <studio.h>

#define N 10 /*tamaño de los vectores*/

main ()
{
int v1[N]={2, 5, 7, 9, 10, 10, 9, 8, 7, 5};
int v2[N];
int x=0, suma1=0, suma2=0;

while (x<N) {

suma1+=v1(x);    /*Tendria q ser corchetes en (x) pero m sale mal*/
if (v1(x)>5) v2(x)=5;
else v2(x)=v1(x);
suma2+=v2(x);
x++
}

}

¿Alguien podría ayudarme?

Muchas gracias y un saludo


Título: Re: Pasar programa C a ensamblador
Publicado por: Ragnarok en 8 Febrero 2009, 11:43 am
Claro, pero antes lee las normas.


Título: Re: Pasar programa C a ensamblador
Publicado por: Arkangel_0x7C5 en 8 Febrero 2009, 19:15 pm
pues si no sabes se ASM, lo mas facil es copilarlo y en los parametros para el compilador le pones el que te lo deja en asm o compilarlo y despues desemsamblarlo


Título: Re: Pasar programa C a ensamblador
Publicado por: Shrick en 8 Febrero 2009, 21:13 pm
El gcc no convertía el código a ensamblador antes de enlazar?


Título: Re: Pasar programa C a ensamblador
Publicado por: -Ramc- en 8 Febrero 2009, 21:21 pm
El gcc no convertía el código a ensamblador antes de enlazar?
Sí, con el flag -s te da el código en asm.


Título: Re: Pasar programa C a ensamblador
Publicado por: bizco en 8 Febrero 2009, 22:06 pm
pero tampoco es tan dificil pasarlo.

Código:
v1    db 2,5,7,9,0Ah,0Ah,9,8,7,5
v2    db 10 dup(0)
x     db 0
suma1 db 0
suma2 db 0   

mov ecx,0Ah
bucle:
aqui pones lo demas que no tiene mayor complicacion. si no, hay que leer mas.
loop bucle


Título: Re: Pasar programa C a ensamblador
Publicado por: D4RIO en 11 Febrero 2009, 11:59 am
@ctlon: El code que pones no es ni similar al que se generaría, y por lo tanto no es correcto pasar el programa asi.... Debes crear la pila del main() para luego reservar los int e inicializar los datos inicializados al inicio. Para eso guardas la dirección de retorno y todo eso y luego de guardar ebp lo pones con esp.

A parte de eso creo que es bueno crear en la pila local 4 bytes de más para poner 2 punteros a los vectores... así es más simple acceder por subíndices, y también pasar los punteros como argumentos

Ahora que tienes la pila local a main reservas memoria... o sea restas 4*10 y 4*10 por los dos vectores, más 4*3 por las variables x, suma y suma2, y luego 2*2 por los dos punteros.
A eso le inicializas los datos con MOV y accedes a las variables por EBP....  ;)

Salu2


Título: Re: Pasar programa C a ensamblador
Publicado por: >FedeX< en 11 Febrero 2009, 14:24 pm
También se puede sin el EBP. Claro que tiene sus inconvenientes, pero puedes usar el EBP para otra cosa ;D (claro, con su respectivo push al principio)

Código
  1. N = 10
  2. main:
  3. sub ESP,(N*4)+(N*4)+(3*4) ; Todas las variables
  4. mov DWORD PTR SS: ESP,2
  5. mov DWORD PTR SS: ESP+4,5
  6. mov DWORD PTR SS: ESP+8,7
  7. mov DWORD PTR SS: ESP+12,9
  8. mov DWORD PTR SS: ESP+16,10
  9. mov DWORD PTR SS: ESP+20,10
  10. mov DWORD PTR SS: ESP+24,9
  11. mov DWORD PTR SS: ESP+28,8
  12. mov DWORD PTR SS: ESP+32,7
  13. mov DWORD PTR SS: ESP+36,5
  14. mov DWORD PTR SS: ESP+84,0 ; Supongo que quieres inicializar este a 0
  15. mov DWORD PTR SS: ESP+80,0 ; Supongo que quieres inicializar este a 0
  16. jmp .bucle
  17. .bucle2:
  18. mov EAX,DWORD PTR SS: ESP+80
  19. shl EAX,2
  20. add EAX,ESP
  21. mov EAX,DWORD PTR SS: EAX
  22. add DWORD PTR SS: ESP+84,EAX ; Suma1 += v1[x]
  23. cmp EAX,5
  24. jbe .comparo1
  25. mov EAX,DWORD PTR SS: ESP+80
  26. shl EAX,2
  27. add EAX,ESP
  28. add EAX,40
  29. mov DWORD PTR SS: EAX,5
  30. jmp .comparo1e
  31. .comparo1:
  32. mov EDX,DWORD PTR SS: ESP+80
  33. shl EDX,2
  34. add EDX,ESP
  35. add EDX,40
  36. mov DWORD PTR SS: EDX,EAX
  37. .comparo1e:
  38. INC DWORD PTR SS: ESP+80
  39. .bucle:
  40. cmp DWORD PTR SS: ESP+80,N
  41. jb .bucle2
  42. add ESP,(N*4)+(N*4)+(3*4) ; Todas las variables
  43. ret


Título: Re: Pasar programa C a ensamblador
Publicado por: Arkangel_0x7C5 en 11 Febrero 2009, 16:51 pm
pero tampoco es tan dificil pasarlo.
pero se supone que el que lo pregunto no sabe ASM para pasarlo a mano, el pregunto que como pofia traducirlo, porque seguramente quiere pasar otra cosa a ASM, por eso pienso yo que es mas util que le digamos como puede traducir cualquier code a ASM en vez de hacerle nosotros la traduccion

XAO


Título: Re: Pasar programa C a ensamblador
Publicado por: 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.
De todas formas te falta inicializar una de las variables... fijate que es:

Código
  1. int v1[N]={2, 5, 7, 9, 10, 10, 9, 8, 7, 5};
  2. int v2[N];
  3. int x=0, suma1=0, suma2=0;

Con lo que son 10 inicializaciones para los valores del arreglo v1, más las tres inicializaciones para x, suma1 y suma2...

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++).


Título: Re: Pasar programa C a ensamblador
Publicado por: >FedeX< en 11 Febrero 2009, 20:11 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...

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
  1. N = 10
  2. main:
  3. sub ESP,(N+N+2)*4 ; Todas las variables
  4. mov DWORD PTR SS: ESP,2 ; v1[0]
  5. mov DWORD PTR SS: ESP+4,5
  6. mov DWORD PTR SS: ESP+8,7
  7. mov DWORD PTR SS: ESP+12,9
  8. mov DWORD PTR SS: ESP+16,10
  9. mov DWORD PTR SS: ESP+20,10
  10. mov DWORD PTR SS: ESP+24,9
  11. mov DWORD PTR SS: ESP+28,8
  12. mov DWORD PTR SS: ESP+32,7
  13. mov DWORD PTR SS: ESP+36,5 ; v1[9]
  14. mov DWORD PTR SS: ESP+80,0 ; Suma1
  15. mov DWORD PTR SS: ESP+84,0 ; Suma2
  16. mov ECX,N-1
  17. .bucle:
  18. mov EAX,ECX
  19. shl EAX,2
  20. add EAX,ESP
  21. mov EAX,DWORD PTR SS: EAX
  22. add DWORD PTR SS: ESP+80,EAX ; Suma1 += v1[x]
  23. cmp EAX,5
  24. jbe .comparo1
  25. mov EAX,ECX
  26. shl EAX,2
  27. add EAX,ESP
  28. add EAX,40
  29. mov DWORD PTR SS: EAX,5
  30. add DWORD PTR SS: ESP+84,5 ; Suma2 += v2[x]
  31. jmp .comparo1e
  32. .comparo1:
  33. mov EDX,ECX
  34. shl EDX,2
  35. add EDX,ESP
  36. add EDX,40
  37. mov DWORD PTR SS: EDX,EAX
  38. add DWORD PTR SS: ESP+84,EAX ; Suma2 += v2[x]
  39. .comparo1e:
  40. DEC ECX
  41. cmp ECX,-1
  42. jne .bucle
  43. add ESP,(N+N+2)*4 ; Todas las variables
  44. ret



Título: Re: Pasar programa C a ensamblador
Publicado por: dark_hat en 11 Febrero 2009, 20:30 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.


Título: Re: Pasar programa C a ensamblador
Publicado por: D4RIO en 11 Febrero 2009, 20:51 pm
@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< :
Citar
Es 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
  1. .comparo1e:
  2. DEC ECX
  3. cmp ECX,-1 ; <<<<<<<<<<<<<<<<< WTH!
  4. 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!!


Título: Re: Pasar programa C a ensamblador
Publicado por: >FedeX< en 11 Febrero 2009, 21:47 pm
Código
  1. .comparo1e:
  2. DEC ECX
  3. cmp ECX,-1 ; <<<<<<<<<<<<<<<<< WTH!
  4. 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é:
Código:
	mov	ECX,N-1
y no
Código:
	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


Título: Re: Pasar programa C a ensamblador
Publicado por: D4RIO en 11 Febrero 2009, 22:03 pm
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


Título: Re: Pasar programa C a ensamblador
Publicado por: Arkangel_0x7C5 en 12 Febrero 2009, 00:47 am
pero en los procesadores actuales tarda menos hacer

Código
  1. bucle:
  2. .....
  3. .....
  4. .....
  5. dec ecx
  6. cmp ecx,0
  7. jne bucle
  8.  

que un loop
Al parecer han abandonado un poco el loop


Título: Re: Pasar programa C a ensamblador
Publicado por: dark_hat en 12 Febrero 2009, 01:24 am
pero en los procesadores actuales tarda menos hacer

Código
  1. bucle:
  2. .....
  3. .....
  4. .....
  5. dec ecx
  6. cmp ecx,0
  7. jne bucle
  8.  

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 (http://www.gui.uva.es/udigital/ap06.html)


Título: Re: Pasar programa C a ensamblador
Publicado por: D4RIO en 12 Febrero 2009, 01:34 am
Oh!!  :rolleyes:


Título: Re: Pasar programa C a ensamblador
Publicado por: Ragnarok en 14 Febrero 2009, 09:52 am
pero en los procesadores actuales tarda menos hacer

Código
  1. bucle:
  2. [...]
  3. jne bucle
  4.  

que un loop

¿por? ¿cuánto tarda cada cosa?


Título: Re: Pasar programa C a ensamblador
Publicado por: dark_hat en 15 Febrero 2009, 22:05 pm
¿por? ¿cuánto tarda cada cosa?

Mira la web que puse:

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

Los datos que hay son para 486 pero supongo que no habrá cambiado demasiado.


Título: Pasar programa C++ a ensamblador
Publicado por: ELARTISTAMAYOR en 7 Noviembre 2011, 05:32 am
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
int main ()
{
    clrscr();
    for (int i=1;i<=10000;i++)
    {
   cout<<i;
   if (i%3==0) cout<<" Es multiplo de 3" <<endl;
   else cout<<" No es multiplo de 3"<<endl;
    }
    getch();
    return 0;
}



Título: Re: Pasar programa C a ensamblador
Publicado por: elig en 14 Septiembre 2016, 15:00 pm
porfis ayudenme Necesito pasar este codigo a mips
while (a[1]>100)
          a[3]=100;