Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2
Instrucciones de procesamiento
de datos
ndice
2.1. Operaciones aritmticas . . . . . . . . . . . . . . . . 44
2.2. Operaciones lgicas . . . . . . . . . . . . . . . . . . 50
2.3. Operaciones de desplazamiento . . . . . . . . . . . . 52
2.4. Problemas del captulo . . . . . . . . . . . . . . . . 53
43
2.1. Operaciones aritmticas 44
oper-add-inm.s -
1 .data @ Zona de datos
2 num: .word 2147483647 @ Mx. positivo representable en Ca2(32)
3 @ (en hexadecimal 0x7fff ffff)
4
5 .text @ Zona de instrucciones
6 main: ldr r0, =num
7 ldr r0, [r0] @ r0 <- [num]
8 add r1, r0, #1 @ r1 <- r0 + 1
9
10 stop: wfi
La instruccin add rd, rs, #Inm3 suma dos operandos. Uno de add (inm)
los operandos est almacenado en un registro, en rs, y el otro en la
propia instruccin, en el campo Inm3; el resultado se almacenar en el
registro rd.
Por su parte, la instruccin sub rd, rs, #Inm3 resta el dato in- sub (inm)
mediato Inm3 del contenido del registro rs y almacena el resultado
en rd.
2.1. Operaciones aritmticas 45
Hay que tener en cuenta que puesto que el campo destinado al dato
inmediato es de solo 3 bits, solo se pueden utilizar estas instrucciones si
el dato inmediato es un nmero entre 0 y 7.
Existe una variante de las instrucciones suma y resta con dato inme-
diato que utilizan el mismo registro como fuente y destino de la opera-
cin: add rd, #Inm8 y sub rd, #Inm8. Estas variantes permiten que
el dato inmediado sea de 8 bits, por lo que se puede indicar un nmero
entre 0 y 255.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Copia el fichero anterior en el simulador, ensmblalo y ejectalo.
2.1 Localiza el resultado de la suma. Cul ha sido? El resultado
obtenido es igual a 2.147.483.647 + 1? (puedes utilizar kcalc, python3 o
modificar a mano el contenido de un registro para comprobarlo).
2.2 Localiza en la parte inferior del simulador el valor de los in-
dicadores (flags). Comprueba que aparece lo siguiente: N z c V, lo que
quiere decir que se han activado los indicadores N y V. Qu significa que
se hayan activado los indicadores N y V? (si dejas el ratn sobre el panel
de los indicadores, se mostrar un pequeo mensaje de ayuda).
2.3 Recarga el simulador, escribe el valor 0x7FFF FFFE en la po-
sicin de memoria 0x2007 0000, y vuelve a ejecutar el cdigo. Se ha
activado algn indicador? Por qu no?
2.4 Vuelve al modo de edicin y sustituye en el programa anterior
la instruccin add r1, r0, #1 por la instruccin add r1, r0, #8,
guarda el fichero y pasa al modo de simulacin. Qu ha ocurrido al
efectuar este cambio? Por qu?
2.5 Vuelve al modo de edicin y modifica el programa original para
que: i) la posicin de memoria etiquetada con num se inicialice con el
nmero 10, y ii) en lugar de la suma con dato inmediato se realice la
siguiente resta con dato inmediato: r1 r0 2. Una vez realizado lo
anterior, guarda el nuevo fichero, vuelve al modo de simulacin y ejecuta
el programa, qu valor hay ahora en r1?
......................................................................
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Copia el programa anterior en el simulador y contesta a las siguientes
preguntas:
2.6 Qu posicin de memoria se ha inicializado con el nmero 10?
Qu posicin de memoria se ha inicializado con el nmero 6?
2.7 Qu hace el cdigo anterior? A qu direccin de memoria
hace la referencia la etiqueta res? Qu resultado se almacena en
la direccin de memoria etiquetada como res cuando se ejecuta el
programa? Es correcto?
2.8 Qu dos instrucciones se han utilizado para almacenar el re-
sultado en la posicin de memoria etiquetada con res?
2.9 Recarga el simulador y ejecuta el programa paso a paso hasta la
instruccin sub r2, r0, r1 inclusive. Se ha activado el indicador Z?
Qu significado tiene dicho indicador?
2.10 Recarga de nuevo el simulador y modifica a mano el contenido
de las posiciones de memoria 0x2007 0000 y 0x2007 0004 para que tengan
el mismo valor, p.e., un 5. Ejecuta de nuevo el programa paso a paso
hasta la instruccin sub r2, r0, r1 inclusive. Se ha activado ahora
el indicador Z? Por qu?
......................................................................
2.1. Operaciones aritmticas 47
oper-cmp.s -
1 .text @ Zona de instrucciones
2 main: mov r0, #10
3 mov r1, #6
4 mov r2, #6
5 cmp r0, r1
6 cmp r1, r0
7 cmp r1, r2
8
9 stop: wfi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Copia el programa anterior en el simulador y realiza los siguientes
ejercicios.
2.11 Ejecuta paso a paso el programa hasta la instruccin cmp r0, r1
inclusive. Se ha activado el indicador C?
Nota: En el caso de la resta, el indicador C se utiliza para indicar si el
resultado cabe en una palabra (C activo) o, por el contrario, si no cabe
en una palabra (c inactivo), como cuando se dice nos llevamos una
cuando restamos a mano.
2.12 Ejecuta la siguiente instruccin, cmp r1, r0. Qu indica-
dores se han activado? Por qu?
2.13 Ejecuta la ltima instruccin, cmp r1, r2. Qu indicadores
se han activado? Por qu?
......................................................................
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Copia el programa anterior en el simulador, ensmblalo y realiza los
siguientes ejercicios.
2.14 Ejecuta el programa, qu valor se almacena en res1?, y
en res2?
2.15 Completa la siguiente tabla i) recargando el simulador cada
vez; ii) modificando a mano el contenido de la posicin de memoria
etiquetada con num con el valor indicado en la primera columna de
la tabla; y iii) volviendo a ejecutar el programa. Sigue el ejemplo de la
primera lnea.
Valor [num1] [res1] [res2]
10 0x0000 000A 0xFFFF FFF6 0xFFFF FFF5
-10
252645136
2.1. Operaciones aritmticas 49
oper-mul.s -
1 .data @ Zona de datos
2 num1: .word 10
3 num2: .word 6
4 res: .space 4
5
6 .text @ Zona de instrucciones
7 main: ldr r0, =num1
8 ldr r0, [r0] @ r0 <- [num1]
9 ldr r1, =num2
10 ldr r1, [r1] @ r1 <- [num2]
11 mul r1, r0, r1 @ r1 <- [num1] * [num2]
12 ldr r3, =res
13 str r1, [r3] @ [res] <- [num1] * [num2]
14
15 stop: wfi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.17 Ejecuta el programa anterior y comprueba que en la posicin
de memoria etiquetada con res se ha almacenado el resultado de
10 6.
2.18 Vuelve al modo de edicin y modifica el programa sustituyendo
la instruccin mul r1, r0, r1 por una igual pero en la que el registro
destino no sea ni r0, ni r1. Intenta ensamblar el cdigo, qu ocurre?
2.19 Modifica el programa original sustituyendo mul r1, r0, r1
por una instruccin equivalente que utilice la variante con dos registros
de la multiplicacin. Ejecuta el cdigo y comprueba si el resultado es
correcto.
......................................................................
2.2. Operaciones lgicas 50
a b ayb
0 0 0
0 1 0
1 0 0
1 1 1
Como se puede ver, solo cuando los dos bits, a y b, valen 1, el resul-
tado es 1.
Por otro lado, tambin se puede describir el funcionamiento de la
operacin y en funcin del valor de uno de los bits. As, si b vale 0,
a y b ser 0, y si b vale 1, a y b tomar el valor de a. Si expresamos lo
anterior en forma de tabla de verdad, quedara:
b ayb
0 0
1 a
oper-and.s -
1 .data @ Zona de datos
2 num: .word 0x01234567
3 mask: .word 0x00000070
4 res: .space 4
5
6 .text @ Zona de instrucciones
7 main: ldr r0, =num
8 ldr r0, [r0] @ r0 <- [num]
9 ldr r1, =mask
10 ldr r1, [r1] @ r1 <- [mask]
11 and r0, r1 @ r0 <- r0 AND r1
12 ldr r3, =res
13 str r0, [r3] @ [res] <- [num] AND [mask]
14
15 stop: wfi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.20 Carga el anterior programa en el simulador y ejectalo. Qu
valor, expresado en hexadecimal, se almacena en la posicin de memoria
res? Coincide con el resultado calculado en la explicacin anterior?
2.21 Modifica el cdigo para que sea capaz de almacenar en res el
valor obtenido al conservar tal cual los 16 bits ms significativos del dato
almacenado en num, y poner a cero los 16 bits menos significativos,
salvo el bit cero, que tambin debe conservar su valor original. Qu
valor has puesto en la posicin de memoria etiquetada con mask?
2.22 Desarrolla un programa, basado en los anteriores, que alma-
cene en la posicin de memoria res el valor obtenido al conservar el
valor original de los bits 4, 5 y 6 del nmero almacenado en num y
2.3. Operaciones de desplazamiento 52
oper-asr.s -
1 .data @ Zona de datos
2 num: .word 0xffffff41
3 res: .space 4
4
5 .text @ Zona de instrucciones
6 main: ldr r0, =num
7 ldr r0, [r0] @ r0 <- [num]
8 mov r1, #4
9 asr r0, r1 @ r0 <- r0 >> 4
10 ldr r2, =res
11 str r0, [r2]
12
13 stop: wfi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.23 Copia el programa anterior en el simulador y ejectalo, qu
valor se almacena en la posicin de memoria res? Se ha conservado
el signo del nmero almacenado en num? Modifica el programa pa-
ra comprobar su funcionamiento cuando el nmero que se desplaza es
positivo.
2.24 Modifica el programa propuesto originalmente para que realice
un desplazamiento de 3 bits. Como se puede observar, la palabra original
era 0xFFFF FF41 y al desplazarla se ha obtenido la palabra 0xFFFF FFE8.
Representa ambas palabras en binario y comprueba si la palabra obte-
nida corresponde realmente al resultado de desplazar 0xFFFF FF41 3 bits
a la derecha conservando su signo.
2.4. Problemas del captulo 53
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.29 Desarrolla un programa en ensamblador que defina el vector de
enteros de dos elementos V = [v0 , v1 ] en la memoria de datos y almacene
la suma de sus elementos en la primera direccin de memoria no ocupada
despus del vector.
Para probar el programa, inicializa el vector V con [10, 20].
2.30 Desarrolla un programa en ensamblador que multiplique por
5 los dos nmeros almacenados en las dos primeras posiciones de la me-
moria de datos. Ambos resultados debern almacenarse a continuacin
de forma consecutiva.
Para probar el programa, inicializa las dos primeras palabras de la me-
moria de datos con los nmeros 18 y 1215.
2.31 Desarrolla un programa que modifique el valor de la palabra
almacenada en la primera posicin de la memoria de datos de tal forma
que los bits 11, 7 y 3 se pongan a cero mientras que los bits restantes
conserven el valor original.
2.4. Problemas del captulo 54
208