Sei sulla pagina 1di 15

Pontificia Universidad Católica del Perú

Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

LENGUAJE ENSAMBLADOR
Las instrucciones de lenguaje máquina constan de código de operación y uno o más campos
de referencia de operando. El tamaño de la instrucción es la cantidad de bits que ocupa en
memoria, y en el caso de los núcleos Cortex-M, son de 16 bits y 32 bits.
El juego de instrucciones (ISA1) de los núcleos Cortex-M lo definió ARM Limited con el
nombre THUMB-2. Sin embargo, cada núcleo soporta un subconjunto de este juego de
instrucciones. El único que soporta todas las instrucciones es el núcleo Cortex-M4F que
incluye la unidad de punto flotante (FPU), siendo el núcleo Cortex-M0 es el que menos
instrucciones soporta.
En el lenguaje ensamblador las instrucciones de lenguaje máquina se representan con líneas
de texto. Cada línea consta de una o más de las siguientes partes: etiqueta, nemónico,
operandos, comentario. De éstas, es obligatorio el nemónico y también los operandos, si la
instrucción los requiere.
El nemónico representa la operación que realiza la instrucción, y cada operando representa al
dato a emplear en la operación.
Es el fabricante del CPU (en este caso el núcleo) el que define el lenguaje ensamblador: los
nemónicos, operandos y la sintaxis.
El lenguaje ensamblador tiene, además de los nemónicos, a las directivas. Las directivas no
son instrucciones del CPU. Son comandos del lenguaje ensamblador que permiten hacer cosas
como por ejemplo las siguientes: definir dónde comienza el programa escrito (dirección de
memoria), definir constantes a grabar en la memoria de programa.
Aunque los nemónicos y sintaxis de los operandos son estándar (iguales) entre diferentes
fabricantes de herramientas de software (por ejemplo Keil, Texas Instruments), no lo son las
directivas.
ARM Limited tiene dos versiones de la sintaxis del lenguaje ensamblador. La vigente se
denomina UAL (unified assembly language) y a la anterior la denomina pre-UAL. El Code
Composer Studio permite utilizar ambos, pero en el curso sólo emplearemos el UAL.

Modelo del programador


El CPU o núcleo consta de muchos registros, pero sólo algunos son visibles al programador
(son utilizados por las instrucciones). Los registros visibles al programador así como sus
nombres y finalidad, conforman lo que se denomina el modelo del programador
(programmer’s model).
En la Fig. 1 se muestra parte del modelo del programador de los núcleos Cortex-M3 y
Corte-M4. Todos los registros son de 32 bits y se describen a continuación:
 R0 a R12. Son los registros de propósito general. Son los empleados en la mayoría de
instrucciones. Los registros R0..R7 se conocen como “registros menores” (low
registers) y la mayoría de instrucciones de 16 bits sólo emplean estos registros.

1
ISA Instruction Set Architecture: El conjunto de instrucciones del CPU que son visibles al programador.
LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -1- 23/09/2018
Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

 R13 (SP). Es el puntero de pila (stack pointer). Se emplea para implementar una
estructura de datos denominada pila (stack).
 R14 (LR). Es el registro de enlace (link register). Se usa para implementar funciones.
Contiene la dirección de retorno cuando se llama a una función.
 R15 (PC). Es el contador de programa. Siempre apunta a la siguiente instrucción a
procesar (leer).
 PSR. Es el registro de estados (program status register), que contiene a las banderas.

Fig. 1.- Modelo del programador (parcial) de los núcleos Cortex-M3 y Cortex-M4

Banderas (flags)
Las banderas son un conjunto de bits cuyos valores son modificados por algunas instrucciones
según el resultado de una operación. Normalmente están agrupados en un registro especial
llamado registro de banderas (flag register) o registro de estados (status register) , que en los
núcleos Cortex-M3 y Cortex-M4 es el registro PSR (program status register).
Los valores de las banderas son utilizados en ciertas instrucciones, como por ejemplo los
saltos condicionales. Gracias a estas banderas es posible implementar estructuras como IF,
WHILE, REPEAT del lenguaje C.
Los núcleos Cortex®-M3 y Cortex®-M4 cuentan con las siguientes banderas:
 Bandera de cero (Z). Indica si el resultado de una operación es cero.
 Bandera de acarreo (C). Indica si al efectuar una operación hubo acarreo en el bit más
