Arquitectura de Computadoras Práctica Adicional Ensamblador Equipo 11 Luis Manuel Rodríguez Ramírez, Luis Fernando Maciel García 26 de Marzo de 2014 Introducción ¿Qué es el ensamblador? El ensamblador hace referencia a un tipo de programa informático encargado de traducir un fichero fuente escrito en lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por el procesador. Cada instrucción representa exactamente una instrucción de la máquina.
Los compiladores son programas que hacen conversiones similares a los ensambladores pero sirven para lenguajes de programación de alto nivel, un ensamblador es más simple que un compilador, en un lenguaje de alto nivel se pueden requerir muchas instrucciones de máquina y en lenguaje ensamblador cada instrucción representa una sola instrucción de máquina. Cada tipo de CPU tiene su propio lenguaje de máquina, también tiene su propio lenguaje ensamblador. Trasladar programas entre arquitecturas de computador diferentes es algo complicado. Los objetivos de ésta práctica son crear un ensamblador sencillo, que va a crear un archivo de texto con código máquina el cual puede servir para ser el archivo de entrada para el simulador de una computadora. Al recibir una instrucción le vamos a asignar un código de operación y se generará el código de salida. La importancia de ésta práctica es conocer como trabaja un ensamblador y de ver cómo se genera el código máquina a través de instrucciones en lenguaje ensamblador.
Desarrollo de la práctica En la práctica simulamos el trabajo de un ensamblador, la realizamos en lenguaje C++, lo que necesitamos fue lo siguiente:
•
Computadora
•
Compilador g++
•
Editor de Texto
•
Archivo de entrada
El programa va a interpretar un archivo de entrada en lenguaje ensamblador y va a generar la salida de lenguaje máquina. Cada linea del programa en ensamblador va a tener la estructura siguiente. Dirección_de_memoria
Operación
Operando
y para guardar datos en memoria vamos a tener la siguiente sintaxis Dirección_de_memoria
Operando
El archivo de entrada fue abierto a través de un puntero tipo FILE y separado por renglones con la función fgets() y asignado a una variable tipo char para sacar la instrucción de cada renglón. Al leer con fgets obtuvimos cada renglón del archivo de entrada y lo asignamos a las variables con las que vamos a trabajar de la forma siguiente: char renglon[100]; unsigned int indice, operando_s=0x000; char cadena[100]; char cop_s[10]; FILE *entrada= fopen(“entrada.txt”,”r”); while(!feof(entrada)){ fgets(renglon,99,entrada); scanf(cadena,"%x %s %x",&indice,cop_s,&operando_s); } La codificación a lenguaje máquina fue simple debido a que solo le revisamos la operación que es y le asignamos su código de operación. La instrucción codificada queda junto con el operando de la siguiente forma.
Código de Operación
Operando
En la siguiente tabla tenemos los códigos de operación correspondientes a la instrucción que se le asignaron al ensamblarlo.
Código de Operación
Instrucción
0h
LOAD
1h
STORE
2h
ADD
3h
ADC
4h
SUB
5h
OR
6h
AND
7h
XOR
8h
SHL
9h
SHR
Ah
BRA
Bh
BRZ
Ch
BRC
Dh
BRO
Eh
LDI
Fh
STOP
Para asignarle a cada instrucción su código de operación lo hicimos comparando la cadena
que contenía la
instrucción con la función strcmp, como el ejemplo siguiente: En el renglón leemos la instrucción y entramos a condicionantes para asignar el código de operación correspondiente. El renglón que leemos tiene 001
ADD
010, entonces la instrucción va a entrar a la
condicionante que contenga la cadena “ADD”. Al encontrar la instrucción le sumamos el código de operación con corrimiento a la izquierda de 12 bits al operando para obtener ya la instrucción codificada y la vamos a guardar en un arreglo simulando la memoria. if(!strcasecmp(cop_s,"ADD")){ memoria[indice]=0x2000+ Operando; } Una vez que se leyeron todos los renglones pusimos una verificación para que la instrucción LDI la cual su funcionamiento es cargar una constante en la localidad siguiente de memoria así que revisamos que no se toque esa localidad siguiente. Ya que comprobamos que se respetó la siguiente localidad de memoria de la instrucción LDI continuamos con la generación del código máquina. El código de salida se va a limitar a aquellas localidades de memoria que tengan alguna instrucción o algún dato que tengamos que guardar en la memoria. Para generar el archivo de salida con el código máquina hicimos lo siguiente: entrada=fopen("salida.txt","w"); for( int i=0; i
Thank you for interesting in our services. We are a non-profit group that run this website to share documents. We need your help to maintenance this website.