elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Pasar a código ensamblador [Ayuda]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar a código ensamblador [Ayuda]  (Leído 7,962 veces)
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Pasar a código ensamblador [Ayuda]
« en: 6 Diciembre 2011, 04:46 »

Bueno, les cuento. Estoy haciendo un compilador para un lenguaje de programación que inventé (En realidad es una ****, pero bueno, algo es algo, es como parte de un trabajo final de una materia que estoy llevando en la universidad, tengo que entregarlo dentro de una semana), ya hice mi analizador léxico, el analizador sintáctico, el semántico y demás, ahora estoy en la parte de generación de código. Hice un algoritmo que genera código ensamblador basándose en mi árbol sintáctico. El problema es que genera un código ensamblador que no es "ensamblador" :p, lo simula, ya que NO sé ensamblador. Entonces, necesito ayuda para pasar de algo como esto:

Código:
inicio X
entero a = 1 + 2 * 3 - 5
fin;

A esto:

Código:
mov R0,#1 ; Movimiento
mov R1,#2 ; Movimiento
mov R2,#3 ; Movimiento
mul R1,R2     ;  Multiplicamos
add R0,R1     ; Sumamos
mov R1,#5 ; Movimiento
sub R0,R1        ; Restamos
mov a,R0    ; fin de la sentencia

SENTENCIA PARA MOSTRAR a

Que es lo que genero con el algoritmo que hice (sé que no es muy eficiente), ¿cómo quedaría en assembly real y qué más necesito para poder generar el ejecutable?

Disculpen mi ignorancia en este rubro pero es que estoy totalmente perdido en esto, necesito un poco de ayuda.

Saludos.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #1 en: 6 Diciembre 2011, 05:12 »

Bueno, les cuento. Estoy haciendo un compilador para un lenguaje de programación que inventé (En realidad es una ****, pero bueno, algo es algo, es como parte de un trabajo final de una materia que estoy llevando en la universidad, tengo que entregarlo dentro de una semana), ya hice mi analizador léxico, el analizador sintáctico, el semántico y demás, ahora estoy en la parte de generación de código. Hice un algoritmo que genera código ensamblador basándose en mi árbol sintáctico. El problema es que genera un código ensamblador que no es "ensamblador" :p, lo simula, ya que NO sé ensamblador. Entonces, necesito ayuda para pasar de algo como esto:

Código:
inicio X
entero a = 1 + 2 * 3 - 5
fin;

A esto:

Código:
mov R0,#1 ; Movimiento
mov R1,#2 ; Movimiento
mov R2,#3 ; Movimiento
mul R1,R2     ;  Multiplicamos
add R0,R1     ; Sumamos
mov R1,#5 ; Movimiento
sub R0,R1        ; Restamos
mov a,R0    ; fin de la sentencia

SENTENCIA PARA MOSTRAR a

Que es lo que genero con el algoritmo que hice (sé que no es muy eficiente), ¿cómo quedaría en assembly real y qué más necesito para poder generar el ejecutable?

Disculpen mi ignorancia en este rubro pero es que estoy totalmente perdido en esto, necesito un poco de ayuda.

Saludos.

No entiendo muy bien que es lo que quieres hacer deseas saber como quedaría
Código:
inicio X
entero a = 1 + 2 * 3 - 5
fin;

en ASM?

Si es así a los valores debes asignarle registros de propósito general por recomendación de 32 bits en código ASM

Código
  1. TITLE prueba (prueba.asm)
  2. INCLUDE c:\masm32\include\Irvine32.inc
  3. INCLUDELIB c:\masm32\lib\kernel32.lib
  4. INCLUDELIB c:\masm32\lib\Irvine32.lib
  5. INCLUDELIB c:\masm32\lib\User32.lib
  6. .data
  7. RESULTADO DWORD ?        ; Variable sin inicializar tipo DWORD (4 bits)
  8. .code
  9. main PROC
  10. mov ecx,3                         ; ECX = 3
  11. mov eax,2                         ; EAX = 2
  12. mov ebx,5                         ; EBX = 5
  13. mul ecx                             ; multiplica el valor de EAX con ECX y lo guarda en EAX
  14. not ebx                              ; invierte el valor de EBX (complemento a dos), invierte los bits y le suma 1 bit
  15. add eax,ebx                       ; suma EAX = 3*2 con EBX = -5 y lo almacena en eax
  16. inc eax                               ; aumenta en 1 el contenido de EAX
  17. mov RESULTADO,eax          ; mueve a la variable RESULTADO el valor de EAX
  18. exit
  19. main ENDPROC
  20. END main

