Arquitectura y lenguaje ensamblador Orga1

Anuncio
Arquitectura ORGA1
Lenguaje Ensamblador
(MOV, ADD, CMP,ect.)
Microcódigo
(...)
Lógica Digital
(Flip­flops, clocks, etc)
Arquitectura ORGA1
• Arquitectura Von Neumann
• Palabras de 16 bits
• Espacio de memoria de 65.535 palabras ( 0x0000 a 0xFFFF)
• Direccionamiento a Palabra
• 8 registros de propósito general de 16 bits (R0 a R7)
• 2 registros de propósito específico de 16 bits: – Program counter (PC) – stack pointer (SP) Arquitectura ORGA1
4 Flags: Z, N, C y V
– Z: El resultado es el numeral 0
– N: El resultado es “negativo” (complemento a 2)
– C: La suma bit­a­bit produjo acarreo
– V: Hubo “overflow” (complemento a 2)
Algunas instrucciones alteran los flags, otras no lo hacen
Arquitectura ORGA1
R0
R1
....
R7
0000
010A
....
4F00
PC
SP
Z
N
C
V
0141
FFEF
0
1
1
0
CPU
0000
0001
....
0141
....
AD1B
010A
....
11FF
....
FFFF
0C02
¿Qué cosas puedo hacer con
esta máquina?
Memoria
Arquitectura ORGA1­ Instrucciones
Instrucción MOV (mover)
Formato: MOV Destino, Fuente
Copia el contenido de “Fuente” en “Destino”, pisando este último.
¿Pero qué pueden ser “Destino” y “Fuente”?
Arquitectura ORGA1­ Instrucciones
Instrucción MOV (mover)
Formato: MOV Destino, Fuente
Copia el contenido de “Fuente” en “Destino”, pisando este último.
¿Pero qué pueden ser “Destino” y “Fuente”?
Abramos un paréntesis para aprender sobre modos de direccionamiento de la máquina ORGA1.
(
Arquitectura ORGA1 ­ Modos de direccionamiento
Inmediato
Destino o fuente es una constante de 16 bits. Por ejemplo 0xFFFF, 0x8000, 0x0000, etc... Registro
Destino o fuente hacen referencia a uno de los 8 registros. Los registros se nombran como: R0, R1, etc…
Ejemplos:
3. Poner R0 en 0x0: 4. Poner R1 en 0xFFFF: MOV R0, 0x0000
MOV R1, 0xFFFF
Arquitectura ORGA1 – Modos de direccionamiento
Pero con solo esos dos, no puedo interactuar con la memoria… Para eso necesito modos de direccionamiento mas complicados…
Bienvenidos al fantástico mundo de los punteros!
Direccionamiento directo
Destino o fuente son una constante de 16 bits, pero que representa una de mis 65.535 direcciones de memoria. Para indicar que estamos usando este modo de direccionamiento, ponemos la constante entre corchetes.
Ejemplos:
3. Guardar el valor 0x0001 en la posición de memoria 0x0000:
4. Guardar el contenido de la dirección 0x0001 en la dirección 0x0000:
5. Guardar el contenido de la dirección de 0x0000 en R0:
6. Guardar el contenido de R0 en la dirección 0x0002:
MOV [0x0000], 0x0001
MOV [0x0000], [0x0001]
MOV R0, [0x0000]
MOV [0x0002], R0
Arquitectura ORGA1 – Modos de direccionamiento
Direccionamiento indirecto
Destino o fuente son una constante de 16 bits, que ahora representa una de mis 65.535 direcciones de memoria, pero en donde yo antes guardé un puntero. Para indicar que estoy usando este modo, uso doble corchete.
Ejemplos:
2. Guardar 0x0004 en la dirección a la que apunta el contenido de la dirección 0x0000:
3. Guardar 0x0004 en la dirección a la que apunta el contenido de la dirección 0x0002:
4. Guardar en R0 el contenido de la posición a la que apunta el contenido de la dirección 0x0002:
MOV [[0x0000]], 0x0004
MOV [[0x0000]], 0x0004
MOV R0, [[0x0002]]
Arquitectura ORGA1 – Modos de direccionamiento
Pero con solo esos dos, no puedo interactuar con la memoria… Para eso necesito modos de direccionamiento mas complicados…
Direccionamiento indirecto mediante registro
Destino o fuente son un registro, en donde guardé un puntero. Es similar al indirecto, pero utilizando un registro en lugar de una posición de memoria. También uso corchetes.
Ejemplos:
MOV [R0], 0x0004
3. Guardar un 4 en la posición de memoria a la que apunta R0: 4. Guardar en R1 el contenido de memoria al que apunta R0: MOV R1, [R0]
Arquitectura ORGA1 – Modos de direccionamiento
Pero con solo esos dos, no puedo interactuar con la memoria… Para eso necesito modos de direccionamiento mas complicados…
Direccionamiento indirecto mediante registro + índice
Destino o fuente son un registro, en donde guardé un puntero, al que le sumo una constante de 16 bits. Es similar al anterior. Ejemplos:
2. Guardar un 4 en la posición de memoria a la que apunta R0 desplazado por 1: 3. Guardar en R1 el contenido apuntado por R0 desplazado por 3:
MOV [R0 + 0x0001], 0x0004
MOV R1, [R0 + 0x0003]
Arquitectura ORGA1 – Instrucciones
)
Fin del paréntesis sobre modos de direccionamiento.
Instrucción ADD (sumar)
Formato: ADD Destino, Fuente
Hace la operación Destino + Fuente, y guarda el resultado en Destino.
Instrucción SUB (restar)
Formato: SUB Destino, Fuente
Hace la operación Destino ­ Fuente, y guarda el resultado en Destino. Para ello invierte el signo de Fuente y realiza una suma, pero el valor de Fuente no es alterado por la operación. Arquitectura ORGA1 – Instrucciones
Instrucción AND (and bit­a­bit)
Formato: AND Destino, Fuente
Hace la operación Destino AND Fuente, y guarda el resultado en Destino.
Instrucción OR (and bit­a­bit)
Formato: OR Destino, Fuente
Hace la operación Destino OR Fuente, y guarda el resultado en Destino.
Instrucción NOT (not bit­a­bit)
Formato: NOT Destino
Hace la operación NOT Destino y guarda el resultado en Destino.
Arquitectura ORGA1 – Instrucciones
Instrucción NEG (negación complemento a 2)
Formato: NEG Destino
Invierte el signo (complemento a 2 de 16 bits) de Destino, y guarda el resultado en Destino.
Ejemplos:
2. Sumar R0 y la dirección 00F0
3. Restar la dirección 1FFF y la dirección a la que apunta la dirección 1FFFF
4. Realizar el AND bit­a­bit de la dirección 1FF0 y la dirección a la que apunta R0
5. Realizar el OR bit­a­bit de la dirección a la que apunta R0 y R0
6. Realizar el NOT bit­a­bit de la dirección a la que apunta R0 desplazado en 4
7. Negar R4 desplazado ­2
ADD R0, [0x00F0]
SUB [0x1FFF], [[0x1FFF]]
AND [0x1FF0],[R0]
OR [R0],R0
NOT [R4+0xFFFE]
Arquitectura ORGA1 – Instrucciones
Instrucciones de comparación y salto
Instrucción JMP (saltar)
Formato: JMP Fuente
Sobreescribe el PC con el contenido de la fuente
Ejemplos:
Saltar a la dirección 0x00FF
Saltar a la dirección 0x1EFE
JMP 0x00FF
JMP 0x1EFE
Arquitectura ORGA1 – Instrucciones
Instrucciones de comparación y salto
Instrucción CMP (comparar)
Formato: CMP Destino, Fuente
Funciona “como si hiciera” lo mismo que SUB Destino, Fuente… Pero no altera los registros. Sólo cambia los flags.
Arquitectura ORGA1 – Instrucciones
¿Cuáles eran los flags?
Z: Zero
N: Negative
C: Carry
V: oVerflow
Todas las instrucciones alteran los flags, menos MOV y las instrucciones de salto. Tampoco las alteran CALL y RET (que vamos a ver mas adelante).
C y V quedan siempre en 0, salvo cuando hacemos ADD, SUB, CMP y NEG.
Arquitectura ORGA1 – Instrucciones
La movida de los flags es así:
N: Está “cableada” al bit mas significativo del resultado. Es el equivalente al bit de signo si los números están codificados en complemento a 2 de 16 bits.
Prendería con: MOV R0, 0x0000
ADD R0, 0x8000
MOV R0, 0x0000
SUB R0, 0x0004
NEG 0x0001
Arquitectura ORGA1 – Instrucciones
La movida de los flags es así:
Z: Se prende cuando la operación da el numeral 0000 como resultado.
Por ejemplo: MOV R0, 0x0000
ADD R0, 0x0000
MOV R1, 0x0000
SUB R0, R1
MOV R0, 0x0004
CMP R0, 0x0004 o SUB R0, 0x0004
NEG 0x0000
Arquitectura ORGA1 – Instrucciones
La movida de los flags es así:
C: Se prende cuando hay carry.
Por ejemplo: MOV R0, 0x7FFF
ADD R0, 0x000F
V: Se prende cuando hay oVerflow (complemento a 2, 16 bits)
Prendería con: MOV R0, 0x7FFF
ADD R0, 0x000F
Arquitectura ORGA1 – Instrucciones
Leyendo estos flags se implementan las instrucciones de salto:
Jxx Desplazamiento: PC=PC+Desplazamiento
Operación
Descripción
Condición de salto.
JE
Igual / Cero
Z
JNE
No Igual
not Z
JLE
Menor o Igual
Z or ( N xor V)
JG
Mayor
not (Z or (N xor V))
JL
Menor
N xor V
JGE
Mayor o Igual
not (N xor V)
JLEU
Menor o Igual sin signo
C or Z
JGU
Mayor sin signo
not (C or Z)
JCS
Carry / Menor sin signo
C
JNEG
Negativo
N
JVS
Overflow
V
Instrucciones ORGA1­ Codificación
Ejercicio: ¿Cuál es el valor del PC luego de ejecutar estas instrucciones? Pc antes condición Pc después
Condición
00F1: JLE 0xFF ; Z=1
0075: JVS 0x12 ; V=1
000E: JGU 0x12 ; C=1 Z=0
009E: JG 0x55 ; C=1 Z=0 N=0 V=1
Arquitectura ORGA1 ­ Recapitulando...
Con una máquina ORGA1 podemos:
• Mover bits (MOV)
• Aritmética: ADD, SUB, NEG
• Lógica: AND, OR, NOT
• Comparar: CMP
• Saltar: Jxx's
Ejercicio 1: Escribir el siguiente pseudo­código en lenguaje ensamblador ORGA1. El programa comienza en la dirección 00F0 de memoria.
Utilizar el registro R0 como contenedor de la variable i. i := 15
Mientras i!=0
i:=i­1
Fin Mientras
Problema: Tenemos que definir el
desplazamiento de cada salto condicional
3. Tedioso
4. Necesitamos conocer la codificación de cada instr.
Lenguaje Ensamblador ORGA1 ­ Etiquetas
El lenguaje ensamblador de ORGA1 soporta ETIQUETAS.
Cada instrucción puede ser “decorada” con una etiqueta. Los valores finales de las etiquetas son RESUELTOS por el programa ensamblador.
Ciclo:
MOV R0, 0
ADD R0, 1
CMP R0, 000F
JLEU Ciclo
RET
Ejercicio 1 (ahora sí): Escribir el siguiente pseudo­código en lenguaje ensamblador
ORGA1...
i := 15
inicio: MOV R0, 0x000F
Mientras i!=0
mientras: CMP R0,0x000
i:=i­1
JE finMientras ; salto condicional
Fin Mientras
SUB R0, 0x0001
JMP mientras ; salto absoluto
finMientras: ...
Lenguaje Ensamblador ORGA1 ­ Valores
Además de etiquetas, el lenguaje ensamblador de la máquina ORGA1 soporta la definición explícita de valores usando el keyword DW (Define Word)
Valor:
Inicio:
JMP Inicio
DW 0A0A MOV R0, [Valor]
ADD R0, 000F
MOV [Valor], R0
RET
Ejercicio 2: Escribir el siguiente pseudo­código en lenguaje ORGA1. No puede utilizar ningún registro como contenedor de la variable i
i := 15
Mientras i!=0
i:=i­1
Fin Mientras
Arquitectura ORGA1 – Instrucciones
CALL y RET:
Llamado a “procedimiento”
CALL Destino
Guarda en el stack la dirección de memoria de la próxima instrucción, y salta incondicionalmente a Destino.
Fin de “procedimiento”
RET
Saca del tope del stack una dirección de memoria, y salta incondicionalmente a ella.
Ejemplo:
Invocar el procedimiento en 0xFF3F
Invocar la etiqueta PROC1
Retornar al procedimiento que llamó
Saltar a la dirección 0xFF3F
Saltar a la etiqueta Seguir
CALL 0xFF3F
CALL PROC1
RET
JMP 0xFF3F
JMP Seguir
(programa) Ensamblador ORGA1 – Recapitulando...
Lenguaje Ensamblador ORGA1
(ya vimos)
Valor: DW 00FF
MOV R0,[Valor]
Ciclo: ADD R0,1
JZ Salir
JMP Ciclo
Salir: RET...
Dirección de inicio del programa
(programa)
Ensamblador
ORGA1
•Codifica instrucciones y operandos
•Resuelve etiquetas (usa codificación)
•Resuelve valores (DW)
Lenguaje Máquina ORGA1
(ya veremos)
0001 100000 000000 0000 000011 1111111
0001 100001 000000 0001 000000 0000000
0010 100000 100001 ...
(programa) Ensamblador ORGA1 – Recapitulando...
Inicio: ADD R0,R1
JMP Inicio
00FF: ADD R0,R1
JMP 0x00FF
EA00: ADD R0,R1
JMP 0xEA00
Inicio: ADD R0,R1
JE Inicio
00FF: ADD R0,R1
JE 0xFD
EA00: ADD R0,R1
JE 0xFD
La codificación de algunas instrucciones dependerá del valor de la dir. de inicio del programa
La codificación de algunas instrucciones no depende
del valor de inicio del programa
Estas codificaciones son resueltas por el (programa) ENSAMBLADOR
Ejercicio: Escribir en lenguaje ensamblador ORGA1 el procediemiento RecorrerLista. Este programa recorre una lista simplemente encadenada buscando un valor. • El puntero a la cabeza de la lista está en el registro R1. • El valor buscando está apuntado por el registro R2.
• Los nodos tienen 2 palabras. • La primer palabra es el valor • La segunda palabra es el puntero al próximo nodo
• El valor de puntero 0xFFFF representa que no hay más nodos.
• Indicar si encontró el valor escribiendo en R3 el valor 0x0001, sino escribir 0x0000
Una solución
Pseudo­código:
RecorrerLista: MOV R4, R1
MOV R3, 0x0000
Mientras: CMP R4,0xFFFF
JE FinMientras
CMP [R4],[R2]
JNE FinSi
MOV R3,0x0001
JMP FinMientras
FinSi: MOV R4, [R4+0x0001]
JMP Mientras
Fin Mientras: RET
Pseudo­código:
Programa RecorrerLista
ptr := R1
R3 := 0x0000
Mientras ptr!=0xFFFF
Si primer[ptr]=[R2]
R3:=0x0001
Fin Si
ptr := segundo[ptr]
Fin Mientras
Fin Programa
Tarea: Cambiar el programa de modo de no usar el registro R4 como temporal
Máquina ORGA1
Ensamblar (a mano/ automáticamente)
•Resolver etiquetas
•Transforma símbolos en 0's y 1's
•Necesita codificación
Lenguaje Ensamblador
MOV R0,0x00FF
MOV R1,0x1000
ADD R0,R1...
Etiquetas
Valores
0001 100000 000000 0000 0000 1111 11111
0001 100001 000000 0001 0000 0000 00000
0010 100000 100001 ...
Lenguaje Máquina
Desensamblar
(a mano/automáticamente)
¿qué perdimos?
Instrucciones ORGA1­ Codificación
Tipo 1: Instrucciones de 2 operandos:
Abramos un paréntesis para conocer la codificación de los modos de direccionamiento de la máquina ORGA1.
(
Instrucciones ORGA1­ Codificación
Codificación modos de direccionamiento operandos
Ejemplos:
ADD R0,R1
ADD R0,0x0010
ADD R0,[0x0010]
ADD R0,[0x0000]
Las instrucciones que tienen en Dest operandos del tipo Inmediato son consideredas como inválidas por el procesador.
Ejemplo:
0x1000 0xFFFF 0xF000
Fin del paréntesis sobre modos de direccionamiento.
)
Instrucciones ORGA1­ Codificación
Tipo 2a: Instrucciones de 1 operando Destino
Tipo 2b: Instrucciones de 1 operando Fuente
Ejemplos:
NOT R0
NEG [0x00FF]
JMP R0
CALL [[0xFF1F]]
Instrucciones ORGA1­ Codificación
Tipo 3: Instrucciones sin operandos
Ejemplos:
?
Instrucciones ORGA1­ Codificación
Tipo 4: Saltos condicionales
Descargar