Anda di halaman 1dari 3

Carga de constantes de 32 bits y depsito de literales

Es posible cargar directamente, una constante de 32 bits utilizando una instruccin de carga?
Una de las caractersticas principales de la arquitectura RISC es que todas las instrucciones tienen
una longitud fija que en el caso de los procesadores ARM es de 32 bits. Esto nos conduce a la
aparente contradiccin de ajustar una constante de 32 bits en una instruccin que slo tiene 32
bits.
Los campos asociados con este tipo de instrucciones, Fig. 6.1, (bits [27:25], los que indican que
esta es una instruccin de procesamiento de datos), la instruccin en si (bits [24:21], los que
indican que es una instruccin MOV), y los 12 bits menos significativos. Estos ltimos bits dan
algunas opciones, y dan a la instruccin una gran flexibilidad para utilizar registros, registros con
corrimientos o rotaciones o valores inmediatos como operandos.
El registro de barril tambin se utiliza en la creacin de constantes. Los registros de barril son
realmente un poco ms que circuitos diseados especficamente, para hacer corrimientos o
rotaciones de datos y se pueden construir utilizando una lgica muy rpida. El esquema de
rotacin de ARM mueve bits a la derecha utilizando el registro de barril, envolviendo el bit
menos significativo alrededor del bit ms significativo en el otro extremo del registro.
Con 12 bits disponibles en una instruccin y hardware dedicado para ejecutar los corrimientos, los
procesadores ARM pueden generar clases de nmeros en lugar de cada nmero entre 0 y 232 - 1.
Ejemplo:
Calcular la rotacin necesaria para generar la constante 4080 utilizando el esquema de rotacin de
byte.
Solucin
Ya que 4080 es 1111 1111 00002, el byte 1111 11112 o 0xFF puede rotarse a la izquierda 4 bits. Sin
embargo, el esquema de rotacin rota un byte a la derecha; por lo tanto, se necesita un factor de
rotacin de 28, ya que rotar a la izquierda n bits equivale a rotarlos a la derecha 32- n bits. La
instruccin necesaria sera:
MOV

r0, #0xFF, 28

; r0= 4080

La instruccin MVN (move negativo) la cual transfiere el complemento a 1 del operando dentro de
un registro, se puede utilizar para generar clases de nmeros como:
MVN

r0, #0

; r0 = 0xFFFFFFFF

MVN

r0, #0xFF, 8

; r0 = 0x00FFFFFF

Los esquemas de rotacin son muy buenos, pero como programador, podra encontrar este
esquema un poco cansado si se tienen que introducir docenas de constantes para un algoritmo
intensivo en datos.
6.3 Cargando constantes en los registros
El tpico de memoria se cubri en detalle en el captulo anterior, y vimos que hay instrucciones
especficas para cargar datos de memoria a un registro, como la instruccin LDR. Existen modos
diferentes para crear la direccin que requiere esta instruccin, y hasta ahora hemos examinado
las direcciones que se cargan directamente en un registro. Ahora se introduce la idea de crear una
direccin desde el contador de programa, en donde el registro r15 (el contador de programa) se
utiliza con un valor de desplazamiento para crear una direccin. Tambin se extender la
instruccin LDR un poco para crear una pseudo instruccin que el ensamblador entienda.
Primero y en breve: cuando se est escribiendo en ensamblador, se deber utilizar la siguiente
pseudo instruccin para cargar constantes en los registros, ya que es por mucho la forma ms
fcil, segura y de mantenimiento ms fcil:
LDR

<Rd>, =<constante numrica>

Puede parecer inusual utilizar una pseudo instruccin, pero hay una razn vlida para hacerlo.
Para la mayora de los programadores, las constantes se declaran al inicio de las secciones de
cdigo, y puede ser necesario cambiar los valores a medida que el cdigo lo escriben, modifican y
mantienen otros programadores. Suponga que la seccin de cdigo empieza como:
SRAM_BASE
AREA

EQU

0X04000000

EXAMPLE, CODE, READONLY

; Seccin de inicializacin
ENTRY
MOV

r0, #SRAM_BASE

MOV

r1, #0XFF000000

Si el valor de SRAM_BASE cambiara a un valor que no se pudiera generar utilizando el esquema de


rotacin de byte, el cdigo generara un error. Si el cdigo se escribiera en lugar de la forma
anterior utilizando:
LDR

r0, = SRAM_BASE

El cdigo siempre ensamblara sin importar que valor pueda tomar SRAM_BASE. Esto lleva
inmediatamente a la pregunta de cmo maneja el ensamblador estas constantes inusuales.

Cuando el ensamblador ve la pseudo instruccin LDR, tratar ya sea con una instruccin MOV o
una instruccin MVN realizar la carga dada antes de continuar. Es necesario recalcar que podemos
generar clases de nmeros, pero no cada uno de los nmeros, utilizando el mecanismo de rotacin
que mencionamos antes. Para aqullos nmeros que no podemos crear, un depsito de literales
o un bloque de constantes se crea para mantenerlas en memoria, usualmente muy cerca de las
instrucciones que requieren los datos, adems de con las instrucciones que recuperan las
constantes de memoria. En forma implcita, un bloque de constantes se coloca en cada directiva
END, de tal forma que una instruccin de carga buscara exactamente despus de la ltima
instruccin en un bloque de cdigo por su nmero. Sin embargo, el modo de direccionamiento
que se utiliza para hacer esto, se denomina una direccin relativa al PC, slo tiene un rango de 4
KB (el desplazamiento es slo de 12 bits), lo que significa que un bloque de cdigo muy grande
puede causar problemas si no se corrige.

Anda mungkin juga menyukai