significativo del resultado.
LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -2- 23/09/2018
Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

 Bandera de negativo (N). Indica el valor del bit más significativo del resultado.
 Bandera de desborde (V). Indica si hubo desborde al efectuar operaciones con
números con signo.
No todas las instrucciones modifican (actualizan) las banderas, y muchas instrucciones
permiten indicar si queremos que se actualicen las banderas o no. Veremos esto al tratar sobre
la sintaxis de instrucciones en lenguaje ensamblador.

Bandera de cero Z (zero flag)


Esta bandera toma el valor 1 cuando el resultado de una operación es cero. Caso contrario su
valor será 0.
Como los registros de los núcleos Cortex-M son de 32 bits dicha bandera se pone a 1 cuando
los 32 bits del resultado valen cero, siempre y cuando la instrucción actualice las banderas.
Ejemplo 1:
Si R0 contiene el valor 0x9798770E, y R1 contiene el valor 0x686788E9, al efectuar la
operación R0 = R0 + R1 se obtiene lo mostrado en la Fig. 2.
La suma en binario La suma en base 16

Fig. 2 Ejemplo 1
Si la instrucción con la que se efectúa la suma modifica las banderas, entonces la bandera Z se
pondrá a 1 en este ejemplo, pues los 32 bits del resultado valen cero.
Ejemplo 2:
Si R0=0x76543210, R1=0x8A09920F y se efectúa la operación R0=R1+R2, el resultado
sería el mostrado en la siguiente figura.
Como no todos los bits del resultado valen cero, la bandera Z se pondrá a 0 si la instrucción
de suma actualiza las banderas.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -3- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Fig. 3 Ejemplo 2

Sintaxis del lenguaje ensamblador


Instrucciones: Sintaxis
La sintaxis, en general, de una instrucción es la siguiente:
etiqueta: nemónico operando1, operando2, operando3 ;comentario

La etiqueta y comentario son opcionales. Los operandos pueden ser: ninguno, uno, dos o tres.
Si hay más de uno, se separan con comas.
La etiqueta representa la dirección de inicio de la instrucción. Puede ser cualquier palabra que
comience con un carácter alfabético o ‘$’ y las demás un carácter alfanumérico, o ‘ _’
Se presentan algunos ejemplos:

main: add R3, R2, R1 ; inicio del programa


