Upload
raul-franco
View
42
Download
10
Embed Size (px)
DESCRIPTION
FDFAFAFDFDFFD
Citation preview
Resumen instrucciones en ensamblador para ARM
Electrónica 5. FIUSAC
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
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
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)
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.
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
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.
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.
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
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
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
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.
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
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
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
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
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