Ignacio Eguinoa Organización del Computador I DC - UBA Segundo Cuatrimestre de 2015
Generaciones de lenguajes 1G: Lenguaje de máquina(código binario de operaciones) 2G: Lenguaje Ensamblador(Assembly) (Textual mediante mnemónicos) 3G: Lenguajes de alto nivel (C, C++, Java, etc) 4G: PL/SQL 5G: Programación lógica, declarativa, etc.
Ensamblador (Assembler) Lenguaje ensamblador Lenguaje de 2da Generación Se refiere directamente a las instrucciones de hardware (depende de la computadora que lo ejecuta) Textual (no confundir con el código de máquina) Lenguaje en el que escribimos programas para la máquina Orga1
Arquitectura Orga1 Componentes de la máquina Orga1:
Arquitectura Orga1 Componentes de la máquina Orga1: Procesador (CPU)
Arquitectura Orga1 Componentes de la máquina Orga1: Procesador (CPU) Memoria
Arquitectura Orga1 Componentes de la máquina Orga1: Procesador (CPU) Memoria Dispositivos de Entrada/Salida
Arquitectura Orga1 CPU Unidad Aritmético-Lógica (ALU) Flags: Z, N, C, V Registros 8 registros de propósito general de 16 bits (R0 a R7)
Arquitectura Orga1 CPU Unidad Aritmético-Lógica (ALU) Flags: Z, N, C, V Registros 8 registros de propósito general de 16 bits (R0 a R7) 3 registros de propósito específico de 16 bits PC (program counter) SP (stack pointer) IR (instruction register)
Arquitectura Orga1 CPU Unidad Aritmético-Lógica (ALU) Flags: Z, N, C, V Registros 8 registros de propósito general de 16 bits (R0 a R7) Memoria 3 registros de propósito específico de 16 bits PC (program counter) SP (stack pointer) IR (instruction register)
Arquitectura Orga1 CPU Unidad Aritmético-Lógica (ALU) Flags: Z, N, C, V Registros 8 registros de propósito general de 16 bits (R0 a R7) Memoria 3 registros de propósito específico de 16 bits PC (program counter) SP (stack pointer) IR (instruction register) Direcciones de 16 bits (de 0x0000 a 0xFFEF) Palabras de 16 bits
ASM Orga1 Qué operaciones básicas necesitamos?
ASM Orga1 Qué operaciones básicas necesitamos? Operaciones de manejo de memoria ( MOV )
ASM Orga1 Qué operaciones básicas necesitamos? Operaciones de manejo de memoria ( MOV ) Operaciones aritmético-lógicas ( ADD, SUB, OR, etc.)
Formato de instrucción Tipo 1: Instrucciones de dos operandos operación cod. op. efecto modifica flags MOV d, f 0001 d f no ADD d, f 0010 d d + f (suma binaria) sí SUB d, f 0011 d d f (resta binaria) sí AND d, f 0100 d d and f sí ( ) OR d, f 0101 d d or f sí ( ) CMP d, f 0110 Modifica los flags según el resultado de d f. sí ADDC d, f 1101 d d + f + carry (suma binaria) sí ( ) dejan el flag de carry (C) y el de overflow (V) en cero.
Modos de direccionamiento Y los operandos?
Modos de direccionamiento Y los operandos? Modo Ejemplo Inmediato 0xEF06 Directo [0x0007] Indirecto [[0x0009]] Registro R1 Indirecto registro [R3] Indexado [R2 + 0x0003]
Formato de instrucción Tipo 4: Saltos relativos condicionales El salto se produce si se cumple la condición de salto correspondiente. No modifican flags. Codop Operación Descripción Condición de Salto 1111 0001 JE Igual / Cero Z 1111 1001 JNE Distinto not Z 1111 0010 JLE Menor o igual Z or ( N xor V ) 1111 1010 JG Mayor not ( Z or ( N xor V ) ) 1111 0011 JL Menor N xor V 1111 1011 JGE Mayor o igual not ( N xor V ) 1111 0100 JLEU Menor o igual sin signo C or Z 1111 1100 JGU Mayor sin signo not ( C or Z ) 1111 0101 JCS Carry / Menor sin signo C 1111 0110 JNEG Negativo N 1111 0111 JVS Overflow V
Saltos condicionales Cómo indico el destino del salto?
Saltos condicionales Cómo indico el destino del salto? El lenguaje ensamblador nos permite usar etiquetas
Ahora si... A PROGRAMAR!
Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits.
Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. R1 contiene la dirección de memoria donde se aloja el dividendo.
Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. R1 contiene la dirección de memoria donde se aloja el dividendo. R2 contiene la dirección de memoria donde se aloja el divisor.
Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. 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).
Ejercicio 1 Enunciado: Escribir un programa que calcule la división entera entre dos enteros sin signo de 16 bits. 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.
Pseudocódigo del Ejercicio 1 resultado = 0 if (divisor == 0): listo else: while (dividendo >= divisor): dividendo = dividendo - divisor resultado = resultado + 1 listo
Resolución del Ejercicio 1 ; R1 --> puntero al dividendo ; R2 --> puntero al divisor ; R3 --> cociente ; R4 --> dividendo ; R5 --> divisor inicio: MOV R3, 0x0000 ; R3 = 0 MOV R4, [R1] ; R4 = dividendo MOV R5, [R2] ; R5 = divisor CMP R5, 0x0000 ; divisor == 0? JE fin ciclo: CMP R4, R5 ; dividendo < divisor? JCS fin ; uso JCS en lugar de JL porque ; son enteros sin signo SUB R4, R5 ; R4 = R4-R5 ADD R3, 0x0001 ; R3 = R3+1 JMP ciclo fin:
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.
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 donde está la imagen como una matriz de enteros sin signo de 16 bits.
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 donde está la imagen como una matriz de enteros sin signo de 16 bits. La foto tiene 200x200 pixels.
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 donde 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.
Pra ctica 3: Programacio n en ASM 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.
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 while (i < 200*200): img[i] = 2 * img[i] i = i + 1 listo
Es correcto el pseudocódigo anterior?
Es correcto el pseudocódigo anterior? Qué pasa cuando duplico un pixel cuyo color ya es muy cercano al blanco más brillante?
Pseudocódigo del Ejercicio 2 (con saturación) i = 0 while (i < 200*200): tmp = 2 * img[i] if (tmp > 0xFFFF): tmp = 0xFFFF img[i] = tmp i = i + 1 listo // si hay carry
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 ; R3 = cant pixeles(img)? JE fin MOV R2, [R1] ; R2 = img[r3] ADD R2, R2 ; 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 JCS saturar cont: MOV [R1], R2 ; img[r3] = R2 ADD R1, 0x0001 ; R1 = img[r3+1] ADD R3, 0x0001 ; R3 = R3+1 JMP ciclo 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:
Lenguaje ensamblador Vimos: Intro a arquitectura Orga1 Set de instrucciones máquina Orga1 Implementación de soluciones usando lenguaje ensamblador
Lenguaje ensamblador La próxima: Directivas Proceso de ensamblado: codificación y carga en memoria del programa Proceso de ejecución
Preguntas?????
Fin Fin