• Viernes 8 de Noviembre de 2024, 19:54

Autor Tema:  Traduccion De Codigo C A Ensamblador.  (Leído 5281 veces)

Instru

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
    • http://www.geocities.com/instructivus
Traduccion De Codigo C A Ensamblador.
« en: Martes 18 de Abril de 2006, 00:25 »
0
Bueno, mas o menos tengo la idea, pero no se pierde por preguntar.

Una instruccion en C:
if(algo==1)
{
//hacer algo
}
else
{
//hacer otra cosa
}

A que instrucciones de ensamblador se traduciria?

SAludos
Estoy aqui, estoy alla, estoy en todos lados!!!
Viva la emulacion!!!!

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #1 en: Martes 18 de Abril de 2006, 01:51 »
0
usando intensivamente la pila ( que es mas facil para el compilador) seria algo asi como

push word [ dir_de_algo ] ; suponiendo que algo es un word
push 1
pop ax
pop bx
cmp ax,bx
je .l0000011 ; el label lo genera el compilador asi que el nombre es medio extraño
//hacer otra cosa
jmp .l0000012
.l0000011:
//hacer algo
.l0000012:
// aca sigue el codifo despues del else

es algo asi mi cerebro no es un compilador tan groso como GCC :P

el proceso del compilador para generarlo seria algo asi como:

lee la primera linea, la divide en tokens
lee el primer token ( if ) entonces llama a la funcion que parsea el if
la funcion espera un parentesis
llama a la funcion que parsea expresiones booleanas (  && || que son las de mas alta precedencia) empuja la primera variable a la pila
encuentra u operador
no lo conoce llama a la funcion que maneja la segunda precedencia mas alta ( == < , > , <= etc )
encuentra el == prende un flag para acordarse de que es una operacion de igual
empuja el segundo termino en la pila
encuentra el ")" no lo conoce
procesa la expresion ( cmp ) y vuelve al  manejador de && ||
encuentra el ")" vuelve para arriba al if que si conoce el ")"
espera un retorno de carro
espera una sentencia o un {
encuentra un {
espera una expresion
llama al parser de expresiones por cada expresion que encuentre hasta un }
encuentra un else
espera un if o un {
encuentra un {
espera una expresion
llama al parser de expresiones por cada expresion que encuentre hasta un }

ya esta :P

me encanta el tema de compiladores, no se si fui muy claro

Instru

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
    • http://www.geocities.com/instructivus
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #2 en: Martes 18 de Abril de 2006, 02:10 »
0
Muy muy claro. Estuvo bastante bien la respuesta.
Solo me quedo una duda. Yo el ensambldor que manejo no es x86 entonces no se que significan unas de las instruccions, pero namas para aclarar dudas.
je .10 salta a .10 si el flag zero esta prendido?

Saludos
Estoy aqui, estoy alla, estoy en todos lados!!!
Viva la emulacion!!!!

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #3 en: Martes 18 de Abril de 2006, 04:13 »
0
si
je es jmp on equal, el cmp lo que hace es resta bx de ax y prende los flags.
je es lo mismo que jz porque si son iguales la resta da cero y se prende el flag de zero

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #4 en: Martes 18 de Abril de 2006, 08:50 »
0
Como nota graciosa les comento que este codigo hoy en dia no genera ni una instruccion en un buen compilador ya que estan muy optimizados  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #5 en: Martes 18 de Abril de 2006, 16:30 »
0
es verdad si no hay codigo entre las llaves no genera nada.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #6 en: Martes 18 de Abril de 2006, 17:56 »
0
Y si solo hay codigo redundante tampoco genera nada  :devil:

Código: Text
  1.  
  2. void func(int algo)
  3. {
  4.   if (algo == 1)
  5.   {
  6.     int x = 2;
  7.     x++;
  8.     x += 50 * 3;
  9.     x -= 2;
  10.     x *= 25;
  11.   }
  12.   else
  13.   {
  14.     int y = 2;
  15.     y++;
  16.     y += 50 * 3;
  17.     y -= 2;
  18.     y *= 25;
  19.   }
  20. }
  21.  
  22.  

?func@@YAXH@Z (void __cdecl func(int)):
  00000000: C3                 ret

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Instru

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
    • http://www.geocities.com/instructivus
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #7 en: Martes 18 de Abril de 2006, 20:07 »
0
Es de que los compiladores de ahora son mounstruos que estan de nuestro lado. Pero pueden ser nuestros peores enemigos cuando intentamos crearlos.

Otra pequeña duda.

Imaginemos que tienes una estructura.
Y en una funcion pasas como argumento por valor esa estructura. Que hay que hacer muchos pushs para meter toda la estructura al stack o sino como seria?.

struct mistruct{
   int a;
   long b[100][100];
   .
   .
};

struct mistruct *funcion(struct mistruct)
{
//hace algo con struct y la devuelve
}
Saludos
Estoy aqui, estoy alla, estoy en todos lados!!!
Viva la emulacion!!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #8 en: Martes 18 de Abril de 2006, 20:25 »
0
No hace muchos push's sino que actua como un memcpy con rep movs va copiando byte a byte en la pila  :smartass:

Todo esto lo podes probar muy facilmente con el VC++:

cl /c programa.cpp (con /c le decis que no enlace)
dumpbin /disasm programa.obj

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Instru

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
    • http://www.geocities.com/instructivus
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #9 en: Sábado 22 de Abril de 2006, 04:47 »
0
Bueno y otra duda medio rara sobre la traduccion de codigo.

No se si sea asi en las arquitecturs x86 pero en z80 no existen las instrucciones DB, DW, etc..para "declarar variables"

En primero lugar como se manejarian estas instrucciones? Y en si un int un char, etc como se manejarian?

Saludos
Estoy aqui, estoy alla, estoy en todos lados!!!
Viva la emulacion!!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Traduccion De Codigo C A Ensamblador.
« Respuesta #10 en: Sábado 22 de Abril de 2006, 10:49 »
0
Cita de: "Instru"
Bueno y otra duda medio rara sobre la traduccion de codigo.

No se si sea asi en las arquitecturs x86 pero en z80 no existen las instrucciones DB, DW, etc..para "declarar variables"

En primero lugar como se manejarian estas instrucciones? Y en si un int un char, etc como se manejarian?

Saludos
Esas no son instrucciones, en realidad son directivas del ensamblador, su objetivo es justamente "declarar variables", basicamente reservar una cantidad de bytes en una determinada posicion que puedan ser referenciados desde el codigo de assembly por su nombre. Estos bytes los reserva luego el S.O. de acuerdo al formato de ejecutable que tenga, en Windows muy probablemente uses la seccion .data y estas variables estaran tanto en memoria como en el ejecutable en si mismo en disco.

Un ejemplo enano:
Código: Text
  1.  
  2. .386
  3. .model flat, stdcall
  4.  
  5. .data
  6.   edad dd 760
  7. .code
  8. main:
  9.   mov eax, edad
  10. ret
  11. end main
  12.  
  13.  

ml dd.asm
dumpbin /all dd.obj

Vas a ver algo parecido a:
SECTION HEADER #2
   .data name
       4 virtual size
    2000 virtual address (00402000 to 00402003)
     200 size of raw data
     400 file pointer to raw data (00000400 to 000005FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

RAW DATA #2
  00402000: F8 02 00 00                                      ø...

Y 0x2F8 es justamente 760.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.