utilicé librerías que facilitan la programación en ASM como es el caso de utilizar exit ya que sin estas librerías se debería utilizar la API ExitProcess junto con la directiva INVOKE

en cuanto para poder generar el ejecutable necesitas realizar dos cosas:

1)ensamblar
2)linkear

ensamblar consiste en transformar el código de fuente en lenguaje máquina pero sin incluir las librerías esto generaría un archivo llamado código objeto (.obj)

linkear consiste en juntar las librerías que haz utilizado junto con el programa, este generaría el .exe

para aquello puedes optimizarlo con IDE como MASM32 que incluye la opción build all así generaría el .exe inmediatamente

también esto puedes hacer desde batch una vez instalado el MASM32:

Código
  1. echo off
  2. :inicio
  3. cls
  4. set path=%PATH%;c:\masm32\bin
  5. echo Introduzca el nombre del archivo (ej prueba.asm):
  6. set /P file=
  7. cls
  8. ml /Cp /coff %file% /link /subsystem:console
  9. pause
  10. goto inicio
(*este es tu fuerte  :P)

con eso te ahorrarías tener que entrar al IDE de MASM32

Saludos

EI: juntando mensajes.

En cuanto a las bibliotecas estas no vienen por defecto en MASM32 deberías bajarla de la siguiente página:
http://kipirvine.com/asm/examples/IrvineExamplesVS2005.exe

Un autoextraible que contiene el .INC y las .LIB incluidas en el ejemplo

(solo por que me haz ayudado en batch jeje)


« Última modificación: 6 Diciembre 2011, 09:10 por Eternal Idol » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #2 en: 6 Diciembre 2011, 05:25 »

¡Gracias!

Pero bueno, la idea sería seguir el algoritmo (ya que no solo será esa expresión, sino que pudiera ser cualquier, incluso expresiones entre paréntesis y demás), que hice, mira:

Código:
inicio X
entero a = 1 + 2 * 3 - 5
fin;

Eso da como resultado "2", y sería seguir algo así:

Código:
mov R0,#1 ; Movemos el número "1" al registro R0
mov R1,#2 ; Movemos el número "2" al registro R1
mov R2,#3 ; Movemos el número "3" al registro R2
mul R1,R2     ;  Multiplicamos el registro R1 y R2, quedándose el resultado en R1, ya tenemos un 6
add R0,R1     ; Sumamos el registro R0 y R1, quedándose el resultado en R0, ya tenemos un 7
mov R1,#5 ; Movemos el número "5" al registro R1
sub R0,R1        ; Restamos el registro R0 y el registro R1, quedándonos un 2
mov a,R0    ; Asignamos el resultado a "a" (o a cualquier otra variable, no importa) ....


Sería fácil pasar eso a ASM?

Gracias por la ayuda.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #3 en: 6 Diciembre 2011, 07:11 »

¡Gracias!

Pero bueno, la idea sería seguir el algoritmo (ya que no solo será esa expresión, sino que pudiera ser cualquier, incluso expresiones entre paréntesis y demás), que hice, mira:

Código:
inicio X
entero a = 1 + 2 * 3 - 5
fin;

Eso da como resultado "2", y sería seguir algo así:

Código:
mov R0,#1 ; Movemos el número "1" al registro R0
mov R1,#2 ; Movemos el número "2" al registro R1
mov R2,#3 ; Movemos el número "3" al registro R2
mul R1,R2     ;  Multiplicamos el registro R1 y R2, quedándose el resultado en R1, ya tenemos un 6
add R0,R1     ; Sumamos el registro R0 y R1, quedándose el resultado en R0, ya tenemos un 7
mov R1,#5 ; Movemos el número "5" al registro R1
sub R0,R1        ; Restamos el registro R0 y el registro R1, quedándonos un 2
mov a,R0    ; Asignamos el resultado a "a" (o a cualquier otra variable, no importa) ....


Sería fácil pasar eso a ASM?

Gracias por la ayuda.

