Cita de: Leo Gutiérrez. en 6 Diciembre 2011, 04:46 AM
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 [Seleccionar]inicio X
entero a = 1 + 2 * 3 - 5
fin;
A esto:Código [Seleccionar]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 [Seleccionar]
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 (asm) [Seleccionar]
TITLE prueba (prueba.asm)
INCLUDE c:\masm32\include\Irvine32.inc
INCLUDELIB c:\masm32\lib\kernel32.lib
INCLUDELIB c:\masm32\lib\Irvine32.lib
INCLUDELIB c:\masm32\lib\User32.lib
.data
RESULTADO DWORD ? ; Variable sin inicializar tipo DWORD (4 bits)
.code
main PROC
mov ecx,3 ; ECX = 3
mov eax,2 ; EAX = 2
mov ebx,5 ; EBX = 5
mul ecx ; multiplica el valor de EAX con ECX y lo guarda en EAX
not ebx ; invierte el valor de EBX (complemento a dos), invierte los bits y le suma 1 bit
add eax,ebx ; suma EAX = 3*2 con EBX = -5 y lo almacena en eax
inc eax ; aumenta en 1 el contenido de EAX
mov RESULTADO,eax ; mueve a la variable RESULTADO el valor de EAX
exit
main ENDPROC
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 (bash) [Seleccionar]
echo off
:inicio
cls
set path=%PATH%;c:\masm32\bin
echo Introduzca el nombre del archivo (ej prueba.asm):
set /P file=
cls
ml /Cp /coff %file% /link /subsystem:console
pause
goto inicio
(*este es tu fuerte )
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)