prÁctica #1 - mitarea · 2020. 10. 7. · seminario de traductores de lenguaje i prÁctica #2...
Post on 31-Jul-2021
1 Views
Preview:
TRANSCRIPT
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #1
Identificación de las partes de una línea de lenguaje ensamblador. Implementar el algoritmo para separar las partes de una línea de lenguaje ensamblador. Descripción de la práctica:
1. Capturar el siguiente ejemplo con un editor de texto puro:
;comentario número 1 =SEMINARIO=
ORG %00001111
Et1 equ $ffFF
dos LDAA @4732
SWI
DS.b %0011000011111100
;comentario número 2 ¡Traductores!
;comentario número 3
tres sWi
End
2. Al capturar el ejemplo, utilizar espacios en blanco y tabuladores de manera alternada para crear varias opciones de
separación de palabras. 3. Grabar el archivo con el siguiente nombre P1ASM.txt 4. Cada una de las líneas capturadas es un ejemplo ficticio de un código en lenguaje ensamblador para la arquitectura
HC12. Cada una de estas líneas puede ser de dos formas: a. Línea de comentario. b. Línea de etiqueta, código de operación (CODOP) y operando.
5. Las líneas de comentario tienen las siguientes reglas de escritura. a. Comienzan con el carácter de “;” b. Este carácter de “;” solo puede estar en la primera posición de la línea. c. Después del carácter de “;” pueden seguirle cualquier carácter. d. La longitud máxima es de 80 caracteres. e. El delimitador de la línea de comentario es el retorno de carro.
6. Las líneas que están formadas por etiqueta, CODOP y operando tienen las siguientes reglas de escritura: a. ETIQUETAS:
i. Comienzan con letra mayúscula o minúscula (son válidos los dos casos). ii. Esta primera letra debe de estar sólo en la primera posición de la línea.
iii. Su longitud es de 8 caracteres máximo. iv. Después de la primera letra le pueden seguir más letras, números o guiones bajos. v. Cualquier otro carácter representado es un error.
b. CODOPS: i. Comienzan con letra mayúscula o minúscula.
ii. El otro carácter válido es el “.” Y sólo puede haber uno sólo en la palabra. iii. Su longitud máxima es de 5 caracteres. iv. Cualquier otro carácter es un error.
c. OPERANDOS: i. Pueden comenzar con cualquier carácter (en prácticas posteriores se revisarán las excepciones).
ii. Pueden tener cualquier longitud. 7. Este tipo de líneas pueden tener las siguientes combinaciones:
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
a. ETIQUETA, CODOP, OPERANDO b. ETIQUETA, CODOP c. CODOP, OPERANDO d. CODOP
8. Para el primer caso, se debe considerar: a. Si la línea comienza con ETIQUETA, el primer carácter de la línea debe ser entonces una letra. b. Entre ETIQUETA y CODOP solo se puede tener separadas estas dos palabras por espacios en blanco o
tabuladores. c. Entre CODOP y OPERANDO solo se puede tener separadas estas dos palabras por espacios en blanco o
tabuladores. d. Después de la palabra OPERANDO solo se puede tener el retorno de carro, éste siempre será el
delimitador de cada sentencia de lenguaje ensamblador. 9. Para el segundo caso, se debe considerar:
a. Si la línea comienza con ETIQUETA, el primer carácter de la línea debe de ser entonces una letra. b. Entre ETIQUETA y CODOP solo se puede tener separadas estas dos palabras por espacios en blanco o
tabuladores. c. Después de la palabra CODOP solo se puede tener el retorno de carro, éste siempre será el delimitador de
cada sentencia de lenguaje ensamblador. 10. Para el tercer caso, se debe considerar:
a. Antes de la palabra CODOP solo se puede tener espacios en blanco o tabuladores. Es decir, el primer carácter de la línea será un espacio en blanco o un tabulador.
b. Entre las palabras CODOP y OPERANDO solo se puede tener espacios en blanco o tabuladores. c. Después de la palabra OPERANDO solo se puede tener el retorno de carro, éste siempre será el
delimitador de cada sentencia de lenguaje ensamblador. 11. Para el cuarto caso, se debe considerar:
a. Antes de la palabra CODOP solo se puede tener espacios en blanco o tabuladores. Es decir, el primer carácter de la línea será un espacio en blanco o un tabulador.
b. Después de la palabra CODOP solo se puede tener el retorno de carro, éste siempre será el delimitador de cada sentencia de lenguaje ensamblador.
12. Se debe de observar que siempre debe de haber por lo menos la palabra que conforme el CODOP ya que de otra forma sería un error.
13. La última línea del ejemplo siempre debe tener la palabra END. Es decir, al validar la línea que tiene la palabra END se debe considerar que este es el final del archivo con el ejemplo de lenguaje ensamblador.
Para hacer el programa:
1. Hacer un programa que abra el archivo creado previamente (P1ASM.txt) 2. Leer línea por línea el archivo de ejemplo, pudiendo:
a. Leer cada línea directamente del archivo, de una por una y procesar cada línea que se va leyendo; o bien, b. Leer todo el archivo con un ciclo y conforme se lee el archivo, almacenarlo en una estructura de datos
temporal, posteriormente leer de la estructura de datos. 3. Una vez identificada la primera línea, se debe de comenzar a leer carácter por carácter para identificar las palabras
e ignorar los espacios en blanco y tabuladores. 4. Una vez que se identifique la primera palabra de una línea se debe de determinar si ésta fue ETIQUETA, CODOP u
OPERANDO 5. Se deben utilizar tres variables que se deben de llamar “etiqueta”, “codop” y “operando” que deben ser de tipo
cadena. Una vez que se identifican las palabras de una línea, se debe de imprimir en pantalla el valor de cada variable.
6. Si alguna variable no tuviera ningún valor, se debe asignar un valor “null”.
3
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
7. Una vez impreso el valor de las variables en el monitor, se debe de inicializar las variables con el carácter nulo, para que no se almacene basura en las variables. Una vez impreso el valor de las palabras identificadas por una línea debes de leer la siguiente línea del archivo y hacer el mismo procedimiento.
8. Para el caso de las líneas de comentario, solo se debe de imprimir en pantalla el mensaje de “comentario”. Ejemplo de salida al monitor para el archivo P1ASM.txt COMENTARIO ETIQUETA= null CODOP= ORG OPERANDO= %00001111 ETIQUETA= Et1 CODOP= equ OPERANDO= $ffFF ETIQUETA= dos CODOP= LDAA OPERANDO= @4732 ETIQUETA= null CODOP= SWI OPERANDO= null ETIQUETA= null CODOP= DS.b OPERANDO= %0011000011111100 COMENTARIO COMENTARIO ETIQUETA= tres CODOP= sWi OPERANDO= null ETIQUETA=null CODOP=End OPERANDO=null
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #2
Identificar modos de direccionamiento en la tabla de códigos de operación. Modificar el programa anterior para que se identifique por cada instrucción de cada línea del lenguaje ensamblador, el o los modos de direccionamiento que le correspondan. Descripción de la práctica:
1. Capturar en el bloc de notas el siguiente ejemplo con el nombre P2ASM.txt ORG $AB ET1 SWI ADCA 1,X BRA ET1 END
2. Capturar el siguiente ejemplo con un editor de texto puro, el conjunto de instrucciones con el nombre TABOP.txt
Instrucción (CODOP)
Operando (Sí, No)
Modo direccionamiento
Código máquina (hex)
Total de bytes calculados
Total de bytes por calcular
Suma total de bytes
…
ADCA SI Inm Dir Ext Idx Idx1 …
(anotar los dígitos hexadecimales, no anotar lo que está en mayúsculas.
(anotar el número que se corresponda por los bytes que están representados en hex)
(anotar el número que se corresponda por los pares representados en letras minúsculas)
(anotar el número que se corresponda de sumar los valores numéricos de las dos columnas anteriores)
…
BRA SI REL
…
SWI NO INH
3. Modificar el programa para que una vez que identifique las palabras por línea (ETIQUETA, CODOP, OPERANDO) se compare contra el TABOP.txt
a. Buscar el valor de la variable CODOP contra el TABOP.txt b. Si se encuentra:
i. Verificar si este CODOP debe o no debe de tener operando. Si no cumple con este requisito, indicar ERROR.
ii. Identificar el modo o modos de direccionamiento, el código calculado, la cantidad de bytes por calcular y el total de bytes que le corresponden a este CODOP.
iii. Imprimir en pantalla toda la información que le corresponde a este CODOP. c. Si no se encuentra, indicar ERROR.
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #3
Identificar el tamaño de la instrucción en bytes de acuerdo al modo de direccionamiento (analizar operando), considerando las diversas bases numéricas y las características propias de cada modo de direccionamiento. Validar el CODOP y el OPERANDO, imprimir en pantalla los resultados como se muestran en el cuadro siguiente y además se deben validar TODOS los posibles errores en los OPERANDOS atendiendo a las reglas de escritura para cada uno de ellos de acuerdo a su particular MODO de DIRECCIONAMIENTO. En caso de no cumplir con las reglas de escritura, mostrar en pantalla el error específico.
ETIQUETA CODOP OPERANDO LO QUE DEBE APARECER EN PANTALLA
ORG 1 Error
SWI Inherente 1 byte
ADCA 3 Directo 2 bytes
ADCA @3 Directo 2 bytes
ADCA %111 Directo 2 bytes
ADCA $3 Directo 2 bytes
ADCA 300 Extendido 3 bytes
ADCA $FFF Extendido 3 bytes
ADCA #3 Inmediato 2 bytes
ADCA #@3 Inmediato 2 bytes
ADCA #%1111 Inmediato 2 bytes
ADCA 1,X Indizado de 5 bits, (IDX), 2 bytes
ADCA 255,X Indizado de 9 bits, (IDX1), 3 bytes
ADCA 32768,X Indizado de 16 bits, (IDX2), 4 bytes
ADCA 1,+PC Indizado de pre incremento, (IDX), 2 bytes
ADCA A,X Indizado de acumulador, (IDX), 2 bytes
ADCA 254,X Indizado de 9 bits, (IDX1), 3 bytes
ADCA 64444,X Indizado de 16 bits, ([IDX2]), 4 bytes
ADCA [1,X] Indizado Indirecto de 16 bits, ([IDX2]), 4 bytes
ADCA [6444,X] Indizado Indirecto de 16 bits, ([IDX2]), 4 bytes
ADCA [D,X] Indizado indirecto de Acumulador “D”, ([D,IDX]), 2 bytes
BRA UNO Relativos de 8 bits, 2 bytes
LBRA UNO Relativo de 16 bits, 4 bytes
END
DESCRIPCIÓN EJEMPLO
Modo Inherente: No tiene operando. ORG $FFF NOP INX END
Modo Inmediato: Utiliza las cuatro bases numéricas en su operando, inicia el operando con el símbolo de #, pueden ser de 8 o 16 bits de acuerdo a lo que indique el TABOP, por lo tanto el operando debe de tener un valor entre 0 a 255 para ser de 8 bits, y de 256 a 65535 para ser de 16 bits, los valores numéricos pueden utilizar ceros a la izquierda.
ORG $FFF LDAA #55 LDX #$0234 LDY #$67 LDAA #%11 LDY #@234
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
END
Modo directo: Utiliza las cuatro bases numéricas en su operando, los valores numéricos pueden representarse con ceros a la izquierda, el operando se puede representar con valores entre 0 a 255.
ORG $FFF LDAA $55 LDAA $0055 LDX $20 END
Modo extendido: Utiliza las cuatro bases numéricas en sus operandos, los valores numéricos pueden representarse con ceros a la izquierda, el operando se puede representar con valores entre 256 a 65535, y también el operando puede estar representado por una palabra que cubra las reglas de escritura de las etiquetas.
ORG $FFF LDAA 300 LDAA $FFFF LDX VALOR1 END
Modo indizado de 5 bits: En el TABOP se representa con la abreviación IDX, en el operando se representan valores numéricos, únicamente en base decimal, con un rango de -16 a 15, después del valor debe de haber siempre el carácter de “,” (coma) y después el nombre de un registro de computadora válido, como son X, Y, SP y PC (cualquier nombre de registro diferente es un error). Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas. Existe una excepción y es cuando el operando inicia con el carácter de “,” después de la coma debe de representarse cualquier nombre de registro de computadora como los mencionados. Si el operando estuviera representado por “X” entonces se debe de interpretar como si fuera “0,X”.
ORG $0 LDAA ,X LDAA 0,X LDAA 1,SP LDAA 15,X LDAA -1,Pc LDAA -16,x STAB -8,y END
Modo indizado de 9 bits: En el TABOP se representa con la abreviación IDX1, en el operando se representan valores numéricos, únicamente en base decimal, con un rango de -256 a -17 y de 16 a 255, después del valor debe de haber siempre el carácter de “,” (coma) y después el nombre de un registro de computadora válido, como son X, Y, SP y PC (cualquier nombre de registro diferente es un error). Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas.
ORG $0 LDAA 255,X LDAA 34,SP LDAA -18,pc LDAA -256,x LDAA -20,y END
Modo indizado de 16 bits: En el TABOP se representa con la abreviación IDX2, en el operando se representan valores numéricos, únicamente en base decimal, con un rango de 256 a 65535, después del valor debe de haber siempre el carácter de “,” (coma) y después el nombre de un registro de computadora válido, como son X, Y, SP y PC (cualquier nombre de registro diferente es un error). Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas.
ORG $0 LDAA 31483,X END
Modo indizado indirecto de 16 bits: En el TABOP se representa con la abreviación [IDX2], en el operando se representan valores numéricos, únicamente en base decimal, con un rango de 0 a 65535, después del valor debe de haber siempre el carácter de “,” (coma) y después el nombre de un registro de computadora válido, como son X, Y, SP y PC (cualquier nombre de registro diferente es un error). Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas. Y siempre deben de existir los dos corchetes.
ORG $0 LDAA [10,X] LDAA [31483,X] END
Modo indizado de auto pre/post decremento/incremento: En el TABOP se representa con la abreviación IDX, en el operando se representan valores numéricos, únicamente en base decimal, con un rango de 1 a 8, después del valor debe de haber siempre el carácter de “,” (coma) y después un signo positivo o negativo y enseguida el nombre de un registro de computadora válido, como son X, Y, SP. O bien después de la coma puede haber el nombre de un registro X, Y, SP y enseguida un signo positivo o negativo, tal y como se muestra en el ejemplo. Cualquier nombre de registro diferente es un error. Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas.
ORG $0 STAA 1,-SP STAA 1,SP- STX 2,SP+ STX 2,+SP END
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Modo indizado de acumulador: En el TABOP se representa con la abreviación IDX, en el operando se representan únicamente nombre de registros de computadora, pero en un orden particular. Los primeros registros que se pueden representar antes del carácter de la coma son A, B y D. Después de la coma se puede representar únicamente los registros X, Y, SP o PC. Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas.
ORG $0 LDAA B,X LDAA a,X LDAA D,x STX b,PC STX d,Y END
Modo indizado de acumulador indirecto: En el TABOP se representa con la abreviación [D,IDX], en el operando se representan únicamente nombre de registros de computadora, pero en un orden particular. El único registro que se pueden representar antes del carácter de la coma es D. Después de la coma se puede representar únicamente los registros X, Y, SP o PC. Los nombres de los registros se pueden representar indistintamente en mayúsculas o minúsculas.
ORG $0 JMP [D,PC] ADCA [d,X] ADCB [D,Sp] ADDA [D,y] END
Modo relativos de 8 y 16 bits: En el TABOP se representa con la abreviación REL. El operando no puede tener valores numéricos. El operando debe ser una palabra que cumpla con las reglas de escritura de las etiquetas. El TABOP determina si la instrucción es de 8 o 16 bits dependiendo de la cantidad de bytes que le correspondan.
ORG $0 BRA UNO_1 LBRA DOS_2 BRA Tres LBRA Et_c4 END
Las bases numéricas son cuatro: decimal, hexadecimal, octal y binaria. Cada una de ellas tiene sus reglas de escritura a seguir, deberás de evaluar las cuatro bases numéricas e imprimir en pantalla cada error relacionado al manejo inadecuado de las bases numéricas.
Hexadecimal, se representa con el carácter de pesos ($) y le pueden seguir las letras, minúsculas y/o mayúsculas, A a F y los dígitos 0 al 9.
Octal, se representa con el carácter de @ y le pueden seguir los dígitos del 0 al 7.
Binario, se representa con el carácter de % y le pueden seguir los dígitos 0 y 1.
Decimal, inicia con cualquiera de los dígitos de 0 al 9.
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #4
Uso del contador de localidades y su relación con las instrucciones y DIRECTIVAS del lenguaje ensamblador; así como la utilización de ARCHIVOS AUXILIARES (temporal o de listado y tabla de símbolos). Completar el programa de la práctica tres para incorporar la validación de las directivas; la generación del contador de localidades y la generación de archivos auxiliares. Dirección inicial y contador de localidades
Solo puede existir un solo “ORG”
La dirección inicial es el valor que está asociado a la palabra ORG. El valor puede estar representado en cualquier base numérica.
La dirección inicial se abrevia como DIR_INIC, y es una variable de tipo entero, que puede tomar valores de 0 al 65535. El valor de la dirección inicial se sitúa en la posición del operando.
El primer valor del contador de localidades es el valor de la dirección inicial. El contador de localidades se abrevia con las siglas CONTLOC, se debe manejar como una variable de tipo entero. Toma valores en cualquier base numéricas. Su rango es de 0 65535. El valor del contador de localidades se incrementa:
o Con la cantidad de bytes de cada instrucción y/o o Con la cantidad de bytes de las directivas.
El valor que va obteniendo el contador de localidades se asocia a las etiquetas (cuando existen).
Los valores de la dirección inicial y del contador de localidades se representan en los archivos temporal y tabla de símbolos.
En el siguiente ejemplo de DIR_INIC=4095 y el primer valor de CONTLOC=DIR_INIC
ORG $FFF NOP INX
E_1 ADCA #3 END
Directivas del lenguaje ensamblador
ORG: indica el inicio de las directivas e instrucciones que afectan al contador de localidades. Solo debe de existir un solo “ORG”. (la etiqueta debe de ser nula).
END: indica el final del código en lenguaje ensamblador.
Directivas de constantes: o DW, DB, DC.W, DC.B, FCB, FDB, FCC
De un byte (DB, DC.B, FCB): DB (DEFINE BYTE), DC.B (DEFINE CONSTANT.BYTE), FCB (FULL CONSTANT BYTE). Todas estas pueden tomar valores entre 0 a 255, en cualquier base numérica. Este valor se representa como el OPERANDO. Incrementa el CONTADOR DE LOCALIDADES en 1.
De dos bytes (DW, DC.W, FDB): DW (DEFINE WORD), DC.W (DEFINE CONSTANT.WORD), FDB (FULL DOUBLE BYTE). Todas éstas pueden tomar valores entre 0 a 65535, en cualquier base numérica. Este valor se representa como el OPERANDO. Incrementan el CONTLOC en 2.
De caracteres (FCC): FCC (FULL CONSTANT CHARACTER). Su valor se representa entre comillas dobles (“valor”). El valor se representa con cualquier carácter del código ASCII. Este valor se representa como el OPERANDO. Incrementa el CONTLOC en su equivalente de longitud.
Directivas de reserva de espacio en memoria
DS, DS.B, DS.W, RMB, RMW.
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o De un byte en un byte: DS (DEFINE SPACE), DS.B (DEFINE SPACE.BYTE), RMB (RESERVE MEMORY BYTE). Todas éstas pueden tomar valores entre 0 a 65535, en cualquier base numérica. Este valor se representa como OPERANDO. Incrementa el CONTLOC de la siguiente manera: el valor numérico del OPERANDO se multiplica por 1 y se suma al CONTLOC.
o De dos bytes en dos bytes: DS.W (DEFINE SPACE.WORD), RMW (RESERVE MEMORY WORD). Todas éstas pueden tomar valores entre 0 a 65535, en cualquier base numérica. Este valor se representa como OPERANDO. Incrementa el CONTLOC de la siguiente manera: el valor del OPERANDO se multiplica por 2 y se suma al CONTLOC.
ORG 0 DW 2 Incrementa el CONTLOC en 2 DB 2 Incrementa el CONTLOC en 1 DC.W 2 Incrementa el CONTLOC en 2 DC.B 2 Incrementa el CONTLOC en 1 FCB 2 Incrementa el CONTLOC en 1 FDB 2222 Incrementa el CONTLOC en 2 DS 34 Incrementa el CONTLOC en 34 DS.B 34 Incrementa el CONTLOC en 34 DS.W 34 Incrementa el CONTLOC en 68 RMB 34 Incrementa el CONTLOC en 34 RMW 34 Incrementa el CONTLOC en 68 FCC “HOLA MUNDO” Incrementa el CONTLOC en 10 END
Otra directiva
EQU: Significa “EQUATE” (igualar). Debe de tener una etiqueta. Debe de tener un operando. El valor del operando puede estar en cualquier base numérica. Entre el rango de 0 a 65535. Esta directiva se puede situar indistintamente antes y después del ORG.
ET1 EQU 33 ET2 EQU 22 ORG $0 ET3 EQU 4 ET5 EQU 3 SWI ET6 ADCA #3 ET7 ADCA #4 ET8 EQU 2 END
ORG $0 UNO EQU 2 SWI DOS EQU 55555 END
Archivos auxiliares
TEMPORAL (de listado). Es un archivo de texto. Puede recibir los siguientes nombres: si el archivo que contiene el ejemplo de lenguaje ensamblador se llama P1asm.txt, el archivo TEMPORAL se puede llamar P1tmp.txt, o bien, P1lst.txt. Este archivo contiene la siguiente información:
o VALOR: de las variables DIR_INIC y CONTLOC. Este valor debe de representarse con el formato de dos bytes, es decir, si es necesario hay que complementar con ceros a la izquierda. Y siempre en formato hexadecimal. También se debe de representar el valor de la directiva EQU.
3
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o ETIQUETA. o CODOP o OPERANDO o Y cualquier otra información que se considere necesaria. No deben de incluirse las líneas de comentario.
Este archivo es la base para el PASO DOS del algoritmo ensamblador. El formato del archivo y los delimitadores son los que se consideran adecuados, sin olvidar que debe ser un formato de texto.
TABLA DE SÍMBOLOS: es un archivo de texto. Recibe el nombre TABSIM. La palabra SÍMBOLO es sinónimo de la palabra ETIQUETA. El nombre del archivo debe ser TABSIM.txt. Contiene la siguiente información:
o El VALOR de las variables: ETIQUETA. Y por cada ETIQUETA su valor correspondiente ya sea del:
CONTLOC, o bien de,
La directiva EQU
Ambos casos son válidos y son distintos, los valores deben de representarse en formato de dos bytes. Y siempre en formato hexadecimal.
Las etiquetas que tienen asociado su valor por el CONTLOC se conocen como relativas. Las etiquetas que tienen asociado su valor por la directiva EQU se conocen como ABSOLUTAS
o No pueden existir nombres de ETIQUETAS repetidas en este archivo, es decir, solo se pueden añadir las etiquetas previa verificación de que no estén repetidas. Este archivo se utiliza en el PASO DOS del algoritmo del ensamblador. El formato del archivo y los delimitadores son los que se consideren adecuados, sin olvidar que debe de ser un formato de texto.
Para el primer ejemplo el archivo TEMPORAL quedaría:
VALOR ETIQUETA CODOP OPERANDO
DIR_INIC 0FFF NULL ORG $FFF
CONTLOC 0FFF NULL NOP NULL
CONTLOC 1000 NULL INX NULL
CONTLOC 1001 E_1 ADCA #3
CONTLOC 1003 NULL END NULL
Para el primer ejemplo el archivo TABSIM quedaría:
ETIQUETA VALOR
CONTLOC (ETIQUETA RELATIVA)
E_1 1001
Para el segundo ejemplo el archivo TEMPORAL quedaría:
VALOR ETIQUETA CODOP OPERANDO
DIR_INIC 0000 NULL ORG 0
CONTLOC 0000 NULL DW 2
CONTLOC 0002 NULL DB 2
CONTLOC 0003 NULL DC.W 2
CONTLOC 0005 NULL DC.B 2
CONTLOC 0006 NULL FCB 2
CONTLOC 0007 NULL FDB 2222
CONTLOC 0009 NULL DS 34
CONTLOC 002B NULL DS.B 34
CONTLOC 004D NULL DS.W 34
CONTLOC 0091 NULL RMB 34
CONTLOC 00B3 NULL RMW 34
CONTLOC 00F7 NULL FCC “HOLA MUNDO”
CONTLOC 0101 NULL END NULL
Para este ejemplo no habría TABSIM, porque no hay etiquetas. Para el tercer ejemplo el archivo TEMPORAL quedaría:
VALOR ETIQUETA CODOP OPERANDO
DIR_INIC 0000 NULL ORG $0
VALOR EQU
0002 UNO EQU 2
CONTLOC 0000 NULL SWI NULL
VALOR EQU
D903 DOS EQU 55555
CONTLOC 0001 NULL END NULL
Para el tercer ejemplo el archivo TABSIM quedaría:
ETIQUETA VALOR
EQU (ETIQUETA ABSOLUTA) UNO 0002
EQU (ETIQUETA ABSOLUTA) DOS D903
Para el cuarto ejemplo el archivo TEMPORAL quedaría:
4
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
VALOR ETIQUETA CODOP OPERANDO
VALOR EQU
0021 ET1 EQU 33
VALOR EQU
0016 ET2 EQU 22
DIR_INIC 0000 NULL ORG $0
VALOR EQU
0004 ET3 EQU 4
VALOR EQU
0003 ET5 EQU 3
CONTLOC 0000 NULL SWI NULL
CONTLOC 0001 ET6 ADCA #3
CONTLOC 0003 ET7 ADCA #4
VALOR 0002 ET8 EQU 2
EQU
CONTLOC 0005 NULL END NULL
Para el cuarto ejemplo el archivo TABSIM quedaría:
ETIQUETA VALOR
EQU (ETIQUETA ABSOLUTA) ET1 0021
EQU (ETIQUETA ABSOLUTA) ET2 0016
EQU (ETIQUETA ABSOLUTA) ET3 0004
EQU (ETIQUETA ABSOLUTA) ET5 0003
CONTLOC (ETIQUETA RELATIVA)
ET6 0001
CONTLOC (ETIQUETA RELATIVA)
ET7 0003
EQU (ETIQUETA ABSOLUTA) ET8 0002
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #5
Obtener el código máquina de los direccionamientos inherente, inmediato, directo y extendido para los casos en que los operandos están representados con valores numéricos. Modificar la práctica #4 para obtener estos códigos máquina. El proceso base se centra en lo siguiente:
Leer cada línea del archivo temporal.
Por cada línea del archivo temporal, identificar sus cuatro partes y asignar sus valores a las variables: VALOR, ETIQUETA, CODOP y OPERANDO.
Una vez identificadas las partes, analizar la información encontrada; por cada modo de direccionamiento distinto el procedimiento es distinto.
Inherente
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
Para el caso inherente no se debe calcular código máquina adicional.
VALOR ETIQUETA CODOP OPERANDO Lo que debe aparecer en pantalla
0000 NULL ORG 0
0000 NULL ABA NULL 1806
0002 NULL BGND NULL 00
0003 NULL END NULL
Directo
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Calcular el código máquina faltante: o Revisar el valor del OPERANDO (de acuerdo a las reglas presentadas en prácticas anteriores). o Transformar el valor en formato hexadecimal. o Concatenar el código máquina del TABOP con el código máquina recién calculado. o Complementar con ceros a la izquierda el código máquina del byte que se calcule.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Lo que debe aparecer en pantalla
0000 NULL ORG 0
0000 NULL LDAA 85 9655
0002 NULL LDAA $0055 9655
0004 NULL LDX $20 DE20
0006 NULL END NULL
Extendido
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Calcular el código máquina faltante: o Revisar el valor del OPERANDO (de acuerdo a las reglas presentadas en prácticas anteriores). o Transformar el valor en formato hexadecimal. o Concatenar el código máquina del TABOP con el código máquina recién calculado. o Complementar con ceros a la izquierda el código máquina de los 2 bytes que se calcule.
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
OPERANDO representado con ETIQUETAS: o Buscar en el TABOP el valor de la variable CODOP. o Recuperar el TABOP el código máquina en formato hexadecimal. o Calcular el código máquina faltante:
Buscar la ETIQUETA (que es el OPERANDO) en el TABSIM:
Si se encuentra: o Recuperar el valor de la ETIQUETA del TABSIM o Concatenar el código máquina del TABOP con el valor del TABSIM.
Si no se encuentra: o Generar un mensaje de error.
o Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Lo que debe aparecer en pantalla
0000 NULL ORG 0
0038 VALOR1 EQU $38
0000 NULL LDAA @777 B601FF
0003 NULL LDAA $FFFF B6FFFF
0006 NULL LDAA VALOR1 B60038
0009 NULL END
Inmediato
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Calcular el código máquina faltante: o Revisar el valor del OPERANDO (de acuerdo a las reglas presentadas en prácticas anteriores). o Determinar si es de 1 o de 2 bytes y generar un error en caso de que no proceda. o Transformar el valor en formato hexadecimal. o Concatenar el código máquina del TABOP con el código máquina recién calculado. o Complementar con ceros a la izquierda el código máquina del byte que se calcule.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Lo que debe aparecer en pantalla
0000 NULL ORG 0
0000 NULL LDAA #$55 8655
0002 NULL LDX #$1234 CE1234
0005 NULL LDY #%1100111 CD0067
0008 NULL END NULL
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA # 6
Obtener el código máquina de los direccionamientos indizados simples. Modificar el
programa de la práctica número 5 para obtener el código máquina de los direccionamientos
simples.
leer cada línea del archivo temporal
o por cada línea del archivo temporal, dividir la línea en 4 partes: VALOR,
ETIQUETA, CODOP, OPERANDO.
una vez identificadas las partes analizar la información encontrada, por cada modo
de direccionamiento el procedimiento es distinto, se explican a continuación.
INDIZADO 5 BITS: FORMA “IDX”. REGISTRO X, Y, SP, PC. DE -16 A 15 (VALORES
DECIMALES)
buscar en el TABOP el valor de la variable CODOP.
recuperar del TABOP el código máquina en formato hexadecimal.
imprimir en pantalla por cada línea del archivo TEMPORAL el código maquina
encontrado
Si buscamos en el TABOP la instrucción LDAA encontramos que:
el código máquina calculado para IDX es A6.
el código máquina por calcular dice “xb” y se corresponde con un byte
¿Cómo calcular el byte “xb”?
se puede hacer de dos manera:
o utilizando una fórmula
VALOR ETIQUETA CODOP OPERADOR IMPRIME EN PANTALLA
0000 NULL ORG $0
0000 NULL LDAA ,X A600
0002 NULL LDAA 0,X A600
0004 NULL LDAA 1,X A601
0006 NULL LDAA 15,X A60F
0008 NULL LDAA -1,X A61F
000A NULL LDAA -16,X A610
000C NULL STAB -8,Y 6B58
000E NULL END NULL
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o creando una tabla de “bytes xb” para su consulta.
1. formula:
Postbyte code (xb) Source code syntax Valores de “rr” . X=00, Y=01, SP=10, PC=11
rr0nnnnn ,r n,r -n,r
n=-16 a + 15 r puede ser X, Y, SP, o PC
SI tenemos, X o tenemos 0, X entonces:
rr=00 porque el registro X=00
nnnnn=00000 porque la sintaxis ,X equivale a 0,X
sustituyendo en rr0nnnn
o 00000000
o tomando los primeros 4 bits es igual a 0
o el resultado es 00
concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando
entonces A600
2. tabla:
00 0,x 5b const
la tabla debe de contener:
o el valor del byte xb
o la sintaxis propuesta
o un indicador, por ejemplo, 5bconst
Si tenemos, X o tenemos 0,X entonces:
consultar el valor del OPERANDO=”,X “ u OPERANDO=”0,X” en la tabla
si hay coincidencia entonces extraer el valor del byte xb
concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando
entonces A6000.
INDIZANDO 9 BITS: FORMA “IDX1”. REGISTROS X, Y,SP,PC. DE-256 A 255 (VALORES
DECIMNALES). (-256 A -17,16 A 255).
buscar en el TABOP el valor de la variable COCOP.
recuperar del TABOP el código maquina en formato hexadecimal.
3
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina
encontrado
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL LDAA 255,X A6E0FF
0003 NULL LDAA 34,X A6E022
0006 NULL LDAA -18,X A6E1EE
0009 NULL LDAA -256,X A6E100
000C NULL LDAA -20,Y A6E9EC
000F NULL END NULL
Si buscamos en el TABOP la instrucción LDAA encontramos que:
el código máquina calculado para IDX1 es A6.
el código máquina por calcular dice “xbff” y se corresponde con dos bytes.
¿Cómo calcular el byte “xb”?
se puede hacer de dos maneras:
o utilizando la fórmula.
o creando una tabla de “bytes xb” para su consulta
1. formula:
Postbyte code (xb)
Source code syntax
Valores de “rr”, X=00, Y=01, SP=10, PC=11
111rr0zs N,r -n,r
Z=0 S=0 r puede ser X, Y, SP, O PC
Si tenemos 255, X entonces:
rr=00 porque el registró X=00
Z=0
S=0
sustituyendpo en 111rr0zs tenemos:
o 11100000
o tomando los primeros 4 byts es igual a E.
o tomando los según dos 4 bits es igual a 0.
4
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o el resultado es E0.
concatenar el valor encontrado en el TABOP con el valor del byte “xb”, quedando
entonces A6E0.
concatenar el valor del operador “255” en la posición del “ff”, quedando entonces
A6E0FF.
2. TABLA:
E0 n,X 9b const
la tabla debe de contener
o el valor del byte xb
o la sintaxis propuesta
o un indicador, por ejemplo, 9bconst
Si tenemos 255, X entonces es de 9 bits:
consultar el modo de direccionamiento (indizado de 9 bits) en la tabla
si hay coincidencia entonces extraer el valor del byte xb
concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando
entonces A6E0.
concatenar el valor del operando “255” en la posición del “ff”, quedando entonces
A6E0FF.
INDIZADO 16 BITS: FORMA “IDX2”. REGISTRADOS X, Y, SP, PC, DE 0 A 65535
(VALORES DECIMALES). (256 A 65535)
buscar en el TABOP el valor de la variable CODOP.
recuperar del TABOP el código máquina en formato hexadecimal.
imprimir en la pantalla por cada línea del archivo TEMPORAL el código máquina
encontrado
VALOR ETIQUETA CODOP OPERANDO Imprimir pantalla
0000 null ORG $0
0000 Null LDAA 31483,X A6E27AFB
0004 Null END
Si buscamos en el TABOP la instrucción LDAA encontramos que:
el código máquina calculado para IDX2 es A6.
el código máquina por calcular dice “xbeeff” y se corresponde con tres bytes.
5
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
¿Cómo calcular el byte”xb”?
se puede hacer de dos maneras
o utilizando una fórmula
o creando una tabla de “bytes xb” para su consulta.
1. FORMULA:
PostbyteCode (xb) Source Code Syntax Valores de “rr”.X=00, Y=01, SP=10,PC=11
111rr0zs n,r z=1 s=0 r puede ser X,Y,SP o PC
Si tenemos 31483,X entonces:
Rr=00 porque el registro X=00
z=1
s=0
sustituyendo en 11rr0zs tenemos:
o 11100010
o tomando los primeros 4 bits es igual a E
o tomando los segundo 4 bits es igual a 2
o el resultado es E2
Concatenar el valor encontrado en le TABOP con el valor del byte “xb”, quedando
entonces A6E2
Concatenar el valor del operando “31483” en la posición del “eeff”, quedando
entonces A6E27AFB.
2. TABLA:
E2 n,X 16b const
La tabla debe contener:
o El valor del byte xb
o La sisntaxis propuesta
o Un indicador, por ejemplo 16bconst
Si tenemos 31483,X entonces es de 16 bits:
Consultar el modo de direccionamiento (indizado de 16 bits) en la tabla
Si hay conincidencia entonces extraer el valor del byte xb
6
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando
entonces A6E2.
Concatenar el valor del operando “31483” en la posición del “eeff”, quedando
entonces A6E2FF7AFB.
INDIZADO PRE/POST INCREMENTO/DECREMENTO: FORMA “IDX”. REGISTRO X,Y,SP DE 1
A 8 (VALORES DECIMALES).
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Imprimir en pantalla por cada linea del archivo TEMPORAL el código máquina
encontrado
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL STAA 1,-SP 6AAF
0002 NULL STAA 1,SP- 6ABF
0004 NULL STX 2,SP+ 6EB1
0006 NULL STX 2,+SP 6EA1
000E NULL END NULL
Si buscamos en el TABOP la instrucción STAA encontramos que:
El código máquina calculado para IDX es 6ª.
El código máquina por calcular dice “xb” y se corresponde con un byte.
Si buscamos en le TABOP la instrucción STX encontramos que:
El código máquina calculado para IDX es 6E.
El codigo máquina por calcular dice “xb” y se corresponde un byte
¿Comó calcular el byte “xb”?
Se puede hacer de dos maneras:
o utilizando una fórmula.
o Creando una tabla de “bytes xb” para su consulta.
FORMULA:
PostbyteCode (xb) Source Code Syntax Valores de “rr”.X=00, Y=01, SP=10,PC=11
rr1pnnnn n,-r n,+r
p=pre(0) p=post(1)
7
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
n,r- n,r+
n=-8 a -1, +1 a +8 r puede ser X,Y, o SP +8=0111 +7=0110 +6=0101 +5=0100 +4=0011 +3=0010 +2=0001 +1=0000 -1=1111 -2=1110 -3=1101 -4=1100 -5=1011 -6=1010 -7=1001 -8=1000
Si tenemos 1,-SP entonces:
rr = 10 porque el regitro de sp=10
nnnn = 1111 por que la sintaxis 1,-SP ( se interpreta como -1)
p=0 porque es “Pre”
sustituyendo rr1pnnnn tenemos:
o 10101111
o tomando los primeros 4 bytes es igual a A
o tomando los segundos 4 bytes es igula a F
o el resultado es AF
Concatenar el valor encontrado en el TABOP con el vaor del byte XB, quedando
entonces 6AAF.
2. TABLA:
AF 1,-SP Pre-dec
8
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
La tabla debe de contener:
o El valor del byte xb
o La sintaxis propuesta.
o Un indicador, por ejemplo, pre-dec
Si tenemos 1,SP entonces:
Consultar le valor del OPERANDO= “1,-SP” en la tabla
Si hay coincidencia entonces extraer el valor del byte xb
Concatenar el valor encontrador en el TABOP con el valor del byte XB, quedando
entonces 6AAF.
INDIZADO DE ACUMULADOR: FORMA “IDX”. REGISTRO DEL LADO IZQUIERDO: A, B, D.
REGISTROS DEL ALDO DERECHO: X,Y, SP O PC.
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código maquina en formato hexadecimal.
Imprimir e pantalla cada linea del archivo TEMPORAL el código máquina
encontrado
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL LDAA B,X A6E5
0002 NULL LDAA A,X A6E4
0004 NULL LDAA D,X A6E6
0006 NULL END NULL
Si buscamos en el TABOP la instrucciona LDAA encontramos que:
El código máquina calculado es de IDX es A6.
El código máquina por calcular dice “xb” y se corresponde con un byte.
¿Cómo calcular el byte “xb”?
Se puede hacer de dos maneras:
o Utilizando la fórmula
o Creando una tabla de “bytes xb” para su consulta.
1. FORMULA:
PostbyteCode (xb) Source Code Syntax Valores de “rr”.X=00, Y=01, SP=10,PC=11
9
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
111rr1aa A,r B,r D,r
aa: 00=A 01=B 10=D r puede ser Y,X,SP o PC
Si tenemos B,X entonces:
rr = 00 porque el registro de X=00
aa =01 porque el registro de B=01
sustituyendo en 111rr1aa tenemos:
o 11100101
o tomando los primeros 4 bytes es igual a E
o tomando los segundos 4 bytes es igual a 5
o el resultado es E5
concatenando el valor encontrado en el TABOP con el valor del byte XB,
quendando entonces A6e5.
2. TABLA:
E5 B,X B Offset
la tabla debe de contener:
o el valor del byte xb
o la sintaxis propuesta
o un indicador, por ejemplo B Offset
si tenemos B,x entonces:
consultar el valor del OPERANDO = “B,X” en la tabla
si hay coincidencia entonces extraer le valor del byte xb
concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando
entonces A6E5.
10
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Reporte:
1. Describir los algoritmos utilizados para calcular los bytes xb para cada uno de los
posibles modos de indizados.
11
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Tabla de bytes Xb
1
Universidad de Guadalajara Centro universitario de los Altos Ingeniería en Computación Seminario de traductores de lenguaje I
PRÁCTICA #7
Modificar el programa anterior para obtener el código máquina de los modos de direccionamiento indizados complejos.
Leer cada línea del archivo temporal.
Por cada línea del archivo temporal, debemos de dividir la línea en 4 partes: VALOR, ETIQUETA, CODOP, OPERANDO.
Una vez identificadas las partes se procede a analizar la información encontrada. INDIZADO 16 BITS INDIRECTO: FORMA “[IDX2]”; REGISTROS X,Y,SP,PC; DE 0 A 65535 (VALORES DECIMALES).
Buscar en le TABOP el valor de la variable CODOP.
Recuperar el TABOP el código máquina en formato hexadecimal.
Imprimir en la pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL LDAA [10,X] A6E3000A
0004 NULL LDAA [31483,X] A6E37AFB
0008 NULL END NULL
Si buscamos en el TABOP la instrucción LDAA encontramos que:
El código máquina calculado para [IDX2] es A6.
El código máquina por calcular dice “xbeeff” y se corresponde con tres bytes. ¿Cómo calcular el byte “xb”?
Se puede hacer de dos maneras: o Utilizando una fórmula. o Creando la tabla de “bytes xb” para su consulta.
1. Formula:
Postbyte Code (xb) Source Code Syntax Valores de “rr”. X=00, Y=01, SP=10, PC=11
111rr011 [n,r] 0 < n > 65535 r puede ser X,Y,SP o PC
Si tenemos [10,X] entonces:
rr = 00 porque el registro X=00
2
Universidad de Guadalajara Centro universitario de los Altos Ingeniería en Computación Seminario de traductores de lenguaje I
sustituyendo en 111rr011 tenemos: o 11100011 o tomando los primeros 4 bits es igual a E. o Tomando los segundos 4 bits es igual a 3. o El resultado es E3.
Concatenar el valor encontrado en el TABOP con el valor del byte XB quedando entonces A6E3
Luego concatenar el valor de “n” en los dos bytes “eeff” (complementando con ceros a la izquierda) cuando sea necesario, quedando entonces “A6E3000A”
2. Tabla
E3 [n,X] 16b Indr
La tabla debe de contener: o El valor del byte xb o La sintaxis propuesta o Un indicador, por ejemplo, 16bIndr
Si tenemos [10,X] entonces:
Consultar el modo del direccionamiento (indizado de 16 bits indirecto) en la tabla.
Si hay coincidencia entones extraer el valor del byte xb.
Concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando entonces A6E3.
Luego concatenamos el valor de “n” en los dos bytes “eeff” (completando con ceros a la izquierda) cuando sea necesario, quedando entonces “A6E3000A”
INDIZADO DE ACUMULADOR “D” INDIRECTO: FORMA [D,IDX]; REGISTRO DEL LADO IZQUIERDO: D; REGISTRO DEL LADO DERECHO: X,Y,SP O PC).
Buscar en el TABOP el valor de la variable CODOP.
Recuperar del TABOP el código máquina en formato hexadecimal.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL JMP [D,PC] 05FF
3
Universidad de Guadalajara Centro universitario de los Altos Ingeniería en Computación Seminario de traductores de lenguaje I
0002 NULL ADCA [D,X] A9E7
0004 NULL ADCB [D,SP] E9F7
0006 NULL ADDA [D,Y] ABEF
0008 NULL END NULL
Si buscamos en el TABOP la instrucción ADCA encontramos que:
El código máquina calculado para [D,IDX] es A9.
El código máquina por calcular dice “xb” y se corresponde como un byte. ¿Cómo calcular el byte “xb”?
Se puede hacer de dos maneras: o Utilizando una formula. o Creando una tabla de “bytes xb” para su consulta.
1.Formula:
Postbyte Code (xb) Source Code Syntax Valores de “rr”. X=00, Y=01, SP=10, PC=11
111rr111 [D,r] r puede ser X,Y,SP o PC
Si tenemos [D,X] entonces:
rr = 00 porque el registro X=00
sustituyendo en 111rr111 tenemos: o 11100111 o tomando los primeros 4 bits es igual a E. o Tomando los segundos 4 bits es igual a 7. o El resultado es E7.
Concatenar el valor encontrado en el TABOP con el valor del byte XB quedando entonces A9E7
2.Tabla
E7 [D,X] D Indr
La tabla debe de contener: o El valor del byte xb o La sintaxis propuesta o Un indicador, por ejemplo, D Indr
Si tenemos [D,X] entonces:
Consultar el modo del direccionamiento (indizado de acumulador “D” indirecto) en la tabla.
4
Universidad de Guadalajara Centro universitario de los Altos Ingeniería en Computación Seminario de traductores de lenguaje I
Si hay coincidencia entones extraer el valor del byte xb.
Concatenar el valor encontrado en el TABOP con el valor del byte XB, quedando entonces A9E7.
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #8
Modos relativos (de 8 y 16 bits). Modificar el programa anterior para obtener el código máquina
de los modos relativos.
o Leer cada línea del archivo temporal.
-Por cada línea del archivo temporal, debemos de dividir la línea en 4 partes: VALOR,
ETIQUETA CODOP, OPERANDO.
o Una vez identificadas las partes se procede a analizar la información encontrada, por cada
modo de direccionamiento distinto el procedimiento es distinto, se explican a
continuación.
RELATIVOS DE 8 Y DE 16 BITS. RELATIVOS DE 8 Y DE 16 BITS. LOS OPERANDOS SE REPRESENTAN
CON ETIQUETAS. LAS INSTRUCCIONES QUE SON DE 16 BITS CON LA LETRA “L” (LONG). POR CADA
INSTRUCCIÓN LONG HAY UNA SHORT (POR “LBRA” HAY UNA “BRA” 8 BITS).
o Buscar en el TABOP el valor de la variable CODOP.
o Recuperar del TABOP el código máquina en el formato hexadecimal.
o Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Imprime pantalla
0017 NULL ORG $17
0030 UNO EQU $30
0050 DOS EQU $50
0017 NULL BRA UNO 2017
Siguiente CONTLOC 0019 NULL LBRA DOS 18200033
001D NULL BCS UNO 2511
001F NULL LBCS TRES 18250000
Siguiente CONTLOC 0023 TRES BCS DOS 252B
0025 CUATRO SWI NULL 3F
0026 NULL END NULL
TABSIM
UNO 0030
DOS 0050
TRES 0023
CUATRO 0025
Si buscamos en el TABOP la instrucción BRA encontramos que:
o El código máquina calculado para REL es 20.
o El código máquina por calcular dice “rr” y se corresponde con un byte por lo tanto es de 8
bits.
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
¿Cómo calcular el byte “rr”?
o Se tiene que calcular el valor que se denomina DESPLAZAMIENTO.
El valor del desplazamiento para 8 bits tienes que tener un valor entre -128 a 127.
Se calcula en tiempo de ejecución durante el paso 2.
Si el valor del desplazamiento no se encuentra en el rango permitido entonces es
un error.
Si el valor del desplazamiento si se encuentra en el rango permitido entonces se
completa el valor código máquina, concatenando el valor del byte que ya está
calculado con el valor del desplazamiento.
En caso de ser necesario se debe de complementar con un cero a la izquierda del
byte que se corresponda con el desplazamiento.
El byte ya calculado tiene un valor de “20” y el valor del desplazamiento es de
“17” entonces el valor del código máquina es de “2017”.
o Para obtener el desplazamiento se hizo lo siguiente:
Buscar en el TABSIM el valor del OPERANDO= “UNO”
Si se encuentra el valor del operando en TABSIM, se tiene que recuperar el valor
que le corresponda que sería “0030”.
Este valor hay que transformarlo en su representación numérica.
Entonces se debe restar el valor del operando menos el valor del SIGUIENTE
contador de localidades que sería “0019”.
Desplazamiento: 48 - 25 = 23 (en su representación hexadecimal seria 30 – 19 = 17).
Si el valor del desplazamiento fuera negativo hay que realizar complemento para
obtener su representación hexadecimal, del valor del complemento hay que tomar
el “byte más significativo” (byte más a la derecha).
Hay que validar el rango de desplazamiento. ¿23 está entre -128 a 127?
Si es así entonces concateno el valor “20” con el valor “17”
Si no es así entonces se generan un error: “RANGO DEL
DESPLAZAMIENTO NO VÁLIDO”.
Si buscamos en el TABOP la instrucción LBCS encontramos que:
o El código máquina calculado para REL es 1825.
o El código máquina por calcular dice “qqrr” y se corresponde con un byte por lo tanto es de
16 bits.
¿Cómo calcular el byte “qqrr”?
o Se tiene que calcular el valor que se denomina DESPLAZAMIENTO.
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
El valor del desplazamiento para 16 bits tienes que tener un valor entre -
32768 a 32767.
Se calcula en tiempo de ejecución durante el paso 2.
Si el valor del desplazamiento no se encuentra en el rango permitido
entonces es un error.
Si el valor del desplazamiento si se encuentra en el rango permitido
entonces se completa el valor código máquina, concatenando el valor de
los dos bytes que ya está calculado con el valor del desplazamiento.
En caso de ser necesario se debe de complementar con un cero a la
izquierda del byte que se corresponda con el desplazamiento.
Los dos bytes ya calculados tiene un valor de “1825” y el valor del
desplazamiento es de “0000” entonces el valor del código máquina es de
“18250000”.
o Para obtener el desplazamiento se hizo lo siguiente:
Buscar en el TABSIM el valor del OPERANDO= “TRES”
Si se encuentra el valor del operando en TABSIM, se tiene que recuperar el
valor que le corresponda que sería “0023”.
Este valor hay que transformarlo en su representación numérica.
Entonces se debe restar el valor del operando menos el valor del
SIGUIENTE contador de localidades que sería “0023”.
Desplazamiento: 35 - 35 = 0 (en su representación hexadecimal seria 23 –
23 = 0).
Si el valor del desplazamiento fuera negativo hay que realizar
complemento para obtener su representación hexadecimal, del valor del
complemento hay que tomar los “bytes más significativos” (bytes más a la
derecha).
Hay que validar el rango de desplazamiento. ¿00 está entre -132768 a
32767?
Si es así entonces concateno el valor “1825” con el valor “0000”
Si no es así entonces se generan un error: “RANGO DEL
DESPLAZAMIENTO NO VÁLIDO”.
Otros ejemplos
VALOR ETIQUETA CODOP OPERANDO Imprime pantalla
0000 NULL ORG $0
0000 UNO DS 10
000A NULL BRA UNO 20F4
Siguiente CONTLOC 000C DOS DS 4096
100C NULL LBRA DOS 1820EFFC
Siguiente CONTLOC 1010 NULL END NULL
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
TABSIM
UNO 0000
DOS 000C
Desplazamientos:
0 – 12 = -12 (000 – 000C = FFF4)
12 – 4112 = -4100(000C – 1010 = EFFFC)
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #9 Obtener el código maquina utilizando etiquetas (extendido), y obtener el código máquina de las directivas de tipo CONSTANTE (de 1, de 2 bytes y de carácter).
o Leer cada línea del archivo temporal.
o Por cada línea del archivo temporal, debemos de dividir la línea en 4 partes:
VALOR
ETIQUETA
CODOP
OPERANDO
o Una vez identificadas las partes se procede a analizar la información encontrada, por cada modo de
direccionamiento O POR CADA DIRECTIVA el procedimiento es distinto, se explican a continuación.
ENTENDIDO
o Buscar en el TABOP el valor de la variable CODOP.
o Recuperar del TABOP el código máquina en formato hexadecimal.
o Si el OPERANDO está representado con ETIQUETAS:
Buscar en el TABOP el valor de la variable CODOP.
Recuperar el TABOP el código máquina en el formato hexadecimal.
Calcular el código máquina faltante:
Buscar la ETIQUETA (que es el OPERANDO) en el TABSIM:
Sí se encuentra:
Recuperar el valor de la ETIQUETA del TABSIM.
Concatenar el código máquina del TABOP con el valor del TABSIM.
Sí no se encuentra:
Generar un mensaje de error.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina encontrado.
VALOR ETIQUETA CODOP OPERANDO Lo que debe decir en la pantalla
0000 NULL ORG 0
0038 VALOR1 EQU $38
0000 NULL LDAA VALOR1 F60038
0003 NULL END
DIRECTIVAS DE CONSTANTES DEL LENGUAJE ENSAMBLADOR
o DE UN BYTE (DB, DC.B, FCB): Todas estas pueden tomar valores entre 0 a 255, en cualquier base numérica.
Este valor se representa como el OPERANDO. Incrementan el CONTADOR DE LOCALIDADES (CONTLOC) en
1.
o DE DOS BYTES (DW, DV.W, FDB): Todas estas pueden tomar valores entre 0 a 65535, en cualquier base
numérica. Este valor se representa como el OPERANDO. Incrementan el CONTADOR DE LOCALIDADES
(CONTLOC) en 2.
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o DE CARACTERES (FCC): Su valor se representa entre comillas dobles (“valor”). El valor se representa con
cualquier carácter del código ASCII (incluso, por ejemplo, el espacio en blanco). Este valor se representa
como el OPERANDO. Incrementa el CONTADOR DE LOCALIDADES (CONTLOC) en su equivalente de
(longitud del operando -2).
Identificar que el valor de la variable CODOP sea una directiva de tipo constante.
Calcular el código máquina en formato hexadecimal de la directiva.
Imprimir en pantalla por cada línea del archivo TEMPORAL el código máquina calculado.
VALOR ETIQUETA CODOP OPERANDO Imprime en pantalla
0000 NULL ORG $0
0000 NULL DW 4096 1C00
0002 NULL DB 15 OF
0003 NULL DW 65536 Error
0005 NULL DB 4096 Error
0006 NULL FCC “hola mundo” 686F6C61206D756E646F
0010 NULL END NULL
o Para el caso de DW (y sus sinónimos) se debe de verificar que el valor del operando sea numérico, que
este en un rango de 0 a 65535, y representarlo en base hexadecimal. Si es necesario se debe de completar
con ceros a la izquierda. En caso de que exceda el rango se debe mostrar un mensaje de error.
o Para el caso de DB (y sus sinónimos) se debe de verificar que el valor del operando sea numérico, que este
en un rango de 0 a 255, y representarlo en base hexadecimal. Se debe de completar con ceros a la
izquierda. En caso de que exceda el rango se debe mostrar un mensaje de error.
o Para el caso de FCC se debe de obtener el valor de ASCII de cada carácter que se encuentre en comillas,
este valor se debe de representar en base hexadecimal. Por ejemplo, la letra “h” se corresponde con el
valor 104 ASCII y se representa con el valor 68 en formato hexadecimal; el espacio en blanco se
corresponde con el valor 32 ASCII y se representa con el valor 68 en formato hexadecimal; el espacio en
blanco se corresponde con el valor 32 ASCII y se representa con el valor 20 en formato hexadecimal. Se
deben de distinguir claramente entre los valores de las letras mayúsculas y las letras minúsculas, por
ejemplo:
ORG $0 FCC ´h´(código máquina 68) FCC ´H´ (código máquina 48) END
o El resto de las directivas como son DS, DS.B, DS.W, RMB y RME no generan código máquina.
Reporte: Describir como se obtienen los códigos máquinas de las directivas y como se obtiene el código máquina del modo de direccionamiento, extendido.
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #10
Generar el archivo objeto. Considerando como influyen las directivas de reserva de espacio y su
relación con la generación del archivo de código máquina.
Para realizar esta práctica es necesario conocer los registros del código objeto para la arquitectura
HC12, como son S0, S1 y S9. El código objeto se representa con un archivo que genera en tiempo
de ejecución y que tiene la extensión.OBJ o .S19, es un archivo de texto y contiene todos los
códigos máquinas que se generan desde el archivo temporal y que se representan en formato
hexadecimal. Los formatos de los registros son los siguientes:
Tipo del registro Puede ser $0, $1 o $9.
Longitud del registro S0: tiene una longitud variable en bytes. S1: tiene una longitud máxima de 19 (13 hex.) bytes. S9: tiene una longitud máxima de 3 (3 hex.) bytes.
Dirección S0: tiene siempre una dirección de 0000. S1: tiene una dirección variable y se toma del archivo temporal. S9: tiene siempre una dirección de 0000.
Código o datos S0: se corresponde al nombre del archivo .ASM, incluye el nombre de la unidad de disco, y caracteres de control como el enter. S1: se corresponde al código máquina que se genera línea por línea desde el archivo temporal. S9: este campo no aplica para este registro.
Checksum S0: su valor nunca será igual. S1: su valor será diferente para cada registro de este tipo. S1: su valor será diferente para cada registro de este tipo. S9: su valor siempre será FC.
Siempre se generará sólo un registro S0, se generaran uno o varios registros S1 y siempre se
generara solo un registro S9.
El registro S0 se conoce como “registro de encabezamiento” o como el registro H.
El registro S1 se conoce como “registro de texto” o como el registro T.
El registro S9 se conoce como “registro de fin” o como el registro E.
La longitud del registro se corresponde con la cantidad de pares de caracteres representados en
el registro, sin contar el tipo y el área para representar la longitud, por ejemplo: S1051041653F05
En este ejemplo el valor de la longitud está subrayado (05) significa que hay 5 pares de caracteres que se corresponderían con 10 41 65 3F 05.
2
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
El campo del checksum se calcula sumando los valores representados por pares (incluyendo los valores de la longitud, la dirección, el código y los datos) a la suma se le calcula el complemento a uno y se representa el resultado tomando el byte menos significativo del complemento. Por ejemplo:
S10410443F-- En este caso en el ejemplo se está representado el tipo (S1), la longitud que es (04), la dirección que es (1044), cl código o datos que es (3F) y falta representar en el último par el byte del checksum. El checksum para este ejemplo es de (68), para calcularlo se realizó la siguiente suma 04+10+44+3F= 97, se obtiene complemento a uno y da como resultado FF68, se toma el byte que está representado a la derecha de este resultado (68) y este es el que se representa al final del registro S1. El registro S1 terminado se representaría de la siguiente manera:
S10410443F68 El nombre del archivo que se representa en cl registro SO se ejemplifica en el siguiente caso:
S015000046696C653A2041736D54656D702E61736DOA Este ejemplo consta de las siguientes partes:
SO cs el tipo
15 es la longitud del registro
0000 es la dirección del registro
46696C653A2041736D54656D702E61736DOA es el nombre el archivo
EO es el checksum Los valores representados en el nombre del archivo se corresponden con los caracteres enlistados en la segunda fila de esta matriz.
46 69 6C 65 3A 20 41 73 6D 54 65 6D 70 2E 61 73 6D 0A
F i l e : A s m T e m p . a s m LF
En realidad en donde dice "File: "se tiene que representar el nombre de la unidad donde está almacenado el archivo .ASM por ejemplo "A:" que se representaría en hexadecimal como 413A.
En donde dice "AsmTemp" se debe de representar el nombre del archivo .ASM.
En donde dice ".asmLF" siempre se debe de representar la terminación (es decir la extensión más el carácter LF) del archivo con el código en ensamblador.
El registro S9 siempre contiene una longitud de 03, una dirección de 0000 y un checksum de FC, por lo tanto, siempre tendrá cl siguiente valor:
S903000FC. Cuando se haga referencia a "una línea de listado" se refiere a que en el programa Ensamblador (por ejemplo, programa en lenguaje C) se estarán calculando y concatenando todos los elementos necesarios para crear cada uno de los registros del código objeto (SO, S1 y S9). Para preparar la línea de listado del registro SO necesitan conocer sólo el nombre del archivo .ASM (o bien el nombre del archivo .TXT). El tipo siempre será constante SO, la longitud siempre se debe de calcular en tiempo de ejecución. La dirección siempre será 0000, y el checksum siempre se
3
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
calcula en tiempo de ejecución, cuando el programa calcula y tiene identificado todos elementos los debe de concatenar como un solo elemento y como es cl primer registro del archivo de código objeto se debe de crear el ARCHIVO OBJETO. Este archivo se crea en tiempo de ejecución con la extensión .OBJ o bien con la extensión .S19. Una vez que se crea el archivo se añade la 'línea de listado" en su representación de registro SO. La longitud de este registro siempre podrá tener un valor mínimo que sería de 08, distribuida de la siguiente manera:
2 pares de la dirección
5 pares de la extensión (.ASM If) 0 (.TXTlf)
1 par del checksum Para preparar la línea de listado del registro S1, el algoritmo se complica, en el sentido de que se tiene que estar leyendo el archivo temporal y por cada línea que crea código máquina se debe de añadir información a la línea de listado de un registro S1 o bien crear una nueva línea de listado. Los registros S1 tienen una longitud máxima de 19 (en su representación en hexadecimal 13), estos 19 pares de caracteres están distribuidos de la siguiente manera, consideremos el ejemplo:
S1131000A9E30000A9EB0000A9F30000A9FB00007C
S1 es el tipo del registro y no se contabiliza entre los 19 pares de caracteres.
13 es la longitud del registro y no se contabiliza entre los 19 pares de caracteres.
El resto del ejemplo se corresponde con estos 19 pares: o 1000A9E30000A9EBOOOOA9F30000A9FB00007C
Son dos pares de la dirección (1000)
Son 16 pares del código o datos (A9E30000A9EB0000A9F30000A9FB0000)
Es un par del checksum (7C)
En total suman los 19 pares, 2+16+1 que se corresponden a los pares de la longitud + pares del código o datos + par del checksum.
La longitud mínima del registro S1 será de 03, los cuales son están representados por los siguientes valores: Son dos pares de la dirección, y un par del checksum. Para obtener el código máquina del siguiente ejemplo, se debe de proceder de la siguiente manera:
No. de línea Valor Etiqueta Codop Operando Código máquina
1 NULL Org $1000
2 NULL Adca [0,x] A9e30000
3 NULL Adca [0,y] A9eb0000
4 NULL Adca [0,sp] A9f30000
5 NULL Adca [0,pc] A9fb0000
6 NULL Swi NULL 3f
7 NULL Ds.b $20
8 NULL Adca [0,x] A9e30000
9 NULL adca [0,y] A9eb0000
10 NULL adca [0,pc] A9f30000
11 NULL fcc ‘abcde’ 6162636465
4
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
12 NULL Swi NULL 3f
13 NULL Ds.b $1
NULL Swi NULL 3f
NULL Ds.b $1
NULL Swi NULL 3f
NULL Swi NULL 3f
NULL Swi NULL 3f
NULL Swi NULL 3f
NULL Swi NULL 3f
NULL Ds.b $1
NULL Fcc “abcde” 6162636465
NULL end NULL
Línea no. 1. Como el CODOP = ORG entonces se debe de crear el registro S0. Una vez creado se deberá de añadir al archivo que tenga la extensión .OBJ. Leer la siguiente línea de entrada. Línea no. 2. Generar el código máquina (A9E30000). Añadirlo en un registro S1. Si no existe un registro S1 entonces hay que crearlo, parte por parte.
S1+longitud+dirección+código+checksum
La longitud = 3
La dirección 1000 (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 4, y si verificamos ¿4 es menor igual que 16? Si, entonces se añade el código máquina.
Quedaría entonces: o S1+longitud+1000+A9E30000+checksum
Leer la siguiente línea de entrada. Línea no. 3. Generar el código máquina (A9EBOOOO). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1000 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 4, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 8, y si verificamos ¿8 es menor igual que 16? Si.
Quedaría entonces: o S1+longitud+1000+A9E30000A9EB0000+chccksum
Leer la siguiente línea de entrada.
5
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Línea no. 4. Generar el código máquina (A9F30000). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1000 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 8, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 12, y si verificamos ¿12 es menor igual que 16? Si.
Quedaría entonces: o S1+longitud+1000+A9E30000A9EB0000A9F300004checksum
Leer la siguiente línea de entrada.
Línea no. 5. Generar el código máquina (A9FB0000). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1000 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro SI por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 12, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la
longitud_del_código sería = 16, y si verificamos ¿16 es menor igual que 16? Si.
Quedaría entonces: o S1+longitud+1000+A9E30000A9EB0000A9F30000A9FB0000+checksum
Leer la siguiente línea de entrada. Línea no. 6. Generar el código máquina (3F). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1000 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 16, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? No, porque la longitud_del_código sería = 17, y si verificamos ¿17 es menor igual que 16? No.
Como se ha alcanzado la longitud máxima del código entonces se deben de calcular los demás valores que conforman el registro S1.
La longitud (del registro) sería entonces longitud = longitud + longitud_del_código = 3 + 16 = 19 (13 en hex.)
Quedaría entonces: o S1+13+1000+A9E30000A9EB0000A9F30000A9FB0000+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 13+10+00+A9+E3+00+00+A9+EB+00+00+A9+F3+00+00+A9+FB+00+00, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte que sería (7C).
Quedaría entonces:
6
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
o S1+13+1000+A9E30000A9EB0000A9F30000A9FB0000+7C o “S1131000A9E30000A9EB0000A9F30000A9FB00007C" (añadir esta cadena de
caracteres al archivo .OBJ)
Crear un nuevo registro S1. E inicializar las variables.
La longitud = 3
La dirección 1010 (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 1, y si verificamos ¿1 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1010+3F+checksum
Leer la siguiente línea de entrada. Línea no. 7. Esta línea NO genera código máquina, Por lo que el registro SI que se estuviera conformando se debe de concluir, INDEPENDIENTEMENTE de si alcanzó o no alcanzó la longitud_del_código de 16.
La longitud = 3 (permanece igual)
La dirección 1010 (permanece igual)
La longitud (del registro) sería entonces longitud = longitud + longitud_del_código = 3+1 = 4(04 en hex.)
Quedaría entonces: o S1+04+1010+3F+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 04+10+10+3F, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte que sería (9C).
Quedaría entonces: o S1+04+1010+3F+9C o "S10410103F9C" (añadir esta cadena de caracteres al archivo .OBJ)
Leer la siguiente línea de entrada. Línea no. 8. Generar el código máquina (A9E30000)
Crear un nuevo registro S1. E inicializar las variables.
La longitud = 3
La dirección 1031 (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro SI por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 4, y si verificamos ¿4 es menor igual que 16? Sí.
7
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Quedaría entonces: o S1+longitud+1031+A9E30000+checksum
Leer la siguiente línea de entrada. Línea no. 9. Generar el código máquina (A9EBOOOO). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1031 (no se requiere utilizar ninguna dirección nueva)
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 4, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 8, y si verificamos ¿8 es menor igual que 16? Si.
Quedaría entonces: o S1+longitud+1031+A9E30000A9EB0000+chccksum
Leer la siguiente línea de entrada. Línea no. 10. Generar el código máquina (A9FB0000). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1031 (no se requiere utilizar ninguna dirección nueva)
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro SI por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 8, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 12, y si verificamos ¿12 es menor igual que 16? Si.
Quedaría entonces: o S1+10ngitud+1031+A9E30000A9EB0000A9FB0000+checksum
Leer la siguiente línea de entrada. Línea no. 11. Generar el código máquina (6162636465). Añadirlo en un registro S1 existente.
La longitud = 3 (permanece igual)
La dirección 1031 (no se requiere utilizar ninguna dirección nueva)
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código = 12, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Parcialmente, porque la longitud_del_código sería = 17, y si verificamos ¿17 es menor igual que 16? No, sin embargo, quedan disponibles 4 pares y se requieren 5 pares, por lo tanto se debe de representar en el registro S1 4 de los 5 pares que requerimos y dejar pendiente el par restante.
Quedaría entonces: o S1+longitud+1031+A9E30000A9EB0000A9FB000061626364+checksum o Quedaría pendiente crear un nuevo registro S1 y colocar en ese registro el valor
65.
La longitud (del registro) sería entonces longitud-longitud + (13 en hex.)
8
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Quedaría entonces: o S1+13+1031+A9E30000A9EB0000A9FB000061626364+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 13+10+31+A9+E3+00+00+A9+EB+00+00+A9+FB+00+00+61+62+63+64, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte que sería (5D).
Quedaría entonces: o S1+13+1031+A9E30000A9EB0000A9F3000061626364+5D o “S1131031A9E30000A9EB0000A9F30000616263645D" (añadir esta cadena de
caracteres al archivo .OBJ)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección en este caso se debe de recalcular de la siguiente manera: la dirección que se corresponde con la línea que se está leyendo actualmente es la 103D, a partir de esta dirección se asignaron 4 bytes (61626364) por lo tanto hay que sumar a la dirección 103D la cantidad de bytes colocados (103D + 4 = 1041).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería = 1, y si verificamos ¿1 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1041+65+checksum
Leer la siguiente línea de entrada. Línea no. 12. Generar el código máquina (3F). Añadirlo en un registro S1 existente.
La longitud= 3 (permanece igual)
La dirección 1041 (no se requiere utilizar ninguna dirección nueva)
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 1 ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 2, y si verificamos ¿2 es menor igual que 16? Si.
Quedaría entonces: o Sl+longitud+1041+653F+checksum
Leer la siguiente línea de entrada. Línea no. 13. Esta línea NO genera código máquina. Por lo que el registro SI que se estuviera conformando se debe de concluir, INDEPENDIENTEMENTE de si alcanzó o no alcanzó la longitud_del_código de 16.
La longitud= 3 (permanece igual)
La dirección 1041 (permanece igual)
La longitud (del registro) sería entonces longitud = longitud + longitud_del_código = 3 + 2 = 5 (05 en hex.)
9
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Quedaría entonces: o S1+05+1041+653F+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 05+10+41+65+3F, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte más significativo que sería (05).
Quedaría entonces: o S1+05+1041+653F+05 o "S1051041653F05" (añadir esta cadena de caracteres al archivo .OBJ)
Leer la siguiente línea de entrada. Línea no. 14. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección 1044 (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 1, y si verificamos ¿1 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1044+3F+checksum
Leer la siguiente línea de entrada.
Línea no. 15. Esta línea NO genera código máquina. Por lo que el registro SI que se estuviera conformando se debe de concluir, INDEPENDIENTEMENTE de si alcanzó o no alcanzó la longitud_del_código de 16.
La longitud= 3 (permanece igual)
La dirección 1044 (permanece igual)
La longitud (del registro) sería entonces longitud= longitud + longitud_del_código= 3 + 1= 4 (04 en hex.)
Quedaría entonces: o S1+04+1044+3F+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 04+10+44+3F, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte que sería (68).
Quedaría entonces: o S1+04+1044+3F+68 o “S10410443F68" (añadir esta cadena de caracteres al archivo .OBJ)
Leer la siguiente línea de entrada. Línea no. 16. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
10
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
La longitud= 3
La dirección 1046 (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 1, y si verificamos ¿1 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1046+3F+checksum
Leer la siguiente línea de entrada. Línea no. 17. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección 1046 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 2, y si verificamos ¿2 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1046+3F3F+checksum
Leer la siguiente línea de entrada. Línea no. 18. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección 1046 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 3, y si verificamos ¿3 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1046+3F3F3F+checksum
Leer la siguiente línea de entrada. Línea no. 19. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección 1046 (no se requiere utilizar ninguna dirección nueva).
11
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 4, y si verificamos ¿4 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1046+3F3F3F3F+checksum
Leer la siguiente línea de entrada. Línea no. 20. Generar el código máquina (3F)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
La dirección 1046 (no se requiere utilizar ninguna dirección nueva).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en el registro S1? Sí, porque la longitud_del_código sería= 5, y si verificamos ¿5 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+1046+3F3F3F3F3F+checksum
Leer la siguiente línea de entrada. Línea no. 21. Esta línea NO genera código máquina. Por lo que el registro S1 que se estuviera conformando se debe de concluir, INDEPENDIENTEMENTE de si alcanzó o no alcanzó la longitud_del_código de 16.
La longitud= 3 (permanece igual)
La dirección 1046 (permanece igual)
La longitud (del registro) sería entonces longitud= longitud + longitud_del_código= 3 + 5 = 8 (04 en hex.)
Quedaría entonces: o S1+08+1046+3F3F3F3F3F+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 08+1046+3F3F3F3F3F, al resultado de la suma se le debe de calcular complemento a 1 y tomar el byte que sería (66).
Quedaría entonces: o S1+08+1046+3F3F3F3F3F+66 o “S10810463F3F3F3F3F66" (añadir esta cadena de caracteres al archivo .OBJ)
Leer la siguiente línea de entrada. Línea no. 22. Generar el código máquina (6162636465)
Crear un nuevo registro S1. E inicializar las variables.
La longitud= 3
12
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
La dirección 104C (este valor se toma de la línea que estamos leyendo en el archivo temporal).
Recuerda que como máximo se pueden representar 16 pares de caracteres como código en el registro S1 por lo que se tiene que realizar una verificación previa.
La longitud_del_código= 0, ¿si representamos el código máquina que se acaba de crear se puede representar en cl registro S1? Sí, porque la longitud_del_código sería= 5, y si verificamos ¿5 es menor igual que 16? Sí.
Quedaría entonces: o S1+longitud+104C+6162636465+checksum
Leer la siguiente línea de entrada. Línea no. 23. El CODOP END, por lo que el registro SI que se estuviera conformando se debe de concluir, INDEPENDIENTEMENTE de si alcanzó o no alcanzó la longitud_del_código de 16.
La longitud= 3 (permanece igual)
La dirección 104C (permanece igual)
La longitud (del registro) sería entonces longitud= longitud + longitud_del_código= 3 + 5= 8 (08 en hex.)
Quedaría entonces: o S1+08+104C+6162636465+checksum
Una vez calculada la longitud se debe de calcular el checksum que sería la suma de 08+104C+6162636465, al resultado de la suma se le debe de calcular complemento a 1 y tomar el que sería (AC).
Quedaría entonces: o S1+08+104C+6162636465+AC o “S108104C6162636465AC" (añadir esta cadena de caracteres al archivo .OBJ)
Una vez añadido el último registro S1 entonces, es necesario crear el registro S9 el cual siempre tendrá el valor de S9030000FC.
Nota: Los ejemplos que se utilizaron para representar los nombres de los archivos en el ejemplo para los S0 fueron aleatorios.
Otro ejemplo para la práctica no. 10.
13
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
No. ETIQUETA CODOP OPERANDO No. VALOR ETIQUETA CODOP OPERANDO
1 Pri equ 1 1 0001 Pri equ 1
2 Seg equ 2 2 0002 Seg equ 2
3 ; comentario uno 3 0003 Ter equ 3
4 Ter equ 3 4 0004 Cua equ 4
5 ; comentario dos 5 00FF null Org 255
6 Cua equ 4 6 00FF Et Ds.b 5
7 Org 255 7 0000 Otra Equ 0
8 Et Ds.b 5 8 0104 null Swi null
9 Otra Equ 0 9 0105 null Ds.w 5
10 Swi 10 0005 Qui equ 5
11 Ds.w 5 11 010F Null Swi null
12 Qui equ 5 12 0006 Sex equ 6
13 Swi 13 0110 Sep Swi Null
14 Sex equ 6 14 0008 Oct equ 8
15 Sep Swi 15 0111 null Ldaa 3
16 Oct equ 8 16 0113 null Ldaa Sep
17 Ldaa 3 17 0116 null Ds.b 3
18 Ldaa Sep 18 0119 null Ldaa 3
19 Ds.b 3 19 0009 Nov equ 9
20 Ldaa 3 20 011B null Swi Null
21 Nov equ 9 21 011C null Dc.b 2
22 Swi 22 000A Dec equ 10
23 Dc.b 2 23 000B Onc equ 11
24 ; comentario tres 24 000D Tre equ 13
25 Dec equ 10 25 011D null Ds.b 1
26 Onc equ 11 26 011E null End null
27 Tre equ 13
28 Ds.b 1
29 End
14
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
S0… S10401043FB7 S10A01F3F3F9603B6011007 S107011996033F0204 S9030000FC
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #11 CARGADOR
Instrucciones. Tomando como base el pseudocódigo del cargador absoluto de la arquitectura SIC,
realiza el pseudocódigo para el algoritmo del cargador absoluto para la arquitectura HC12,
considerando que el registro S0 es el registro de encabezamiento, el registro S1 es el registro de
texto y el registro S9 es el fin.
Pseudocódigo del cargador – absoluto para la arquitectura SIC:
Comienza Leer el registro de encabezamiento Verifica el nombre del programa y la longitud Lee el primer registro de texto
Mientras el tipo del registro < > ‘E’ hacer {si el código objeto está en forma de caracteres, se convierte en una representación interna} Pasa el código objeto a la localidad de memoria especificada Lee el siguiente registro del programa objeto Termina
Salta a la dirección especificada en el registro de fin Termina
1
Universidad de Guadalajara
Centro universitario de los Altos
Ingeniería en Computación
Seminario de traductores de lenguaje I
PRÁCTICA #12. LIGADOR
Instrucciones. Investiga los diferentes tipos de ligadores que se pueden implementar y determina
cual sería el más conveniente para la arquitectura HC12, deberás de justificar tu respuesta, anotar
en qué consiste la teoría del ligador que hubieras seleccionado, anotar las ventajas y desventajas
que ofrece este algoritmo, en una tabla como la que se muestra a continuación.
Nombre del ligador:------------------------------------------------
Justificación: "anotar aquí la justificación”
Teoría: "anotar aquí en qué consiste la teoría”
Ventajas: Desventajas
"anotar aquí las ventajas" "anotar aquí las desventajas"
top related