Práctica 3: Programación en Assembler "Orga 1"

Anuncio
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”
Descargar