17
Resumen instrucciones en ensamblador para ARM Electrónica 5. FIUSAC

Resumen Instrucciones en Ensamblador Para ARM

Embed Size (px)

DESCRIPTION

FDFAFAFDFDFFD

Citation preview

Page 1: Resumen Instrucciones en Ensamblador Para ARM

Resumen instrucciones en ensamblador para ARM

Electrónica 5. FIUSAC

Page 2: Resumen Instrucciones en Ensamblador Para ARM

Instrucciones de carga y almacenamientoInstrucción Descripción

LDR {type}{cond} Rd, [Rn] Carga a Rd la localidad de memoria apuntada por Rn

STR{type}{cond} Rt, [Rn] Guarda Rt en la localidad de memoria apuntada por Rn

LDR {type}{cond} Rd, [Rn, #n] Carga en Rd lo que está en la localidad de memoria [Rn+n]

STR {type}{cond} Rt, [Rn, #n] Guarda el contenido de Rt en la localidad [Rn+n]

LDR {type}{cond} Rd, [Rn, Rm, LSL #n] Carga en Rd el contenido que se encuentra en [Rn+Rm<<n]

STR {type}{cond} Rt, [Rn, Rm, LSL #n] Guarda el contenido de Rt en la localidad de memoira [Rn+Rm<<n]

MOV {S}{cond} Rd, <op2> Coloca (set) Rd igual al valor especificado por op2

MOV{cond} Rd, #im16 Coloca (set) Rd igual a im16, im16 está entre 0 y 65535

MOV{S}{cond} Rd, op2> Coloca (set) igual al valor especificado por op2

Page 3: Resumen Instrucciones en Ensamblador Para ARM

Operaciones lógicas El software usa operaciones lógicas y de cambio

para combinar información y para probar (test) la información.

Operaciones produce que su resultado esté en un parámetro de entrada, ejemplos: negación, complemento, incremento y decremento.

En lógica discreta digital, la operación de complemento se llama NOT

Todas las instrucciones colocan el resultado en el registro destino Rd. Si se omite Rd, el resultado se coloca en Rn, registro que tiene el primer operando.

Si se coloca S, las condiciones N y Z son actualizados dependiendo del resultado de la operación

Page 4: Resumen Instrucciones en Ensamblador Para ARM

Instrucción Descripción

AND{S}{cond}{Rd,} Rn, <op2>

Rd=Rn&op2

ORR{S}{cond}{Rd} Rn, <op2>

Rd=rnǀop2

EOR{S}{cond}{Rd,} Rn, <op2>

Rd=Rn˄op2

BIC{S}{cond}{Rd,} Rn, <op2>

Rd=Rn&( 9op2)

ORN{S}{cond}{Rd,} Rn, <op2>

Rd=Rn|( 9op2)

Page 5: Resumen Instrucciones en Ensamblador Para ARM

Operaciones de cambio (shift) Cambio lógico derecho (LSR): es similar a una división sin signo

por 2˄n, donde n es el número de bits desplazados. Se coloca 0 en la posición más significativa, y la bandera de acarreo recibirá el bit menos significativo. Estas operaciones no completan la vuelta. Un desplazamiento a la derecha por 3 bits, es similar a dividir por 8. LSR descarta los bits desplazados a la derecha.

Cambio aritmético a la derecha (ASR): es similar a una división con signo por 2˄n. Tenga en cuenta que el signo del bit se mantiene, y la bandera de acarreo recibirá el bit menos significativo. El bit más significativo vuelve a tener el mismo valor que tenía al inicio.

Cambio lógico izquierdo (LSL): mutiplica por 2˄n con y sin signo. Coloca un 0 en la posición más significativa, y la bandera de acarreo recibe el bit menos significativo

Rotación: usado para crear funciones de cambio de múltiple-palabra. Sólo se rota a la derecha.

Page 6: Resumen Instrucciones en Ensamblador Para ARM

Las instrucciones de cambio colocan el resultado en el registro destino Rd. Rm es el registro que mantiene el valor a ser cambiado, el número de bits para cambiar está en el registro Rs o bien, especificado por una constante n. Si el sufijo S es especificado, las condiciones N y Z son actualizados después de la operación.

Instrucción Descipción

LSR{S}{cond} Rd, Rm, Rs

Cambio lógico a la derecha Rd=Rm>>Rx (sin signo)

LSR{S}{cond} Rd, Rm, #n

Cambio lógico a la derecha Rd=Rm>>n (sin signo)

ASR{S}{cond} Rd, Rm, Rs

Cambio aritmético a la derecha Rd=Rm>>Rs (con signo)

ASR{S}{cond} Rd, Rm, #n

Cambio aritmético a la derecha Rd=Rm>>n (con signo)

LSL{S}{cond} Rd, Rm, Rs

Cambio derecho Rd=R,<<Rs (con/sin signo)

ROR{S}{cond} Rd, Rm, Rs

Rotación a la derecha

ROR{S}{cond} Rd, Rm, #n

Rotación a la derecha

RXX{S}{cond} Rd, Rm

Rotación a la derecha 1 bit con extensión

Page 7: Resumen Instrucciones en Ensamblador Para ARM

Operaciones Aritméticas Es importante recordar que las operaciones

aritméticas (suma, resta, multiplicación y división) tienen limitaciones cuando se realizan con precisión finita en un procesador. Un error de sobreflujo ocurre cuando el resultado no cabe en el registro en el cual se almacenará el resultado.

Page 8: Resumen Instrucciones en Ensamblador Para ARM

Instrucción Descripción

ADD{S}{cond}{Rd,} Rn, <op2>

Rd=Rn + op2

ADD{S}{cond}{Rd,} Rn, #im12

Rd=Rn + im12

SUB{S}{cond}{Rd,} Rn, <op2>

Rd=Rn - op2

SUB{S}{cond}{Rd,} Rn, #im12

Rd=Rn – im12

RSB{S}{cond}{Rd,} Rn, <op2>

Rd=op2 - Rn

RBS{S}{cond}{Rd,} Rn, #im12

Rd=im12 - Rn

CMP{cond} Rn, <op2> Rn - op2

CMN{cond} Rn, <op2> Rn – (-op2)

• Las instrucciones CMP y CMN no guardan el resultado de la resta o suma, pero sí logran alterar las banderas.

• Las instrucciones de comparación se usan para crear condiciones de ejecución, como if-then, para ciclos y while.

Page 9: Resumen Instrucciones en Ensamblador Para ARM

Si las 2 entradas en una operación de suma son consideradas sin signo, entonces, la bandera de acarreo no necesariamente dará el resultado real requerido y puede ser dato equivocado.

Si las 2 entradas en una operación de resta son consideradas sin signo, la bandera de acarreo se limpiará y nuevamente puede tener un resultado erróneo.

En ambos casos, suma o resta, si se coloca con signo, existe un riesgo que la bandera de sobreflujo (V) tenga un resultado erróneo.

Si el sufijo S está presente, en la suma o resta hay que tomar en cuenta las siguientes caraterísticas:

Bit Nombre Significado después de una suma o resta

N Negativa Resultado es negativo

Z Zero Resultado es cero

V Sobreflujo Sobreflujo signado

C Acarreo Sobreflujo sin signo

Page 10: Resumen Instrucciones en Ensamblador Para ARM

Multiplicación (MUL) y multiplicación con acumulación (MLA), utilizan operandos de 32 bits, y únicamente guardan los 32 bits menos significativos del resultado. Pueden utilizarse números con y sin signo, pero en ambos casos, la bandera de sobreflujo no es afectada.

Instrucción Significado

MUL{S}{cond} {Rd,} Rn, Rm Rd = Rn*Rm

MLA{cond} Rd, Rn, Rm, Ra Rd = Ra+Rn*Rm

MLS{cond} Rd, Rn, Rm, Ra Rd = Ra-Rn*Rm

UDIV{cond} {Rd,} Rn, Rm Rd = Rn/Rm sin signo

SDIV{cond} {Rd,} Rn, Rm Rd = Rn/Rm con signo

Page 11: Resumen Instrucciones en Ensamblador Para ARM

Las siguientes instrucciones utilizan 32 bits en los operandos, y devuelven un resultado de 64 bits.

Los registros RdLo y RdHi, contienen la parte menos significativa y la más significativa del resultado

Estas instrucciones no afectan a las banderas

Instrucción Descripción

UMULL{cond} RdLo, RdHi, Rn, Rm

Rd=Rn*Rm

SMULL{cond} RdLo, RdHi, Rn, Rm

Rd=Rn*Rm

UMLAL{cond} RdLo, RdHi, Rn, Rm

Rd=Rd+Rn*Rm

SMLAL{cond} RdLo, RdHi, Rn, Rm

Rd=Rd+Rn*Rm

Page 12: Resumen Instrucciones en Ensamblador Para ARM

Pila

La primera instrucción en la pila es almacenada en la dirección más alta de la RAM, eso quiere decir que, el ítem más reciente, se encuentra en una localidad de memoria más baja que la primera en ingresar a la pila.

Cuando se envía información a la pila (push), primero el SP se decrementa 4, y la información de 32 bits se almacena en la dirección especificada por SP.

Para sacar información de la pila (pop), la información de 32 bits apuntada por SP, primero se revierte, y luego el SP se incrementa en 4.

La instrucción PUSH {Rn}, salva el valor contenido en Rn en la pila. Existen algunas reglas cuando se usa la pila:

1. Las funciones deben tener igual número de entradas y salidas2. El acceso a la pila (push o pop) no debe utilizarse fuera del área destinada

para la misma3. PUSH primero decrementa SP, y luego almacena el dato4. POP primero lee el dato, y luego incrementa SP

Cuando se ejecuta un servicio de interrupción, automáticamente se envía información a la pila.

Page 13: Resumen Instrucciones en Ensamblador Para ARM

Funciones y flujo de control Normalmente, se ejecuta instrucciones una tras otra,

siendo la consecutiva la que se ejecutará. Pero existen instrucciones que permiten alterar este

procedimiento. Subrutinas, procedimientos y funciones son secuencias

que pueden llamarse para situaciones específicas, más de una vez.

Se define el inicio de una subrutina etiquetando la primera instrucción que conforma esta subrutina, y se colocan luego todas las instrucciones a realizar, la última instrucción debe ser BX LR, la cual indica que se sale de la subrutina.

Estas instrucciones permiten el implemento de estructuras como if-then, while-loop, y for-loop

Page 14: Resumen Instrucciones en Ensamblador Para ARM

Instrucción Significado

B{cond} label Cambia el IP a la dirección en donde se encuentra label

BX{cond} Rm Cambia el IP al dato especificado por el contenido de Rm

BL{cond} label Cambia el IP al valor de la subrutina indicada por label

BLX{cond} Rm Cambia el IP a la subrutina especificada por el contenido de Rm

BX LR Sale de la subrutina

Page 15: Resumen Instrucciones en Ensamblador Para ARM

Directivas en ensamblador Se utilizan las directivas para asistir y controlar los procesos de ensablaje. Las directivas o los pseudo-operandos no son parte del set de instrucciones. Estas directivas cambian la forma en que el código es ensamblado. El primer lote

define donde y cómo los objetos (códigos y variables) son colocados en memoria. CODE es el lugar para las instrucciones de máquina, usualmente en la ROM. DATA es el lugar para variables globales, usualmente en la RAM STACK es el lugar para la pila, también en la RAM ALIGN=n es el modificador que inicia el área que alinea hacia 2˄n bytes |.text| es usado para secciones de código producidas por el compilador C, o para

secciones de código asociados con la librería de C Normalmente, las áreas de RAM se inicializan en cero, pero NOINIT define el área

de RAM para que no se inicialice Project->Options, establecen el inicio de la ROM en 0x0000.0000 y la RAM en

0x2000.0000

AREA RESET, CODE, READONLY

Resetea vectores en ROM

AREA DATA Coloca objetos en memoria de datos (RAM)

AREA |.text|, CODE, READONLY, AIGN=2

Código en ROM

AREA STACK, NOINIT, READWRITE, ALIGN=3

Area de pila

Page 16: Resumen Instrucciones en Ensamblador Para ARM

Las siguientes directivas se usan para enlazar entre filas. Normalmente las etiquetas en una fila no son accesibles en otra

fila. Si se tienen objetos globales (funciones o variables), se agrega una directiva EXPORT en la fila donde el objeto es definido y una directiva IMPORT in la fila deseando accesar al objeto.

GLOBAL es un sinónimo de EXPORT

IMPORT name Importa la función ¨name¨ desde otra fila

EXPORT name Exporta públicamente la función ¨name¨para uso en otra dirección cualquiera• Las directivas ALIGN se usan para asegurar que el

siguiente objeto es alineado correctamente.

ALIGN Salta 0 a 3 bytes para hacer la siguiente palabra alineada

ALIGN 2 Salta 0 ó 1 byte para hacer la siguiente media palabra alineada

ALIGN 4 Salta 0 a 3 bytes para hacer la siguiente palabra alineada

Page 17: Resumen Instrucciones en Ensamblador Para ARM

Thumb Las directivas THUMB son colocados al inicio del archivo para

especificar que el código es generado con instrucciones Thumb. Al final de todo el archivo se coloca la directiva END La directiva EQU brinda un nombre simbólico a una constante

numérica, un valor de registro relativo o un valor a un programa relativo. También se usa para definir las direcciones de puertos de entrada/salida

Las siguientes directivas pueden sumar variables y constantes:

DCB expr{,expr} Coloca 1 byte en memoria

DCW expr{, expr} Colca 1 media palabra en memoria

DCD expr{,expr} Coloca 1 palabra en memoria

SPACE size Reserva bytes del tamaño definido, sin inicializar