el codigo es el mismo que el primero :P
bueno para hacer un compilador de un X lenguajes me imagino que debes de saber bien el lenguaje al que debes de "convertirlo" :P
o podrias hacer algo asi:
digamos que el "lenguaje" seria C++... bueno tomo ese como referencia porque cada instruccion o expresion , sentencias va de ultimo el ";"
algo asi deberia ser recomandado tu lenguaje :P y en el texto que encuentre antes del ";", lo "tome" y convierta a ensamblador y eso tomando
en cuenta la precedencia, y tambien que algunos se ejecutan de izquierda a derecha o de derecha a izquierda pero eso me imagino que ya
lo haz decidido en tu lenguaje. bueno yo a penas empiezo en asm asi que al menos eso te puedo decir :P aunque eso creo que ya lo sabes :P
igual esperamos a Eternal Idol, _Enko que son buenos en asm


por cierto...
@UND3R
porque la instruccion NOT? no entendi :P
de hecho yo hice el codigo asi:


.data
   VAR DWORD ?
.code
   ; VAR = 1 + 2 * 3 - 5
   
   mov eax,2
   mov edx,3
   mul edx
   sub eax,5
   add eax,1
   mov VAR,eax

se me ocurrio saber como saber o que codigo o que formas son mas rapidas :P


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.642


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #4 en: 6 Diciembre 2011, 09:17 »

Que es lo que genero con el algoritmo que hice (sé que no es muy eficiente), ¿cómo quedaría en assembly real y qué más necesito para poder generar el ejecutable?

Depende del procesador (incluso en PC puede ser de 16, 32 o 64 bits). Para poder generar un ejecutable necesitas, ademas de comprender el modo real o el protegido (o long para 64 bits), el formato del ejecutable que quieras generar. No es lo mismo un COM (sin cabecera, puro codigo, lo mas simple y limitado) que un PE (ejecutable para Windows) o un ELF (ejecutable para Unix).

PD. Por favor no traigan mas la libreria esa de Irvine sin necesidad ...
En línea

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
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #5 en: 6 Diciembre 2011, 13:54 »

Tampoco puedes escribir codigo en assembly y pensar que cualquier ensamblador te lo tomaria.
Es decir, entre los distintos ensambladores hay ciertas diferencias. Asi que tendras que elegir que ensamblador usaras como back-end de tu compilador.

En EntryPoint estan enlazados:
http://foro.elhacker.net/asm/entry_point-t256455.0.html

cualquiera te serveria, lo unico a resaltar es que con masm32 solo podrias producir ejecutables para windows. Con Nasm/Fasm no tienes esa limitacion.

Saludos.
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Pasar a código ensamblador [Ayuda]
« Respuesta #6 en: 6 Diciembre 2011, 21:41 »

Tampoco puedes escribir codigo en assembly y pensar que cualquier ensamblador te lo tomaria.
Es decir, entre los distintos ensambladores hay ciertas diferencias. Asi que tendras que elegir que ensamblador usaras como back-end de tu compilador.

En EntryPoint estan enlazados:
http://foro.elhacker.net/asm/entry_point-t256455.0.html

cualquiera te serveria, lo unico a resaltar es que con masm32 solo podrias producir ejecutables para windows. Con Nasm/Fasm no tienes esa limitacion.

Saludos.

Entonces me interesa, ya que el compilador corre tanto en Windows y Linux, y necesito que sea portable. Voy a tener que leer sobre nasm/fasm, como se hacen operaciones aritméticas básicas.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Alguien sabe pasar codigo C a ensamblador ?
Ingeniería Inversa
Thor 2 4,122 Último mensaje 11 Diciembre 2004, 20:21
por Thor
Pasar programa C a ensamblador « 1 2 3 »
Programación General
dreams88 21 27,549 Último mensaje 14 Septiembre 2016, 15:00
por elig
Pasar 1 a PUERTO B Ensamblador
Electrónica
Riki_89D 8 6,516 Último mensaje 29 Diciembre 2013, 23:00
por pic16f84a
ayuda con este código en ensamblador
ASM
jim12328 6 2,526 Último mensaje 12 Mayo 2014, 22:42
por x64core
Pasar de c++ a ensamblador
Programación C/C++
kur79 6 5,764 Último mensaje 1 Enero 2015, 17:13
por kur79
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines