Está en la página 1de 4

1.

Sea el formato de instrucción de un procesador el que se muestra a continuación (hay tres


tipos de instrucciones según el modo de direccionamiento de sus dos operandos
explícitos):


Opcode (4 bits)
Operando1 (4 bits) Operando2 (8 bits)
Directo Registro Directo Memoria
Tipo1:

Opcode (4 bits)
Operando1 (4 bits) Operando2 (4 bits)
No usado
Directo Registro Directo Registro
Tipo2:

Opcode (4 bits)
Operando1 (8 bits) Relativo Operando2 (4 bits)
Registro Desplazamiento Directo Registro
Tipo3:

Contesta a las siguientes cuestiones (justifica tu respuesta brevemente):

• ¿Cuál es el número máximo de instrucciones diferentes que se pueden codificar con


ese formato de instrucción?

• ¿Cuántos registros se pueden direccionar con los operandos que tienen modo de
direccionamiento directo a registro?

• ¿Cuántas posiciones de memoria se pueden direccionar con los operandos que


tienen direccionamiento directo a memoria?

• Si la memoria se direcciona a nivel de palabra (siendo la palabra de 16 bits) ¿qué


capacidad máxima (en bytes) podría tener la memoria direccionada por dichos
operandos?

• Si el campo desplazamiento en los operandos con modo de direccionamiento


relativo es un número natural ¿cuál es el máximo desplazamiento que se puede
utilizar?





2. Dadas las siguientes instrucciones del procesador del ejercicio anterior, donde se indica
además el nemotécnico de la instrucción junto con la acción que implica su ejecución (ojo,
en la acción cada operando tendrá que ser interpretado correctamente según su modo de
direccionamiento)

LW Opcode (4 bits)
Operando1 (4 bits) Operando2 (8 bits)
Directo Registro Directo Memoria
Tipo1: 0 0 0 0
Nemotécnico: LW op1, op2 Acción: op1 ß op2

DUP Opcode (4 bits)
Operando1 (4 bits) Operando2 (4 bits)
No usado
Directo Registro Directo Registro
Tipo2: 1 0 0 0
Nemotécnico: DUP op1, op2 Acción: op1 ß op2 + op2

SW Opcode (4 bits)
Operando1 (8 bits) Relativo Operando2 (4 bits)
Registro Desplazamiento Directo Registro
Tipo3: 0 0 1 0
Nemotécnico: SW op1reg, op1desp, op2 Acción: op1 ß op2

Dado también el contenido de la memoria presentado a continuación y sabiendo que
todos los registros tienen almacenado el valor 0 (especifica para las tres primeas
posiciones el nemotécnico de las instrucciones allí almacenadas incluyendo los operandos
concretos que utilizan cada una)
Memoria
Pos. (hex) Contenido (hex) Nemotécnico instrucción
016 020416
116 832016
216 213316
316 FFFF16
416 000516

Especifica cual sería el contenido (en hexadecimal) de la memoria y de los registros
indicados, tras la ejecución de cada una de las 3 primeras instrucciones almacenadas en
memoria en las posiciones 0, 1 y 2.

Memoria Registros
Contenido Contenido Contenido Valor Valor Valor
Pos. después de después de después de Registro después después después
instrucción 1 instrucción 2 instrucción 3 inst. 1 inst. 2 inst. 3
016 0
116 1
216 2
316 3
416 …
3. Escribe un programa en ensamblador ARM que dados dos vectores de números enteros
datos1 y datos2 de la misma longitud (especificada en len) escriba en res el número de
posiciones de ambos vectores que contienen el mismo valor. A continuación te
presentamos un segmento de datos que te podría servir como base. Para el ejemplo dado
el resultado deberá ser 3 (res=3) ya que las posiciones 2ª, 5ª y 7ª de ambos vectores
contienen el mismo valor (valores 3, 5 y 6 respectivamente).
.data
len: .word 8
datos1: .word 8,3,4,2,5,7,6,1
datos2: .word 4,3,5,6,5,4,6,0
res: .word 0
.text
.golbal main
main:

4. Escribe una función en ensamblador ARM que dado un vector de números naturales
devuelva la suma de las partes enteras de la raíz cuadrada de cada uno de los elementos
del vector:
𝑟𝑒𝑠 = 𝑖𝑛𝑡( 𝑣𝑒𝑐𝑡 𝑖 )
,
La función se debe llamar sqrtsum, aceptará los siguientes parámetros de entrada: por el
registro r0 la dirección del vector y por el registro r1 la longitud de dicho vector. La
función devolverá el resultado (la suma de las partes enteras de las raíces cuadradas de los
elementos del vector) por el registro r0.
Para calcular la parte entera de la raíz cuadrada de un número natural debéis usar la
función sqrt que se os da ya implementada, la cual acepta el número natural por el
registro r0 y devuelve el valor de la parte entera de la raíz cuadrada de dicho número por
el registro r0 (𝑟0 = 𝑖𝑛𝑡( 𝑟0)).
.data
tam: .word 8
vect: .word 64,25,9,23,56,77,87,100
res: .word 0
.text
.global main
main: push {lr}
ldr r0, =vect
ldr r1, =tam
ldr r1, [r1]
bl sqrtsum
ldr r1, =res
str r0, [r1]
pop {lr}
bx lr
sqrt: Código de la función que implementa la raíz cuadrada 𝑟0 = 𝑖𝑛𝑡( 𝑟0)
(No tenéis que programarlo)
sqrtsum: