Clase 7 Assembly - Simulador MSX88
Instrucciones Escribir el prog que implemente F = [(A+B)/C]-D usando máq de 1, 2 ó 3 dir. nombre tamaño valor A: 1 byte 6 B: 1 byte 4 C: 1 byte 2 D: 1 byte 1 F: 1 byte ? Maq. de 1 dirección load A add B div C sub D store F Maq. de 2 direcciones mov F, A add F, B div F, C sub F, D Maq. de 3 direcciones add F, A, B div F, F, C sub F, F, D
Instrucciones Maq. de 1 dirección load A add B div C sub D store F Maq. de 2 direcciones mov F, A add F, B div F, C sub F, D Maq. de 3 direcciones add F, A, B div F, F, C sub F, F, D Suponiendo que cada cód de operación ocupa 6 bits y las dir son de 10 bits. Tam del prog en mem (cod.operación + op) Cant de accesos a mem (instrucciones + op) M. de 1 dirección (6*5) + (10*5) = = 80 bits = 10 bytes (5 + 5) = 10 accesos M. de 2 direcciones (6*4) + ((10+10)*4) = = 104 bits = 13 bytes [4+(2+3+3+3)] = 15 acc M. de 3 direcciones (6*3) + ((10+10+10)*3) = = 108 bits = 13,5 bytes [3+(3+3+3)] = 12 acc
(Lenguaje de ensamble) Assembler (Ensamblador) Lenguaje Assembly Assembly (Lenguaje de ensamble) Otro lenguaje que, en principio, es un mapeo directo de esos códigos a instrucciones comprensibles por un humano. Lenguaje de máquina Conjunto de instrucciones codificadas. Es el único lenguaje que una computadora entiende. Assembler (Ensamblador) Programa encargado de tomar programas escritos en Assembly y generar los códigos que la computadora entenderá.
Assembly Datos Variables Registros Los datos en assembly pueden estar en memoria (variables) o en registros Variables Nombre DB valor_inicial Nombre DW valor_inicial Registros AX (AH - AL) BX (BH - BL) CX (CH - CL) DX (DH - DL) DB (Byte) = 8 bits DW (Word) = 16 bits Ejemplos var1 DB 10 var2 DW ? tabla DB 1, 2, 3, 4, 5 string DB “Esto es un string” (ASCII) var3 DW 0ABCDH var4 DB 10101010B Hexadecimal Binario
Indirecto por registro Assembly Modos de direccionamiento Inmediato Directo Por registro Indirecto por registro Cod_op Operando1 operando2
No requiere acceso extra a memoria Assembly Direccionamiento Inmediato No requiere acceso extra a memoria Cod_op valor
Accede al operando que se encuentra en la memoria en la celda indicada Assembly Direccionamiento Directo 1 acceso extra a memoria Accede al operando que se encuentra en la memoria en la celda indicada Cod_op Dirección_operando Memoria operando
Assembly Direccionamiento Por registro No requiere accesos a memoria El valor del operando se encuentra en el registro indicado Cod_op registro Registros AX BX operando …
Requiere un acceso extra a memoria Assembly Direccionamiento indirecto por registro Requiere un acceso extra a memoria El registro contiene la dirección de la celda donde se encuentra el valor. Cod_op registro Memoria operando Registros AX BX dir_operando …
Assembly Transferencia Ejemplo MOV destino, origen ORG 1000h Para todas las operaciones los operandos deben ser: Reg / Reg Reg / Mem Reg / op. inm Mem / Reg Mem / op. inm Transferencia MOV destino, origen Mem / Mem Ejemplo ORG 1000h var1 DB 20h var2 DB ? ORG 2000h … MOV AL, var1 //Copia el valor de var1 en AL MOV var2, AL //Copia el valor de AL en var2 La directiva del ensamblador ORG indica a partir de qué posición de memoria deben ubicarse las instrucciones que van a continuación var1 estará en la pos 1000H y var2 en 1001H Si var1 fuera dw, donde estaría var2
Assembly ¿ Podría hacer ADD dato1, dato2 ?? Ejemplo Operaciones aritméticas ADD OP1, OP2 SUB OP1, OP2 OP1 = OP1 + OP2 OP1 = OP1 - OP2 Ejemplo ORG 1000h dato1 DW 10 dato2 DW 20 res DW ? ORG 2000h MOV AX, dato1 ADD AX, dato2 MOV res, AX END ¿ Podría hacer ADD dato1, dato2 ??
Assembly Operaciones aritméticas 2 ADC OP1, OP2 SBB OP1, OP2 INC OP DEC OP OP1 = OP1 + OP2 + C OP1 = OP1 - OP2 - C OP = OP + 1 OP = OP – 1
Las operaciones lógicas y aritméticas setean flags Assembly Operaciones lógicas AND OP1, OP2 OR OP1, OP2 XOR OP1, OP2 NOT OP NEG OP OP1 = OP1 and OP2 OP1 = OP1 or OP2 OP1 = OP1 xor OP2 OP = ~ OP (Ca1) OP = ~ OP (Ca2) Las operaciones lógicas y aritméticas setean flags
Solo setea flags (no guarda el resultado) Assembly Comparación CMP OP1, OP2 OP1 - OP2 Solo setea flags (no guarda el resultado)
Ejercicio 1 Num0 Num1 Num2 Num3 Num4 ORG 1000H NUM0 DB 0CAH NUM1 DB 0 1002H 1003H 1004H CD 1005H AB 1006H 1007H … 2000H CA 34H ORG 1000H NUM0 DB 0CAH NUM1 DB 0 NUM2 DW ? NUM3 DW 0ABCDH NUM4 DW ? ORG 2000H MOV BL, NUM0 MOV BH, 0FFH MOV CH, BL MOV AX, BX MOV NUM1, AL MOV NUM2, 1234H MOV BX, OFFSET NUM3 MOV DL, [BX] MOV AX, [BX] MOV BX, 1006H MOV WORD PTR [BX], 1006H HLT END 12H 06H 10H AB CD AX FF CA AX Copia en BL num0 Copia en BH FF Copia en CH BL Copia BX en AX Copia AL en num1 Copia 1234H en num2 BX 10 06H 10 04 BX FF CA BX CA CX CD DL Copia en BX la dir de num3 Copia en DL, el contenido de la celda apuntada por BX Copia en AX, el contenido de la celda apuntada por BX Copia 1006H en BX Copia en 1006H a partir de la dir de BX (copia 2 bytes) Indica a la CPU que ya no hay mas inst para leer Indica al ensamblador que no hay mas inst para traducir Se usa ri (buffer de direcciones) guarda temporalmente la dir de BX - id (buffer de datos) para guardar temporalmente el 1006H Por la indirección [BX] se usa ri (buffer de direcciones) para guarda temporalmente la dir de BX
Ejercicio 2 ORG 1000H NUM0 DB 80H NUM1 DB 200 NUM2 DB -1 BYTE0 BYTE1 1000H 80H = 1000 0000 1001H C8H = 1100 1000 1002H FFH = 1111 1111 1003H 7FH = 0111 1111 1004H AAH = 1010 1010 … 2000H ORG 1000H NUM0 DB 80H NUM1 DB 200 NUM2 DB -1 BYTE0 DB 01111111B BYTE1 DB 10101010B ORG 2000H MOV AL, NUM0 ADD AL, AL INC NUM1 MOV BH, NUM1 MOV BL, BH DEC BL SUB BL, BH MOV CH, BYTE1 AND CH, BYTE0 NOT BYTE0 OR CH, BYTE0 XOR CH, 11111111B HLT END 80 = 1000 0000 200 decimal = C8H -1 en Ca2 = FFH 0111 1111 = 7FH 1010 1010 = AAH 1000 0000 + 1000 0000 1 0000 0000 AL = num0 AL = AL + AL AL = 00H= 0000 0000 FLAGS: O:1 Z:1 C:1 S:0 NUM1 = NUM1 + 1 NUM1 = C9h = 1100 1001 FLAGS: O: 0 Z:0 C:0 S:0 BH = NUM1 BH = C9h = 1100 1001 BL = BH BL = C9h BL = BL-1 BL = C8H FLAGS: O: 0 Z:0 C:0 S:0 BL = BL – BH BL = FFh = 1111 1111 FLAGS: O: 0 Z:0 C:1 S:1 CH = BYTE1 CH = AAh = 1010 1010 CH = CH and BYTE0 CH = 0010 1010 BYTE0 = ~BYTE0 (ca1) BYTE0 = 1000 0000 = 80h CH = CH or BYTE0 CH = 1010 1010 = AAh CH = CH xor FFh CH = 0101 0101 1100 1000 - 1100 1001 1 1111 1111 1010 1010 and 0111 1111 0010 1010 0010 1010 Or 1000 0000 1010 1010 1010 1010 xor 1111 1111 0101 0101
Saltos Flujo Normal de ejecución Para alterar el flujo: Saltos … instruccion1 etiqueta: instruccion2 instruccion3 instruccion4 JMP etiqueta
Saltos Saltos: JMP etiq Salto incondicional JS etiq Salto si S == 1 JNS etiq Salto si ~ S (S == 0) JZ etiq Salto si Z == 1 JNZ etiq Salto si ~ Z (Z == 0) JC etiq Salto si C == 1 JNC etiq Salto si ~ C (C == 0)
Ejercicio 3 … ORG 1000H INI DB 0 FIN DB 15 010= 0000 0000 = 00h 0FH = 0000 1111 … 2000H Ejercicio 3 ORG 1000H INI DB 0 FIN DB 15 ORG 2000H MOV AL, INI MOV AH, FIN SUMA: INC AL CMP AL, AH JNZ SUMA HLT END 010= 0000 0000 = 00h 1510 = 0000 1111 = 0Fh AL = INI AL= 00h AH = FIN AH = 0Fh = 0000 1111 AL = AL + 1 AL = 01h = 0000 0001 FLAGS: O:0 Z:0 C:0 S:0 AL - AH FLAGS: O: 0 Z:0 C:1 S:1 Si ~Z salta a SUMA 0000 0001 - 0000 1111 1 1111 0010 0000 1111 - 0000 1111 0000 0000 0000 0011 - 0000 1111 1 1111 0100 0000 0010 - 0000 1111 1 1111 0011 …
… Ejercicio 5 BX BX BX BX AX AX 2 AX 00 6 AX 00 12 BX 10 03 BX tabla 1000H 2 1001H 4 1002H 6 1003H 8 1004H 10 1005H 12 1006H 14 1007H 16 1008H 18 1009H 20 100AH ? 100BH 100CH 13 BX Duplica la tabla la cant de veces indicada adelante. (1 en este caso) BX BX ORG 1000H TABLA DB 1 DUP(2,4,6,8,10,12,14,16,18,20) FIN DB ? TOTAL DB ? MAX DB 13 ORG 2000H MOV AL, 0 MOV CL, OFFSET FIN-OFFSET TABLA MOV BX, OFFSET TABLA SUMA: ADD AL, [BX] INC BX DEC CL JNZ SUMA HLT END FIN TOTAL MAX … AX AX 2 AX 00 6 AX 00 12 BX 10 03 BX 10 01 BX 10 00 CX 09H BX 10 02 ¿Qué deberá agregar si quisiera almacenar el resultado de la suma en TOTAL? CX 07H CX 0AH CX 08H
El Simulador – MSX88 Simula una CPU basada en un versión simplificada del procesador 8086 de Intel, denominadaSX88.
MSX88 - Memoria 16 bits 8 bits Dirección Dato
MSX88 - Registros AH AL BH BL CH CL DH DL 8 bits 8 bits 16 bits H High Low
MSX88 - Uso Editar el programa, escrito en el lenguaje Assembly de MSX88 en un editor de texto. (La última línea del programa debe tener un Enter, si no dará error al ensamblarlo). El programa fuente generado se deberá guardar con extensión ‘.asm’ (Ejemplo: prueba.asm). Ensamblar: ASM88 archivo_asm (Ejemplo: C:/Simulador> ASM88 prueba.asm ) Linkear: LINK88 archivo_o (Ejemplo: C:/Simulador> LINK88 prueba.o) Ejecutar en el simulador: MSX88 (Ejemplo: C:/Simulador> MSX88) Genera dos archivos: archivo_asm.o archivo_asm.lst Genera dos archivos: archivo_asm.eje
MSX88 - Uso Instrucciones: L prueba Carga el programa prueba.eje G Ejecuta F6 avanza instrucción a instrucción F7 avanza ciclo a ciclo R IP 2000 Carga en el registro ip el 2000