movs R7, #0x35
lazo_1: mov R10, #714
ldr R7, [R0, #4]

add, movs, mov y ldr son los nemónicos de las instrucciones. main, lazo_1 son
etiquetas. add y ldr tienen tres operandos y los demás dos. Cada operando está relacionado
con cada campo de referencia de operando del código máquina de la instrucción.
En la primera línea “; inicio del programa” es un comentario.
En la siguiente figura se muestra el ejemplo de una instrucción de 16 bits THUMB-2 en
lenguaje máquina y lenguaje ensamblador.
MOVS es el nemónico y Rd, #imm8 son los operandos en la sintaxis de la instrucción. Más
abajo, en la misma figura, está la instrucción usando como operandos a R7 y la constante
0x35.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -4- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Fig. 4 Una variante de instrucción MOV en lenguaje máquina y lenguaje ensamblador. Copia
una constante sin signo de 8 bits a un registro de 32 bits y actualiza las banderas.

Las constantes, denominadas ‘literals”, se escriben de manera similar al lenguaje C, y pueden


representarse los números en base 10 (comienzan con 1..9), base 16 (comienzan con 0x) pero
además base 2 (comienzan con 0b).

Comentarios
En lenguaje ensamblador los comentarios se comienzan con un punto y coma y terminan al
final de la línea de texto. Son equivalentes a los comentarios que comienzan con “ //” en
lenguaje C.

Partes de un programa en lenguaje ensamblador


Debido a la complejidad de un microcontrolador de 32 bits, y lo delicado de la configuración
inicial del sistema (denominado start-up), no es recomendable escribir un programa
exclusivamente en lenguaje ensamblador y que no emplee las facilidades dadas por las
herramientas de software. En vez de ello, se escribe un programa pero de manera que
podamos emplear los programas de start-up que nos brindan los fabricantes, para no tener que
desarrollar uno nosotros.
Se presenta a continuación un ejemplo de lo mínimo que debe incluir un programa en
lenguaje ensamblador que se compilará en el entorno Code Composer Studio que cumple con
las condiciones mencionadas arriba.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -5- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

; programa mínimo en lenguaje ensamblador para Stellaris y Tiva usando


; Code Composer Studio

.text ; El programa debe estar en la sección de código, y el


; nombre predeterminado es .text

.thumb ; Indica que se programa con instrucciones THUMB y se


; usa sintaxis UAL, indispensable pues el ISA es
; Thumb-2, y este sólo soporta sintaxis UAL

.global main ; El enlazador espera, como dirección de inicio,


; la etiqueta main

main:
movs r0, #7 ; aquí va nuestro programa en lenguaje ensamblador
; una vez hecha la inicialización del sistema
; (start-up) llega aquí
mov r1, r0
ldr r2, puerto
str r0, [r2]

fin: b fin
puerto: .word 0x400053FC
.end ; aquí termina nuestro programa

Las partes esenciales son las siguientes, y en este orden:


 .text Esta directiva indica al ensamblador que lo que se está escribiendo
pertenece a la sección de código (se grabará en la memoria flash).
 .thumb Esta directiva indica que el ISA empleado es THUMB o THUMB-2 y que
se empleará la sintaxis UAL.
 .global main Esta directiva con la etiqueta main le indica al ensamblador que la
etiqueta main debe ser visible para el enlazador, de manera que sepa que está en este
archivo.
 main: Con esta etiqueta debe comenzar la primera instrucción de nuestro
programa.
 .end Esta directiva le indica al ensamblador que se llegó al final del archivo.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -6- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Es importante mantener ese orden, y que exista la etiqueta main, pues al compilar el
proyecto, se generará automáticamente el código de inicialización (start-up) pero luego que
este se ejecute, se espera encontrar la primera instrucción con la etiqueta main.
En el ejemplo anterior tenemos lo siguiente:
 las dos primeras líneas de texto son comentarios, y en las otras hay comentarios al
final.
 mov, ldr, b son nemónicos de instrucciones
 .word es otra directiva del lenguaje ensamblador
 puerto es una etiqueta

MODOS DE DIRECCIONAMIENTO
Son las diferentes maneras como el CPU accede a los datos a utilizarse en las instrucciones.
Los datos son los valores utilizados por la instrucción para las operaciones matemáticas.
Suelen llamarse a estos datos "operandos".
Los operandos pueden ser los siguientes:
 el contenido de un registro del CPU
 el contenido de un registro de E/S
 un registro de la memoria de programa (flash)
 un registro de memoria RAM
 una constante que está en el código máquina de la instrucción

Dirección efectiva
Es la dirección de memoria (o de un registro de E/S) en la que se encuentra el operando, una
vez realizada cualquier operación aritmética requerida para determinar dicha dirección.
Las operaciones mencionadas se refieren a los cálculos que hace el CPU a partir de los
valores de los campos de referencia de operando de la instrucción en lenguaje máquina.
Por ejemplo, en una instrucción con tres operandos podríamos tener los siguientes casos:
 Que hayan dos operandos, uno emplea uno de los campos de referencia de operando, y
el otro dos.
 Que hayan tres operandos, cada uno emplea un campo de referencia de operando.
Uno u otro caso depende de cómo ha sido diseñado el CPU.
Veremos los modos de direccionamiento a nivel de lenguaje ensamblador.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -7- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

NSTRUCCIONES DEL LENGUAJE ENSAMBLADOR


Vamos a mostrar tres instrucciones de lenguaje ensamblador, pero que tiene varios modos de
direccionamiento, y por ello distinta codificación máquina. También mostraremos cómo
escribirlas cuando queremos que modifiquen las banderas o no.

MOV
Copia una constante en un registro del CPU o el contenido de un registro del CPU a otro
registro del CPU.
Registro CPU <== Constante

Registro CPU <== Registro CPU

MOV (inmediato)
Modifica Operandos
Sintaxis Operación
Banderas
MOV Rd, #constante X Rd: R0...R12, LR
Rd := constante
MOVS Rd, #constante √ constante: 0 a 65535

Ejemplo 1
R11 <== 2300 sin modificar banderas

Solución:
MOV R11, #2300

Ejemplo 2
R7 <== 214 actualizando banderas

Solución:
MOVS R7, #214

MOV (registro) Sintaxis


Modifica Operandos
Sintaxis Operación
Banderas
MOV Rd, Rm X Rd, Rm: R0...R12, LR
Rd := Rm
MOVS Rd, Rm √

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -8- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Ejemplo 1

R12 <== R3 sin modificar banderas

Solución:
MOV R12, R3

Ejemplo 2

R7 <== R3 actualizando banderas

Solución:
MOVS R7, R3

LDR
Permite copiar en un registro del CPU el contenido de un registro de memoria o de E/S para
ello lee del espacio de memoria cuatro direcciones consecutivas. La instrucción es más rápida
en ejecutarse si la dirección efectiva es múltiplo de 4.

Registro memoria
Registro CPU <==
(Flash, RAM, E/S)

LDR (inmediato)
Modifica Operandos
Sintaxis Operación
Banderas
LDR Rt, [Rm] X Rd := [Rm] Rt: R0...R12, PC
LDR Rt, [Rm, #constante] X Rd := [Rm+constante] Rm: R0...R12, PC
constante: 0 a 4096

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -9- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Ejemplo 1
Si se tiene grabado en el espacio de memoria lo
mostrado a la derecha, y dirección Memoria
R7= 0x40000000 0x0000 0000
Y se ejecutan las siguientes instrucciones:
..... .....

LDR R1, [R7] 0x4000 0000 0x34


0x4000 0001 0x91
El CPU leerá el contenido de R7, que es 0x4000 0002 0x78
0x40000000.
0x4000 0003 0x9A
Este valor lo emplea como una dirección de
memoria (esta es la dirección efectiva). 0x4000 0004 0x88
0x4000 0005 0x6C
Lee las direcciones: 0x4000 0006 0x8F
0x4000 0000 0x4000 0007 0x9D
0x4000 0001 0x4000 0008 0xFF
0x4000 0002 0x4000 0009 0x00
0x4000 0003 0x4000 000A 0x12
0x4000 000B 0x23
Los valores leídos los graba en R1. 0x4000 000C 0xCC
Como la arquitectura en familia Stellaris y Tiva 0x4000 000D 0xDD
es little-endian, se grabará así en R1:
R1 = 0x9A789134 .... ....

0xFFFF FFFF
El contenido de R7 no se modifica.

Ejemplo 2
Usando los mismos valores de R7 y del espacio de memoria del ejemplo 1 ahora se ejecuta la
instrucción siguiente:

LDR R2, [R7, #8]

El CPU leerá el contenido de R7 y le sumará 8.


Dirección efectiva = 0x40000000 + 8 = 0x40000008

Leerá las direcciones siguientes:


LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -10- 23/09/2018
Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

0x4000 0008
0x4000 0009
0x4000 000A
0x4000 000B

El valor que se grabará en R2 será el siguiente:


R2 = 0x231200FF

LDR (literal)
Esta instrucción permite grabar un número de 32 bits en un registro del CPU. El número está
grabado en una dirección cercana a la instrucción (por lo tanto, en este curso, grabado en la
memoria de programa).
Para poder utilizarla, debe emplearse conjuntamente con la directiva .word, la cual también
se describirá en los ejemplos.

Modifica Operandos
Sintaxis Operación
Banderas
Rt: R0...R15
LDR Rt, etiqueta X Rt := [etiqueta] etiqueta: La etiqueta con la dirección
de inicio del número a leer

Ejemplo 1
LDR R0, Num1
....
....
Num1: .word 0x40004780
Num2: .word 0x12345678

La directiva .word permite definir un número de 32 bits que formará parte del código del
programa (ocupará 4 direcciones consecutivas). Al momento de grabar el programa en la
memoria Flash, se grabarán también estos 4 bytes.
En el ejemplo, al ejecutar la instrucción LDR el CPU determinará la dirección de Num1
(dirección efectiva) y leerá el contenido de las direcciones Num1, Num+1, Num+2 y Num+3.
Los valores leídos los grabará en R0.
Finalmente el valor de R0 será el siguiente:
R0 = 0x40004780

Ejemplo 2
Se quiere leer el registro GPIO_PORTB_DIR_R y grabar su contenido en R7.
LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -11- 23/09/2018
Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Solución
La porción de programa que resuelve el problema es el siguiente:
Explicación:
LDR R0, PORTB_DIR
La dirección base del puerto B es 0x40005000
LDR R7, [R0] y el desplazamiento (offset) de GPIODIR es
.... 0x400.
.... La dirección efectiva de GPIO_PORTB_DIR es
Dirección base + offset
PORTB_DIR: .word 0x40005400
Dirección = 0x40005000+0x400 = 0x40005400
Ese valor lo definimos con la directiva .word

Con la primera instrucción se graba en R0 la dirección del registro GPIODIR.


Con la segunda instrucción leemos el contenido de esa dirección, es decir, el contenido del
registro GPIODIR).
Resumen:
 Utilizar LDR(literal) conjuntamente con directiva .word
 Siempre colocar la directiva .word después de las instrucciones LDR y no antes.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -12- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

STR
Esta instrucción permite copiar el contenido de un registro del CPU en un registro de memoria
(4 direcciones consecutivas). La ejecución de la instrucción es más rápida si la dirección
efectiva es múltiplo de 4.
Registro memoria
Registro CPU ==>
(Flash, RAM, E/S)

STR (inmediato)
Modifica Operandos
Sintaxis Operación
Banderas
STR Rt, [Rn] X [Rn] := Rt Rt: R0...R13
STR Rt, [Rn, X [Rn+constante] := Rt constante: 0 a 4095
#constante]

Ejemplo 1 dirección Memoria


Si se tiene grabado en el espacio de memoria lo 0x0000 0000
mostrado a la derecha, y
R7= 0x40000004, R1 = 0x98DC4377 ..... .....

y se ejecuta la siguiente instrucción:


0x4000 0000 0x34
STR R1, [R7] 0x4000 0001 0x91
El CPU leerá el contenido de R7, que es 0x4000 0002 0x78
0x40000004
0x4000 0003 0x9A
Este valor lo emplea como una dirección de
0x4000 0004 0x88
memoria (esta es la dirección efectiva).
0x4000 0005 0x6C
El contenido de R1 lo escribirá en las
direcciones: 0x4000 0006 0x8F
0x4000 0007 0x9D
0x4000 0004
0x4000 0005 0x4000 0008 0xFF
0x4000 0006 0x4000 0009 0x00
0x4000 0007 0x4000 000A 0x12
Como la arquitectura en familia Stellaris y Tiva
es little-endian, se grabará en 0x40000004 el 0x4000 000B 0x23
byte menos significativo de R1. 0x4000 000C 0xCC
0x4000 000D 0xDD

El contenido de R1, R7 no se modifica.


.... ....
En la figura de la derecha se muestra el nuevo
valor almacenado (en negrita). 0xFFFF FFFF

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -13- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

Ejemplo 2
Escribir el registro GPIODATA del puerto B el dirección Memoria
valor 0x7F.
0x0000 0000
Solución:
LDR R0, PORTB_DATA ..... .....

MOVS R1, 0x7F


0x4000 0000 0x34
STR R1, [R0] 0x4000 0001 0x91
.... 0x4000 0002 0x78
.... 0x4000 0003 0x9A
PORTB_DATA: .word 0x400053FC 0x4000 0004 0x77
0x4000 0005 0x43
Explicación: 0x4000 0006 0xDC
La dirección base del puerto B es 0x40005000 0x4000 0007 0x98
El desplazamiento (offset) de GPIODATA es 0x4000 0008 0xFF
0x3FC, por lo tanto, la dirección efectiva es: 0x4000 0009 0x00
Dirección = 0x40005000 + 0x3FC = 0x4000 000A 0x12
0x400053FC
0x4000 000B 0x23
Este valor lo definimos con directiva .word
0x4000 000C 0xCC
Con LDR cargamos ese valor en R0 0x4000 000D 0xDD
En R1 grabamos el valor 0x7F que queremos
escribir en GPIODATA .... ....
Con STR grabamos en la dirección indicada por
R0 (0x400053FC) el contenido de R1 (0x7F) 0xFFFF FFFF
que es lo que queremos realizar.

Nomenclatura de instrucciones en manuales de ARM


Limited: Sufijo S y el Operand2
En algunos manuales de los núcleos Cortex-M, en las tablas reducidas de instrucciones, como
en el "ARM® and Thumb®-2 Instruction Set Quick Reference Card" aparecen las instrucciones
escritas de la siguiente manera:
Operation Assembler S updates Action
Add ADD{S} Rd, Rn, <Operand2> N Z C V Rd := Rn + Operand2
Test TST Rn, <Operand2> N Z C Update CPSR flags on
Rn AND Operand2
And AND{S} Rd, Rn, <Operand2> N Z C Rd := Rn AND Operand2
Move MOV{S} Rd, <Operand2> N Z C Rd := Operand2

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -14- 23/09/2018


Pontificia Universidad Católica del Perú
Curso : Sistemas Digitales Profesor : Ing. Hugo Pratt

La columna Operation indica el nombre de la operación que realiza la instrucción. La


columna Assembler muestra la sintaxis de la instrucción, pero la muestra de manera genérica.
La letra S se muestra entre llaves en las instrucciones Add y And, para indicar que es un sufijo
opcional. Si está presente, la instrucción modificará las banderas indicadas en la columna S
updates, y si no lo está, no modificará las banderas.
El Operand2 representa a varios modos de direccionamiento que podrían emplearse con la
instrucción.
Algunos de ellos se muestran en la siguiente tabla
sintaxis Descripción
Operand2
valor inmediato #imm8m imm8m es un número de 8 bits desplazado de 0 a 24 bits a la
izquierda o de la forma: 0x00XY00XY, 0xXY00XY00,
0xXYXYXYXY
Ejemplos: 0x7B (es 0x0000007B)
0x004E004E00 (de la forma 0x00XY00XY00)
0x98009800 (es de la forma 0xXY00XY00)
0x001EC000 (es 0x7B desplazado 14 bits a la izquierda)
Registro Rm
Registro desplazado a la Rm, LSL #N Rm << N con N: 0 a 31
izquierda
Registro desplazado a la Rm, LSR #N Rm >> N (deplazamiento lógico) con N: 1 a 32
derecha
Registro desplazado a la Rm, LSL Rs Rm << Rs
izquierda por una cantidad de
bits indicado por otro registro
Registro desplazado a la Rm, LSR Rs Rm >> Rs (desplazamiento lógico)
derecha por una cantidad de
bits indicado por otro registro

Estos son unos ejemplos con la instrucción AND:


AND R3, R4, R5 El Operand2 es R5 la operación es R3 = R4 & R5, y no modifica las banderas
ANDS R3, R3, #0x02 El Operand2 es #0x02 y la operación es: R3 = R3 & 0x02 y modifica las banderas
ANDS R0, R2, R3 LSL #2 El Operand2 es "R3 LSL #2". El contenido de R3 desplazado dos bits a la izquierda, es
decir R3 << 2. La operación es: R0 = R2 & (R3 << 2)
MOV R7, #3 El operand2 en instrucción MOV es #3, no modifica las banderas. Operación: R7 = 3
ANDS R6, R1, R2 LSL R7 El operand2 en ANDS es "R2 LSL R7". La operación es R6 = R1 & (R2 << R7) y
modifica las banderas.

LenguajeEnsamblador_Cortex-M3yM4_simple_Rev5.docx -15- 23/09/2018

Potrebbero piacerti anche