ARM de 32 bits

3
Carga de constantes de 32 bits y depósito de literales Es posible cargar directamente, una constante de 32 bits utilizando una instrucción de carga? Una de las características 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 contradicción de ajustar una constante de 32 bits en una instrucción que sólo tiene 32 bits. Los campos asociados con este tipo de instrucciones, Fig. 6.1, (bits [27:25], los que indican que esta es una instrucción de procesamiento de datos), la instrucción en si (bits [24:21], los que indican que es una instrucción MOV), y los 12 bits menos significativos. Estos últimos bits dan algunas opciones, y dan a la instrucción una gran flexibilidad para utilizar registros, registros con corrimientos o rotaciones o valores inmediatos como operandos. El registro de barril también se utiliza en la creación de constantes. Los registros de barril son realmente un poco más que circuitos diseñados específicamente, para hacer corrimientos o rotaciones de datos y se pueden construir utilizando una lógica muy rápida. El esquema de rotación de ARM mueve bits a la derecha utilizando el registro de barril, “envolviendo” el bit menos significativo alrededor del bit más significativo en el otro extremo del registro. Con 12 bits disponibles en una instrucción y hardware dedicado para ejecutar los corrimientos, los procesadores ARM pueden generar clases de números en lugar de cada número entre 0 y 2 32 - 1. Ejemplo: Calcular la rotación necesaria para generar la constante 4080 utilizando el esquema de rotación de byte. Solución Ya que 4080 es 1111 1111 0000 2 , el byte 1111 1111 2 o 0xFF puede rotarse a la izquierda 4 bits. Sin embargo, el esquema de rotación rota un byte a la derecha; por lo tanto, se necesita un factor de rotación de 28, ya que rotar a la izquierda n bits equivale a rotarlos a la derecha 32- n bits. La instrucción necesaria sería: MOV r0, #0xFF, 28 ; r0= 4080 La instrucción MVN (move negativo) la cual transfiere el complemento a 1 del operando dentro de un registro, se puede utilizar para generar clases de números como: MVN r0, #0 ; r0 = 0xFFFFFFFF MVN r0, #0xFF, 8 ; r0 = 0x00FFFFFF

description

ARM de 32 bits y como cargar constantes

Transcript of ARM de 32 bits

  • 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 , =

    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 EQU 0X04000000

    AREA 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.