Práctica 3: Programación en Assembler ”Orga 1” Matı́as Bonaventura Organización del Computador I DC - UBA Verano 2016 Práctica 3: Programación en Assembler ”Orga 1” Entrando a la Matrix Práctica 3: Programación en Assembler ”Orga 1” Práctica 3 - Arquitectura ORGA1 Descripción General . Palabras de 16 bits. operación JMP f CALL f cod. op. 1010 1011 efecto PC ← f [SP] ← PC, SP ← SP − 1, PC ← f El formato del operando fuente responde a la tabla de formatos de operando mostrada más arriba. . Direccionamiento a palabra. . Espacio direccionable de 65536 palabras. . Espacio de direcciones dedicado a entrada/salida en las direcciones 0xFFF0 - 0xFFFF. Tipo 3 : Instrucciones sin operandos . Ocho registros de propósito general de 16 bits: R0..R7. 4 bits cod. op. . Program counter (PC) de 16 bits. . Stack pointer (SP) de 16 bits inicializado en la dirección 0xFFEF. . Los valores de los flags se calculan interpretando los operandos en complemento a 2. Flags: Z (zero), N (negative), C (carry), V (overflow ). . Todas las instrucciones alteran los flags, excepto MOV, CALL, RET, JMP y Jxx. . De las que alteran los flags, todas dejan C y V en cero, excepto ADD, ADDC, SUB, CMP y NEG. Formato de instrucción Tipo 1 : Instrucciones de dos operandos 4 bits cod. op. operación MOV d, f ADD d, f SUB d, f AND d, f OR d, f CMP d, f ADDC d, f 6 bits destino 6 bits fuente cod. op. 0001 0010 0011 0100 0101 0110 1101 16 bits constante destino (opcional) fuente. Resultado c16 [c16] [[c16]] Rrrr [Rrrr] [Rrrr + c16] c16 es una constante de 16 bits. Rrrr es el registro indicado por los últimos tres bits del código de operando. Las instrucciones que tienen como destino un operando de tipo inmediato son consideradas como inválidas por el procesador, excepto el CMP. operación NEG d NOT d cod. op. 1000 1001 6 bits destino 6 bits 000000 efecto d ← 0 − d (resta binaria) d ← not d (bit a bit) 6 bits 000000 6 bits fuente 16 bits constante fuente (opcional) 1 6 bits 000000 Tipo 4 : Saltos condicionales Las instrucciones en este formato son de la forma Jxx (salto relativo condicional). Si al evaluar la condición de salto en los flags el resultado es 1, el efecto es incrementar el PC con el valor de los 8 bits de desplazamiento, representado en complemento a 2 de 8 bits. En caso contrario, la instrucción no produce efectos. 8 bits cod. op. Codop 1111 0001 1111 1001 1111 0010 1111 1010 1111 0011 1111 1011 1111 0100 1111 1100 1111 0101 1111 0110 1111 0111 Operación JE JNE JLE JG JL JGE JLEU JGU JCS JNEG JVS 8 bits desplazamiento Descripción Igual / Cero Distinto Menor o igual Mayor Menor Mayor o igual Menor o igual sin signo Mayor sin signo Carry / Menor sin signo Negativo Overflow Condición de Salto Z not Z Z or ( N xor V ) not ( Z or ( N xor V ) ) N xor V not ( N xor V ) C or Z not ( C or Z ) C N V ¿Cómo altera los flags? Sea r el resultado de una instrucción que modifica los flags, el nuevo valor es el que sigue: Z=1 ↔ r = 0x0000. C=1 ↔ se produjo carry durante una suma binaria o borrow durante una resta binaria. 16 bits constante destino (opcional) El formato del operando destino responde a la tabla de formatos de operando mostrada más arriba. Tipo 2b: Instrucciones de un operando fuente. 4 bits cod. op. 6 bits 000000 efecto PC ← [SP+1], SP ← SP + 1 N=1 ↔ el bit más significativo de r es igual a 1. Tipo 2 : Instrucciones de un operando Tipo 2a: Instrucciones de un operando destino. 4 bits cod. op. cod. op. 1100 16 bits constante fuente (opcional) efecto d←f d ← d + f (suma binaria) d ← d − f (resta binaria) d ← d and f d ← d or f Modifica los flags según el resultado de d − f (resta binaria) d ← d + f + carry (suma binaria) Formato de operandos destino y Modo Codificación Inmediato 000000 Directo 001000 Indirecto 011000 Registro 100rrr Indirecto registro 110rrr Indexado 111rrr operación RET V=1 ↔ la suma de dos números con signo produce un número sin signo (S + S = S) ó la suma de dos números sin signo produce un número con signo (S + S = S) ó alguna analogı́a con la resta (S − S = S ó S − S = S) El ensamblador Directivas El ensamblador de código tiene una única directiva. Directiva DW c16 Efecto Asigna en la posición correspondiente la constante c16 2 Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. Utilizar únicamente instrucciónes de la arquitectura ORGA1. R1 contiene la dirección de memoria donde se aloja el dividendo. R2 contiene la dirección de memoria donde se aloja el divisor. R3 debe ser el registro en el que se guarda el cociente (el resultado de la división). En caso de que el divisor sea 0, habrá que devolver 0. Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 1 Estrategia: Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 1 Estrategia: 1 Entender el problema 2 Pensar la solución 3 Escribir el pseudocódigo 4 Escribir el programa en Assembler 5 Validar la solución Práctica 3: Programación en Assembler ”Orga 1” Pseudocódigo del Ejercicio 1 resultado = 0 si (divisor == 0): listo sino: mientras (dividendo >= divisor): dividendo = dividendo - divisor resultado = resultado + 1 listo Práctica 3: Programación en Assembler ”Orga 1” Resolución del Ejercicio 1 ; ; ; ; ; R1 R2 R3 R4 R5 --> --> --> --> --> puntero al dividendo puntero al divisor cociente dividendo divisor inicio: MOV R3, MOV R4, MOV R5, CMP R5, JE fin ciclo: CMP R4, JCS fin 0x0000 [R1] [R2] 0x0000 ; ; ; ; R3 = 0 R4 = dividendo R5 = divisor divisor == 0? R5 ; ; ; ; ; dividendo < divisor? uso JCS en lugar de JL porque son enteros sin signo R4 = R4-R5 R3 = R3+1 SUB R4, R5 ADD R3, 0x0001 JMP ciclo fin: Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 2 Enunciado: Estoy cansado de que me salgan las fotos oscuras con mi cámara digital. Hagan un programa que duplique el brillo de mis fotos para remediar mi angustia. R1 contiene la dirección de memoria donde comienza está la imagen como una matriz de enteros sin signo de 16 bits. La foto tiene 200x200 pixels. La imagen debe ser modificada en el lugar (dentro de las mismas posiciones de memoria). Práctica 3: Programación en Assembler ”Orga 1” ¿Una imagen!? Práctica 3: Programación en Assembler ”Orga 1” ¿Cómo se guarda una imagen? Práctica 3: Programación en Assembler ”Orga 1” Práctica 3: Programación en Assembler ”Orga 1” Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. ¿Estrategia? Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. ¿Estrategia? Entender el problema. Práctica 3: Programación en Assembler ”Orga 1” Entendiendo el problema Práctica 3: Programación en Assembler ”Orga 1” Entendiendo el problema Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. ¿Estrategia? Entender el problema. Práctica 3: Programación en Assembler ”Orga 1” Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. ¿Estrategia? Entender el problema. Pensar la solución Práctica 3: Programación en Assembler ”Orga 1” Pseudocódigo del Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. Práctica 3: Programación en Assembler ”Orga 1” Pseudocódigo del Ejercicio 2 Enunciado Duplicar el brillo La imagen tiene 200x200 pı́xeles. R1 contiene la dirección donde está la imagen como una matriz de enteros sin signo de 16 bits. La imagen debe ser modificada en el lugar. i = 0 mientras (i < 200*200): img[i] = 2 * img[i] i = i + 1 listo Práctica 3: Programación en Assembler ”Orga 1” ¿Es correcto el pseudocódigo anterior? Práctica 3: Programación en Assembler ”Orga 1” ¿Es correcto el pseudocódigo anterior? ¿Qué pasa cuando duplico un pixel cuyo color ya es muy cercano al blanco más ’brillante’ ? Práctica 3: Programación en Assembler ”Orga 1” Práctica 3: Programación en Assembler ”Orga 1” Pseudocódigo del Ejercicio 2 (con saturación) i = 0 mientras (i < 200*200): tmp = 2 * img[i] si (tmp > 0xFFFF): tmp = 0xFFFF img[i] = tmp i = i + 1 listo // si hay carry Práctica 3: Programación en Assembler ”Orga 1” Resolución del Ejercicio 2 ; R1 --> puntero a la imagen ; R2 --> variable temporal para almacenar el pixel a procesar ; R3 --> contador de pixeles que voy procesando inicio: MOV R3, 0x0000 ; R3 = 0 ; Ciclo principal: Va a ir recorriendo uno a uno los pixeles de la ; imagen y les va a aplicar un mayor brillo duplicando su valor. ; Si se produce un overflow, satura con el color blanco (0xFFFF) ciclo: CMP R3, 0x9C40 JE fin MOV R2, [R1] ADD R2, R2 ; R3 = cant pixeles(img)? ; R2 = img[R3] ; R2 = 2*R2 ; Como estoy sumando enteros de 16 bits sin signo, tengo que ver que ; no se produzca overflow. Para eso, miro el bit de carry despues de ; realizada la suma cont: JCS MOV ADD ADD JMP saturar [R1], R2 R1, 0x0001 R3, 0x0001 ciclo ; img[R3] = R2, guarda el resultado en el mismo lugar ; R1 = img[R3+1] ; R3 = R3+1 saturar: ; Si al duplicar el valor del pixel se obtiene un valor tan grande ; que no entra en un entero de 16 bits, saturo el valor del pixel ; con el color blanco (0xFFFF) MOV R2, 0xFFFF ; R2 = 0xFFFF JMP cont fin: Práctica 3: Programación en Assembler ”Orga 1” Proxima clase Ciclo de instrucción en detalle: Fetch, Decode, Execute Clase de seguimiento Práctica 3: Programación en Assembler ”Orga 1” Preguntas ????? Práctica 3: Programación en Assembler ”Orga 1” Fin Fin Práctica 3: Programación en Assembler ”Orga 1”