La Programación en Lenguaje Ensamblador
La Programación en Lenguaje Ensamblador
La Programación en Lenguaje Ensamblador
El Lenguaje
Ensamblador
Programacin
ARM Cortex-M3
Vicente Mahout
Publicado por primera vez en 2012 en Gran Bretaa y los Estados Unidos por ISTE Ltd y John Wiley
& Sons, Inc.
Aparte de cualquier trato justo para fines de investigacin o de estudio privado, o la crtica o comentario,
segn lo permitido bajo las leyes de derechos de autor, diseos y patentes Ley 1988, esta publicacin slo
puede ser reproducida, almacenada o transmitida de ninguna forma o por cualquier medio, con la previa
autorizacin por escrito de los editores, o en el caso de reproduccin reprogrfica de conformidad con los
trminos y las licencias expedidas por el CLA. Las investigaciones relativas a la reproduccin fuera de
estos trminos deben ser enviadas a los editores en la direccin: undermentioned
Los derechos de Vicente Mahout a ser identificado como el autor de este trabajo han sido afirmados por l
de conformidad con las leyes de derechos de autor, diseos y Ley de Patentes de 1988.
Mahout, Vincent.
Lenguaje Ensamblador : ARM Cortex-M3 / Vicente mahout. p. cm.
Incluye referencias bibliogrficas e ndice.
ISBN 978-1-84821-329-6
1. Los sistemas informticos integrados. 2. Los microprocesadores. 3. Lenguaje Ensamblador
(lenguaje de programa informtico) I. TTULO.
TK7895.E42M34 2012
005.2--dc23
2011049418
Impreso y encuadernado en Gran Bretaa por CPI Group (UK) Ltd., Croydon, Surrey CR0 4AA
Tabla de
contenido
Prefacio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ix
. . . . . . ..
1
Captulo 1. Descripcin general de la arquitectura Cortex-M3 . . . . . . .
1.1. El lenguaje ensamblador versus el ensamblador . . . . . . . . . . . . . . . . . . 1
. . . . . . . ..
1.2. El mundo del brazo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1. Cortex-M3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2. El ncleo Cortex-M3 de STM32. . . . . . . . . . . . . . . . . . . . . . 7
Apndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
. . . . ..
Apndice A. Instruction Set - Lista Alfabtica . . . . . . . . . . . . . . . 201
. .
Apndice B. SysTick Timer . . . . . . . . . . . . . . . . . . . . . . . . . 209
. .
Apndice C. Ejemplo de "Bootstrap" Archivo. . . . . . . . . . . . . . . 217
. . . ..
Apndice D. El Ensamblador GNU . . . . . . . . . . . . . . . . . . . . . 227
. . . ..
Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
. . . . ..
ndice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
. . . . . . ..
Prefacio
Para poder planificar y escribir este tipo de libros, usted necesita un buen ambiente
de trabajo. En mi caso, yo era capaz de beneficiarse de las mejores condiciones de
trabajo para esta empresa. En trminos de infraestructura y material, el Instituto
Nacional de Ciencias Aplicadas de ToulouseToulouse, Francia (Instituto Nacional de
Ciencias Aplicadas), y en particular de su Departamento de Ingeniera Elctrica e
Informtica, nunca ha dudado en invertir en equipo de ingeniera de sistemas, de
modo que la formacin de nuestros futuros ingenieros siempre ser capaz de
mantenerse al da con los rpidos cambios tecnolgicos. Deseo expresar mi profundo
agradecimiento a esta institucin. Estos sistemas no han ascendido a mucho menos, a
lo largo de los aos, haba un equipo de docentes y tcnicos aportando su entusiasmo
y dinamismo para llevarlas a la prctica. Las siguientes pginas contienen tambin
el duro trabajo de Pascal Acco, Guillaume Auriol, Pierre- Emmanuel Hladik, Didier
Le Botlan, Jos Martn, Sbastien Di Mercurio y Thierry Rocacher. Les doy las
gracias sinceramente. Las dos ltimas respetuoso y amable nods vaya a Franois y
Bernard Pompignac Faur, quien, antes de la jubilacin, hizo mucho trabajo para
fertilizar esta tierra ahora floreciente.
Este libro ha sido escrito para ser lo ms genrico posible. Es, sin duda, basada en
la arquitectura de conjunto de instrucciones y Cortex-M3, pero con la intencin de
explicar los mecanismos bsicos de la programacin en lenguaje ensamblador. De
esta manera podemos utilizar de forma sistemtica la programacin modular para
mostrar cmo estructuras algortmicas bsicas pueden ser programados en lenguaje
ensamblador. Este libro tambin presenta muchos ejemplos ilustrativos, lo que
significa que tambin es prctico.
Captulo 1
Los procesadores. Cabe sealar tambin que el A4 y A5, los procesadores fabricados
por Apple y utilizado en su iPad tabletas grficas, estn basados en los procesadores
ARM Cortex-Type una.
1.2.1. Cortex-M3
1.2.1.1. Unidades
Ejecutivas
Estas unidades conforman la parte principal del procesador: la parte que es
fundamentalmente necesario para ejecutar las aplicaciones y realizar ellos mismos o
sus funciones de software:
- CM3CORE: es el ncleo mismo. Esta unidad contiene diferentes registros, todos
los mecanismos de la instruccin de lectura y escritura y los datos en el formulario de
la aritmtica y
2 avanzado bus de alto rendimiento (AHB) es un protocolo de bus de microcontrolador trado por
Brazo.
6 Assembly Language Programming Overview of Cortex-M3 Architecture 6
Por lo tanto para combinar y dar formato a esta doble corriente de los datos antes de
transmitirlos al puerto. En el mundo exterior, es necesario usar un analizador de
puertos de traza para recuperar los datos.
1.2.2.1. Funcionalida
d
La seleccin de la versin adecuada de controller puede ser un paso importante
en la fase de diseo del proyecto: en funcin de las necesidades (en trminos de la
funcin, el nmero de entrada/salida, etc.), sino tambin sobre las limitaciones
adecuadas (coste, consumo, tamao, etc.), cada versin del procesador ser ms o
menos bien adaptada al proyecto. Nuevamente, el propsito de este libro es no entrar
en detalles acerca de la funcin de los aspectos perifricos de la controlador. No
obstante, es til para tener una visin global del circuito que finalmente sern
programados, por lo que no estn sorprendidos por esas cosas bsicas como, por
ejemplo, el direccionamiento de memoria. Desde un punto de vista funcional, la
figura 1.3 muestra cmo STMicroelectronics ha "vestidas" Cortex-M3 para crear un
procesador (STM32F103RB versin es mostrado aqu). La primera observacin
importante es que,
Inevitablemente, no todas las funciones ofrecidas por este controlador estn
disponibles simultneamente.
Normalmente varias unidades comparten las clavijas de salida. Por lo tanto,
dependiendo de la configuracin que el programador, impone ciertas funciones de
facto debe estar disponible para la aplicacin. Slo un conocimiento profundo de
un procesador determinado permitirn al programador a conocer, a priori, si la
versin escogida ser suficiente para las necesidades de la aplicacin que se
desarrolla. La cuestin de la eleccin de la mejor versin es, por lo tanto, lejos de ser
trivial.
El brazo est diseado para que coincida con la direccin de una palabra (en la
zona de alias) con un poco de bits (en la zona de bandas). As que cuando el
programador escribe un valor en la zona de alias, que equivale a la modificacin de
las bandas de bits bit correspondiente al poco peso cero que acaba de escribir. Por el
contrario, leyendo el bit menos significativo de una palabra en la zona de alias permite
que el programador conoce el estado lgico del bit correspondiente en la zona de
bandas de bits (vase la figura 1.6). Cabe sealar que esta tcnica no utiliza la
memoria RAM en la medida en que las zonas de alias son imaginarios: fsicamente
no corresponden a las ubicaciones de memoria - que slo utilizan direcciones de
memoria, pero con 4 GB de posibles direcciones esta prdida es de poca trascendencia.
Captulo 2
El ncleo de Cortex-M3
Paso entre estos tres tipos de funcionamiento puede describirse mediante una
mquina de estado, vase la figura 2.1 [07] YIU. Despus se restablece, el procesador
est en modo de subproceso con privilegio. Estableciendo el bit menos significativo
(LSB) del control de registro, es posible cambiar a modo sin privilegios (tambin
llamado modo de usuario en la documentacin del brazo) mediante software. En modo
sin privilegios, el usuario no puede acceder al control de registro, de modo que es
imposible volver al modo privilegiado. Justo despus del lanzamiento de una
excepcin (vase el captulo 8) el procesador pasa a modo de identificador, que
necesariamente ha de privilegio. Una vez que la excepcin ha sido procesado, el
procesador vuelve a su modo anterior. Si, durante la tramitacin de la excepcin, el LSB
de control de registro se modifica, entonces el procesador puede volver al modo
contrario al que estaba en vigor antes del lanzamiento. La nica manera de cambiar
a modo de hilos sin privilegios, en contraposicin al modo de subproceso privilegiado,
est pasando por una excepcin que se expresa por pasar a modo de controlador.
2.2. Registra
La primera cosa que debe ser advertido acerca de un procesador es que est
compuesto de varios registros. Este es, sin duda, el enfoque ms pragmtico en la
medida en que las arquitecturas modernas, tales como los de Cortex-M3, se
denomina tipo de almacn de carga
18 Assembly Language Programming The Core of Cortex-M3 18
REMARK 2.2.- Estos registros generales, contrariamente a otras arquitecturas, slo son
accesibles en paquetes de 32 bits. Los registros, por tanto, no se puede dividir en dos
la mitad- palabras o cuatro bytes. Si su aplicacin se ocupa de bytes (cadenas de
caracteres para ser ms precisos), por ejemplo, los 24 bits ponderada ms alta
se encuentra a 0 para que su funcionamiento sea sensato.
R13 es el registro SP. Como su nombre sugiere, los puntos (es decir, contiene la
direccin de una ubicacin de memoria) a un lugar que corresponde a la ubicacin
actual de la pila del sistema. Esta idea de una pila se explicar con ms detalle ms
adelante (vase la seccin
6.5.6), pero por ahora solamente tendremos que considerarla como una zona de
amortiguamiento donde el programa en ejecucin puede almacenar temporalmente
los datos. En el caso de Cortex-M3, esta zona de almacenamiento se duplica, y por lo
tanto el registro SP viene en dos versiones: PSP (SP_Process) o MSP
(SP_principal). Es importante sealar que, en cualquier momento dado, slo uno de
los dos paquetes es visible para el procesador. As que cuando se escribe a la pila como
en el siguiente ejemplo:
A lo largo de este registro, existen indicios de la estructura del programa, que sern
discutidos en el Captulo 7. Nos permiten descubrir, por ejemplo, 2.2, uno de los
mecanismos fundamentales: saltar a una subrutina.
Principales PROC
Aqu BL MyFirst ; Saltar a MyFirst
...
ENDP
....
MyFirst PROC
NOP ; ninguna operacin.
BX LR ; volver al programa llamante
ENDP
Este registro puede ser llamado "el puntero de instruccin", "el contador ordinal"
o "el contador de programa (PC)", pero tiene un papel nico: contiene la direccin de
memoria donde la siguiente instruccin a ser ejecutada es almacenada. El LSB de este
registro es (normalmente) en 0, suponiendo que las instrucciones se codifican en 16
bits (pulgar) o
32 bits (pulgar2), de modo que ocupen al menos dos direcciones consecutivas. Durante el
22 Assembly Language Programming The Core of Cortex-M3 22
En estas tres etapas (que son clsicas en una estructura de canalizacin) una
primera unidad upstream deben agregarse: la unidad de PreFetch. Esta unidad (que es
parte de la experiencia del brazo) existe esencialmente para predecir lo que suceder
durante la secuencia de saltos y a prepararse para recuperar la siguiente instruccin
por "buffering" sobre seis instrucciones por adelantado. Esta prctica optimiza la
velocidad del procesador.
2.2.5. La xPSR
registrarse
- APSR, con el significado de una aplicacin: este registro contiene las banderas
del procesador. Estos cinco bits son esenciales para el uso de operaciones
condicionales, pues las condiciones exclusivamente expresarse como una combinacin
lgica de estos indicadores. La actualizacin de estos es llevada a cabo por la mayora
de las instrucciones, siempre que el ndice S est especificado en el nombre simblico
de la instruccin. Estas banderas son:
- Indicador C (llevar): representa la "transportar" durante el clculo de las
cantidades fsicas (unsigned). Si C=1 y, a continuacin, hubo un desbordamiento en la
representacin no firmados durante la instruccin anterior, lo que demuestra que el
resultado unsigned es parcialmente falsa. El conocimiento de este bit permite trabajar
mucho ms precisas.
- indicador Z (cero): tiene un valor de 1 si el resultado es cero.
- El indicador N (negativo): copia el bit ms significativo del resultado. Si el
valor est firmado, siendo N 1, por lo tanto, indica un resultado negativo.
- Indicador V (oVerflow): si este tiene un valor de 1, se ha producido un
desbordamiento o subdesbordamiento de representacin firmado. firmado el resultado
es false.
- Indicador Q (indicador de saturacin pegajoso): slo tiene sentido para las dos
instrucciones de saturacin especfico USAT y SSAT: el bit se establece a 1 si estas
instrucciones han saturado el registro utilizado.
0x080001A4 B 0x080001A4
0x080001A6 NOP
0x080001A8 NOP
0x080001AA BX LR
Con el fin de escribir sus programas, necesitar definir los smbolos (una constante,
una etiqueta para identificar una lnea de cdigo, una variable, etc.). Tambin podemos
utilizar el trmino identificador para estos nombres definidos por el usuario. Ser
siempre un smbolo asociado a un valor numrico por el ensamblador y el linker: De
la misma manera que las directivas definidas anteriormente, un smbolo nunca ser
incluido explcitamente en el cdigo final. La legibilidad de los programas, por
naturaleza muy baja en lenguaje ensamblador, es, por tanto, directamente vinculada
a la semntica de los smbolos. Por lo tanto, es mejor ser generoso con los personajes
para hacerla ms explcita. Desde un punto de vista sintctico, un smbolo tambin
deben respetar las siguientes reglas para ser aceptados por el ensamblador:
27 Assembly Language Programming The Proper use of Assembly Directives 27
3.2. Estructura de un
programa
Un programa en lenguaje ensamblador debe tener por lo menos dos partes, al que
nos referiremos como secciones, que deben definirse en el listado por el rea directiva:
- una seccin de cdigo que contiene la lista de instrucciones.
- una seccin de datos donde podemos encontrar la descripcin de los datos
(nombre, tamao, valor inicial).
Desde el punto de vista del ensamblador, una seccin es una zona contigua de
memoria en la cual todos los elementos son de la misma naturaleza lgico
(instrucciones, datos y pila).
el cuerpo de la seccin:
Definiciones de los datos ...
o instrucciones, segn el caso
Hay otras opciones que, si necesitan ser colocados en su lugar, mostrar que han
alcanzado un nivel de especializacin ms all del alcance de este libro.
3.3.1. Etiquetas
Inf B Inf
Una versin de un salto sin condiciones est presente en la ltima lnea de este
ejemplo. La instruccin salta a la etiqueta que marca esa misma instruccin. Por lo
tanto corresponde a un bucle infinito.
Cuando colocamos una etiqueta en una lnea vaca, sirve para marcar la primera
instruccin (o trozo de datum) que le sigue. Para el ensamblador, las etiquetas son
equivalentes a las direcciones. El valor numrico de una etiqueta es el valor de la
direccin que representa. Esta etiqueta tambin puede ser la direccin de una
instruccin o una hoja de datos.
3.3.2. Nemotcnica
1 Este diagrama es extrado del brazo documentos comerciales y, por lo tanto, debe
entenderse como tal.
32 Assembly Language Programming The Proper use of Assembly Directives 32
3.3.3. Operando
s
Nos permiten modificar el programa anterior para que el valor inicial corresponde
al contenido de un byte denominado Bytinit. Como se sabe ahora, vamos a agregar la
declaracin de secciones a este programa.
;****************************************************************
; Seccin de datos
;****************************************************************
;****************************************************************
; seccin de cdigo
;****************************************************************
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; subrutina Main
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
Inf B INF
;*******************************************************************
34 Assembly Language Programming The Proper use of Assembly Directives 34
En este ejemplo (vase la figura 3.2), podemos ver que para modificar R3 con el
valor almacenado en el bloque de memoria denominado Bytinit, es necesario pasar a
travs de un registro adicional (R6). Este cdigo se recupera, en una primera etapa ( ),
la direccin de la variable (LDR, R6=Bytinit,). Luego, en una segunda etapa ( ) con el
"direccionamiento indirecto", CARGA R3 con el valor almacenado (LDRB R3, [R6]).
El registro R6, una vez inicializado, acta como un puntero a la zona de memoria que
se va a leer. Tambin podemos sealar que slo el byte menos significativo est
copiado, como la instruccin LRDB lleva a cabo la transferencia de un solo byte. Por
otra parte, la instruccin se refiere a la totalidad de la R3 registro, a fin de los 24 bits
ms significativos de este registro se establece en cero durante la transferencia. El
contenido final de la R3 de 32 bits registrarse es efectivamente equivalentes a los
nmeros sin signo almacenado en un byte en Bytinit.
3.3.4. Comentarios
3.3.5. Procedimi
ento
MyFunct PROC
...
ENDP
Tenga en cuenta que esta expresin puede ser un simple clculo literal. Por ejemplo
Espacio LotsOfWords 12*4+3 se reserva 51 bytes. El clculo es obviamente
37 Assembly Language Programming The Proper use of Assembly Directives 37
Existen diferentes directivas para crear zonas de memoria que contienen valores especficos
(inicializa las variables). A continuacin se muestra una lista con los
argumentos posibles:
REMARK 3.7.- Todos los valores sin signo pueden almacenarse en un formato ms
grande de lo que es estrictamente necesario para su tamao; slo tiene que aadir 0
delante de la bits tiles. El Ensamblador no puede saber a priori en qu tamao debe
cdigo la informacin.
Las otras cuatro directivas para especificar el tamao de la variable con la ltima
letra de la mnemnica: B = byte, W = media palabra (2 bytes), D = palabra (4 bytes)
y Q = doble palabra (8 bytes). Los datos se alinean por defecto: tipo W datum se inicia
en una direccin (incluso en 0 bit menos significativo), y tipo D y Q son datos sobre
modulo
4 direcciones (los dos bits menos significativos
en 0).
La opcin U significa que la alineacin es innecesario, sino que puede ser muy
peligroso! De hecho, el ensamblador alinea sus reservas en un siquiera abordar por
medio de palabras y doblemente incluso (divisible por 4) la direccin de palabras. Sin
embargo, esta alineacin no es estrictamente necesario. Cortex-M3 permite unaligned
accesos a la memoria. Dichos accesos no son en absoluto optimizado, ya que tendr
que hacer dos (lectura o escritura, dependiendo de la direccin de la instruccin) ciclos.
39 Assembly Language Programming The Proper use of Assembly Directives 39
3.5. Es que
todos los?
Alinear {expr}
Cuando el argumento expr debe ser un valor de cualquier potencia de 2 (a partir del 2
de0 a 232). Si expr no es especificado, su valor es de 2. Alinee se utiliza para datos de
posicin (o instrucciones) que siga esta directiva en un modulo expr direccin
alineada. La presente Directiva se inserta ceros (en la zona de datos) o instrucciones
NOP (en la zona de cdigo) con el fin de alinear el cdigo. Su utilidad es evidente
para resolver problemas unalignment memoria potencialmente mortales. El uso de
una alineacin 1 es posible pero no presenta ningn inters. ALIGN puede tomar otros
argumentos opcionales para insertar un desplazamiento adicional la alineacin.
Un ejemplo tpico del uso de esta directiva es que las reservas de espacio de
memoria para hacer una pila de usuario (tambin conocido como un montn). La
reserva se realiza por el espacio de la directiva, que no gestiona la alineacin. Si el
acceso a esta pila se utiliza nicamente para la lectura/escritura de 32 bits, est bien
para colocar la direccin base de la pila en un doblemente incluso valor. Ejemplo 3.7
muestra cmo esta reserva puede hacerse a travs de una alineacin forzada.
Dim EQU 64
Smbolo comn{{,tamao,alineacin}}
41 Assembly Language Programming The Proper use of Assembly Directives 41
Esta directiva nos permite reservar (marcada con el nombre de smbolo) una zona
de memoria comn el tamao (en bytes) y siempre alineados siguiendo la misma
sintaxis que el indicado para el uso de la esfera para la opcin de alineacin. Los
espacios de memoria as creados sern reservadas por el vinculador en una zona
establecida a 0 y agrupados. Esto significa que, en ltimo trmino, el vinculador slo
reservamos una sola zona comunitaria dentro de las cuales la ms importante zona
comn ser incluido. Una de las ventajas de tener esta directiva es optimizar la
administracin de la memoria en importantes proyectos, particularmente para la
asignacin de memoria dinmica en un sistema operativo.
Esta directiva nos permite reservar las ubicaciones de memoria con inicializacin
(expresin), como con las directivas DCB, DCD, pero en la zona de cdigo en lugar
de la zona de datos. Por ejemplo, podemos usar esta directiva para crear tablas de salto
para realizar accesos indexado a un conjunto de procedimientos (vase la seccin
6.2.4).
Requerir8} {bool
preservar8 {bool}
3Procedimient ; Cdigo
o1
; Cdigo
; Cdigo
; Cdigo
4Procedimient ; Cdigo
o1
; Cdigo
; Cdigo
3Otros ; Cdigo
3 ; Cdigo posible
demasiado...
; ... pero no muy
legible
B %3 ; rama a la etiqueta 3 ...
GET nombrearchivo
Filename INCBIN
Esto nos permite insertar (GET) el archivo nombre de archivo en el archivo actual.
En el caso de INCBIN, se supone que el archivo est binario ( datos sin procesar o un
tipo de archivo ejecutable .obj).
Mantenga el smbolo { }
43 Assembly Language Programming The Proper use of Assembly Directives 43
Las siguientes directivas nos permiten establecer las condiciones para la inclusin
de elementos de la lista en un proyecto. Qu significa esto? Supongamos que desea
desarrollar algn cdigo que puede ser desarrollado en varias versiones para un
sistema. Supongamos que el 90% del cdigo es comn a todas las versiones, y que el
10% restante corresponde a las opciones. Cmo podemos manejar esto? Cualquiera
que haya tantas versiones del proyecto como usted tienen versiones del sistema, o slo
tiene un proyecto en el que algunas partes slo se incluyen si, durante la fase de
montaje, indique qu versin es.
Principales PROC
Funcin BL1
;ooooooooooooooooooooooooooooooooo
Si la versin = "Clsico"
Funcin1 PROC
ENDP
;ooooooooooooooooooooooooooooooooo
Funcin1 PROC
44 Assembly Language Programming The Proper use of Assembly Directives 44
ENDP
ENDIF
;ooooooooooooooooooooooooooooooooo
Si Logic_Exp
; cdigo para incluir si Logic_Exp es true
Otra cosa
; cdigo para incluir cuando Logic_Exp es false
ENDIF
Lgica de ASSERT_Exp
45 Assembly Language Programming The Proper use of Assembly Directives 45
Nombre CN expr
Lo que nos permite inicializar reserva espacio en memoria para puntos flotantes.
Esto implica que el programa tiene acceso a las bibliotecas de clculo de punto
flotante y/o que una unidad aritmtica de punto flotante tipo coprocesador es
conectado a la estructura Cortex-M3.
Entrada
IMPORT EXPORT
Instr op1,o2{,op3}
REMARK 4.1.- Para la lectura (LDR (registro) de carga, etc.) y escribir (STR (STore
Register), etc) instrucciones (vase la seccin 5.7), los significados de los operandos
origen y destino estn invertidas. Esta es una fuente de error cuando un programa
fuente escrito en lenguaje ensamblador, aunque en el nivel de instruccin, podemos ver
una cierta lgica.
48 Assembly Language Programming Operands of Instructions 48
En la seccin 3.1.1, nos explica las reglas para construir un smbolo as como
aquellos para expresar valores numricos (con o sin expresin literal), vase la
seccin 3.4.1. La manera ms sencilla de usar una combinacin de estas dos es la
declaracin de una constante. Una constante es un smbolo con el que se asocia un
valor fijo. Por lo que cada vez el ensamblador encuentra este smbolo, sabe que
simplemente debera sustituir el smbolo con el valor asociado. Usted hara bien si se
utiliza la funcin Buscar/Reemplazar en el editor de texto normal. Mediante una
constante en una lista tiene dos ventajas principales. La primera es que hace que la lista
sea ms fcil de leer (que no debe ser considerada un lujo) y la segunda es que nos
permite , cuando la constante se utiliza varias veces en el archivo, para llevar a cabo
una modificacin del valor en un solo lugar en el listado. El mantenimiento y el
desarrollo del programa, de este modo, es mucho ms fcil.
El EQU (equivalente) la directiva nos permite definir estas constantes. Aqu estn
algunos ejemplos:
El EQU declaracin no tiene ninguna consecuencia local, tan largo como el tercer
campo es una expresin que corresponde a un nmero entero de 32 bits constante1.
Una cadena como el uno en la ltima lnea del ejemplo es imposible. Es necesario
estar alerta cuando se utiliza una constante en el resto de la lista, especialmente si se
trata de acceso a valores inmediatos, como los que trataremos en la siguiente seccin.
En efecto una instruccin como MOV
R0, verdadero donde verdadero es el constante declarada en el ejemplo 4.1, corre
el riesgo de ocasionar graves problemas, sobre la que volveremos.
1 Una etiqueta, como en la quinta lnea, corresponde a una direccin y por lo tanto tiene un
valor determinado de 32 bits.
49 Assembly Language Programming Operands of Instructions 49
La directiva RN (ReName) tambin puede hacer que la lista sea ms legible (aunque):
Nombre RN N
4.2.1.1. Registros
generales
En la mayora de instrucciones (y los ejemplos presentados aqu seguir este
enfoque), el programador se utilizan principalmente los registros generales
de R0 a R12 para almacenar los valores con los que l o ella lleva a cabo las instrucciones
comunes. Como tales, los registros podran considerarse las variables locales. Registros
generales son, pues, los operandos ms comunes que nos encontramos en un programa.
Pueden contener cantidades que expresan valores de muy distinta naturaleza (un entero
de 8 bits para el cdigo ASCII de un carcter, un entero sin signo de 16 bits para un
ndice de matriz, un entero firmado para un desplazamiento relativo en el programa,
etc.). Cualquiera que sea el caso, los 13 registros siempre ser visto por el procesador
como una cantidad codificada en 32 bits. El programador se enfrenta a dominar todo
el contenido de un registro cuando la informacin que l o ella est tratando con slo
contiene la mitad o una cuarta parte de ella.
Desde el punto de vista de codificacin, puede ser interesante ver lo que el cdigo
generado por el ensamblador parece. Tomemos la simple adicin
instruccin AGREGAR R0,R1 como un ejemplo. Esto agrega el valor contenido en los
dos registros y almacena el resultado en R0. Este resultado es a priori del pulgar tipo.
Su codificacin (y por lo tanto, lo que se almacena en la memoria de cdigo) es de 16
bits y su
Pasar de 16 a 32 bits, una operacin aritmtica slo realmente representa una carga
adicional de dos bytes de la memoria, sino que tambin significa un aumento de 100%
en el tamao del cdigo. Si estamos tratando de optimizar el uso de la memoria, puede
ser til recordar esto y evitar llevar a cabo operaciones que utilizan los
registros R8 a R12 tanto como sea posible.
51 Assembly Language Programming Operands of Instructions 51
Que apenas deja todos los dems registros que podemos encontrar en
un controlador (es decir, todo excepto el ncleo del procesador), y hay un montn!
En Cortex-M3 pertenecen al mundo exterior; todo este espacio de memoria slo es
accesible por cargar/guardar instrucciones. Vamos a ver en unas cuantas secciones
cmo acceder a ella. Tales registros no ser nunca operandos para instrucciones
comunes.
52 Assembly Language Programming Operands of Instructions 52
4.2.1.3. Shift
En el conjunto de instrucciones, al menos en la parte extendida de 32 bits (pulgar-
2), existe la opcin de imponer un cambio en el ltimo operando de origen. En el
ejemplo 4.2, lgico y se lleva a cabo: R0 y R1 (R2 <<3). Tenga en cuenta que el
sufijo S en la instruccin slo muestra dnde se colocarn las banderas para la
ejecucin.
Ys.W R0,R1,R2,LSL #3
En cada caso, los ndices I, j y k son enteros entre 0 y 12, y n es un nmero entero
entre 1 y 31. El cambio lgico introduce ceros a la derecha o a la izquierda. El
desplazamiento aritmtico reintroduce el bit ms significativo (por lo que el bit de
signo) a fin de evitar la prdida de la firma de la representacin de un nmero.
Rotacin copias bit a bit[0][31] con cada vuelta. Por ltimo, realiza una sola RRX 33
bits, rotacin de la 33 C la bandera.
REMARK 4.2.- El ejemplo anterior en realidad slo muestra tres operandos. De hecho,
el R2,LSL#3 slo es considerado uno de los operandos. Esta observacin es de menor
inters semntico.
3 Esta posibilidad est limitada a los 16 siguientes instrucciones aritmticas: ADC, agregar y,
BIC, CMN, CMP, EOR, Orn, ORR, RSB, SBC, SSAT, SUB EQT, TST y USAT.
53 Assembly Language Programming Operands of Instructions 53
Brazo ofrece dos soluciones para este problema. La primera solucin parcial
implica el uso de registrar los cambios. Por ejemplo, la adicin de R0 a la inmediata
valor 0xff100 es imposible. No obstante, es posible cargar R1 con 0xFF10 y
agregar R0 a R1<<4.
Ahora no hay ningn problema en el lado del montador. Pensamos que podemos,
con sintaxis ligeramente diferente, utilice un operando inmediato. En realidad
el verdadero cdigo cargado para esta instruccin, en el sentido de que nos
encontraramos en una operacin de desmontaje, se ve algo como ejemplo 4.5.
Una instruccin como LDR Ri =expr, donde expr es un valor expresado en alguna
base o de otro tipo, es un pseudo-instruccin. Dependiendo del valor de expr, el
ensamblador generar diferentes de codificacin:
- Si expr puede ser codificados en 8 bits, la instruccin mov Ri, #expr;
55 Assembly Language Programming Operands of Instructions 55
Que pueda ser utilizada. Si no se cumplen estas dos condiciones, se crea esta
constante en el Literal siguiente Pool.
;*************************************************************
******
; seccin de cdigo
;*************************************************************
******
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Procedimiento principal ;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DoNothing PROC
BX LR ; ... y volver
ENDP
; la seccin final
ENDP
;*******************************************************************
57 Assembly Language Programming Operands of Instructions 57
Sin embargo, an es posible para el final de la seccin a ser demasiado lejos para
considerar esta manipulacin implcita. Tambin existe la opcin de forzar la creacin
de una zona de almacenamiento utilizando la directiva LTORG.
{expr} es una expresin que nos permite calcular la direccin donde el valor que se
va a establecer como valor de Ri sern ledos (LDR) o donde el valor contenido en el
registro Ri ser almacenado (STR). Algunas notas importantes sobre esta sintaxis:
- esta expresin siempre contiene al menos un registro general. Generalmente se
llama la base registrarse porque va a definir una direccin base a partir del cual se
producir de acceso a la memoria.
- el concepto y el significado habitual de origen/destino operandos para
instrucciones comunes no se aplica aqu.
- el registro base puede cambiar (incremento o decremento) con la ejecucin de la
instruccin. Las diferentes posibilidades de estos cambios reflejan los modos de
direccionamiento.
- el uso de estas instrucciones es necesaria en el curso de un programa, pero ellos
son los que causan ms problemas. De hecho, si a consecuencia de una mala
manipulacin, el registro base contiene un valor incorrecto y un bug est garantizada.
58 Assembly Language Programming Operands of Instructions 58
{expr} contiene al menos un registro que contiene la direccin base. Por lo tanto,
aqu nos encontramos con el concepto de un puntero que encontramos en un nivel
superior de la estructura del lenguaje. En lenguaje ensamblador, lo ms a menudo
utilizan trminos de direccionamiento indirecto. El principio ya ha sido ilustrada
mediante la LDRB R3,[R6] instruccin presentada en la Figura 3.2. R6 es un puntero
que por tanto (por la propia definicin de un puntero) contiene una direccin en la que
el procesador puede leer una instruccin para modificar el destino operando (R3 en
este ejemplo). El uso de corchetes ([ y ]) alrededor del nombre de registro nos permite
indicar al ensamblador que estamos interesados en el contenido de la direccin
almacenada en el registro, en lugar de contenido del registro en s. El
nemotcnico LDRB fue usada en este ejemplo; el procesador, por lo tanto, slo leer
un byte que considere unsigned (LDRSB le permite tomar en cuenta el signo). De esta
manera, los tres bytes ms significativos sera 0, de forma que el valor de 32 bits
eventualmente contenidos en R3 se corresponde con el valor de 8 bits que figura en la
direccin de origen. En este caso, estamos hablando de promocin sin firmar (firmado
en la promocin, el bit ms significativo sera copiada en los 24 bits ms significativos
del registro de modo que los valores de 8 bits y 32 bits corresponden a la misma
cantidad firmado).
4.3.2. Modos de
direccionamiento
Existen otros tres modos de direccionamiento, sin embargo, para que este vnculo
es menos directa. En cuanto a la sintaxis presentada anteriormente, la explicacin de
estos modos de direccionamiento se ilustra a travs de la instruccin para cargar una
media palabra a un registro, pero estos modos son tambin para escribir (STRH) y para
las diferentes variaciones de la nemotecnia LDR y STR.
Figura 4.6. Transferencia: (a) con compensacin inmediata; (b) con el ndice
61 Assembly Language Programming Operands of Instructions 61
Con este modo, es bastante fcil de codificar un algoritmo mediante una tabla:
todo lo que tenemos que hacer es poner la direccin de la tabla en el registro Rn y el
ndice de la tabla en la Rm registrarse.
REMARK. 4.3.- Cuando queremos acceder a la n -sima componente de una tabla tpica,
es conveniente utilizar el operador de desplazamiento como se presenta en la sintaxis
anterior. As, para una tabla que contiene enteros largos codificada en cuatro bytes,
colocando R6 en la direccin de esta tabla y poniendo un valor k en R1, la instruccin
LDR [R3, R6, R1, LSL#2] nos permite leer los kth elemento de la tabla.
As, la ejecucin tiene dos efectos sucesivos: la asignacin del registro Rt con el
contenido de la direccin almacenada en el registro Rn, luego la modificacin del
puntero como sigue: Rn Rn imm8.
62 Assembly Language Programming Operands of Instructions 62
REMARK 4.5.- Es importante elegir una buena fuente para el editor de texto de forma
que no se pierda el "!" que sigue a los soportes.
Conjunto de
instrucciones
REMARK 5.1.- W significa palabra pero a veces (como en este captulo), esto
significa que una cantidad de 32 bits y algunas veces (como en el caso de la
directiva DCW) una cantidad de 16 bits. En otros lugares los
Cantidad de 16 bits puede ser caracterizada por el uso de unsemi-H ( Word) o mediante el uso
de
.n, tal como se ha explicado anteriormente. No es terriblemente complicado, pero es
terriblemente incmodo y una fuente de particularmente molesto pequeos errores:
- para muchas instrucciones es posible aadir un sufijo que luego nos permite
condicionar la ejecucin de la instruccin. La opcin de agregar este sufijo se muestra
en la tabla por el smbolo <c>. La adicin de este sufijo no es sin consecuencias para
el cdigo generado por el ensamblador porque esto equivale a insertar una instruccin
en frente de la instruccin propiamente dicha. Por lo tanto, es necesario recordar esto,
especialmente durante el desarrollo de las secuencias en las que esta instruccin puede
aparecer incluso si el programador no ha escrito explcitamente. Tambin es necesario
recordar que el condicionamiento es relativa al estado de las banderas, que en s
mismos son generalmente asignado por la instruccin anterior que s debe ser
condicionada. La lista de sufijos est dado por la tabla 5.1 con las condiciones y la
lgica Combinacin de indicadores relativos a cada condicin;
- para varias instrucciones, es necesario hacer la distincin entre las menos
importantes y ms significativos los bits del operando. En aras de la portabilidad, las
abreviaturas LSB (bit menos significativo) y MSB (bit ms significativo) se han
utilizado para hacer esta distincin.
- Para las instrucciones comunes el primer operando es presentada a menudo como
siendo opcional. En las siguientes tablas se describen las diferentes instrucciones,
esto generalmente se muestra mediante un {Rn} para el destinatario operando. Si el
destinatario no est operando de forma explcita , sin embargo, dado el primer
operando se comporta como el origen y el destino a la vez. Por ejemplo, en Agregar
R0,#2, el registro R0 es el origen y el destino y
Esta instruccin significa R0R0+2.
Tabla 5.1 corresponde a las posibles sustituciones para el smbolo <c>. Cabe
sealar que esto se aplica tambin a las instrucciones de salto (B, BL, BX, etc.)que
luego son condicionados. En el caso de sucursales de estas instrucciones, la
instruccin no se inserta antes del salto.
= EQ EQ
< MI LO
LE LS
> GT Ho
GE la
HS
SSAT 32 Saturacin
firmado
SSAT<c> <rd#><imm5><Rn>{<Mays>} Si (Rn < 0) Rd
Min(-2(imm5-1),Mayus
(Rn)
Si (Rn >0) Rd
imm5-1
Max(2(
La bandera est configurada para q yo si ha ) - 1,Mayus
habido saturacin, de
(Rn)
lo contrario, permanece inalterado. La bandera q se puede ajustar
a 0 antes de la operacin, a fin de explotar esta informacin. La
saturacin es una importante operando
Algoritmos para trabajar en la representacin de un punto
fijo.
69 Assembly Language Programming Instruction Set 69
Y 16/32 Y lgico
Y{S}<c> {<Rd>} <Rn> # <const.> Rd Rn y const.
Y{S}<c> {<Rd>} <Rn> <Rm> {<Mays>} Rn Rn y shift(RM)
RBIT 32 Transposicin de
bits
RBIT<c> <Rd> <Rm> Rd[31-k] Rm[k] con k = 0 ... 31
REV16 16/32
Reversin de las MSBs y LSBs media
palabra
REV16<c> <Rd> <Rm> Rd[31 : 24] Rm[23 : 1]
Rd[23 : 16] Rm[31 : 24]
Rd[15 : 8] Rm[7 : 0]
Rd[7 : 0] Rm[15 : 8]
Vase el comentario sobre el REV instruccin.
Lectura de un registro
La 32
especial
Sra. (Mover a registro
La Sra.<c> <Rn><spec_reg> Rn especial)
spec_reg
Los registros especiales
son:
APSR, XPSR, IPSR, EPSR, PSP, MSP, BASEPRI PRIMASK,
FAULTMASK, CONTROL BASEPRI_MAX y control.
El uso de esta instruccin requiere Cortex-M3 para ser configurados
con un nivel de acceso privilegiado (vase la seccin 2.2).
76 Assembly Language Programming Instruction Set 76
Escribir en un registro
MSR 32
especial
MSR<c> <SPEC_reg><Rn> (Mover al registrarte en Rn
Spec_reg
especial)
Los registros especiales
son:
APSR, XPSR, IPSR, EPSR, PSP, MSP, BASEPRI PRIMASK,
FAULTMASK, CONTROL BASEPRI_MAX y control.
El uso de esta instruccin requiere Cortex-M3 para ser configurados
con un nivel de acceso privilegiado (vase la seccin 2.2).
Caso de Cortex-M3, no existe tal cosa, ya que slo el pulgar (y su extensin pulgar2)
existe. Cinco instrucciones, sin embargo, requieren poco[0] a ser 1 para funcionar
correctamente. Estas son las instrucciones BLX, BX, LDR, POP y LDM, las tres ltimas
slo se preocupa cuando se modifique el PC. Durante la ejecucin de esas
instrucciones, y por tanto durante la asignacin del puntero de instruccin, el LSB se
borrar y as la direccin rendezvous ser an.
Tabla
El DCB 0 ; Primer caso siguiente instruccin TBB
El DCB (caso2-caso1)/2 ; el nmero de bytes a saltar para llegar a caso 2
El DCB (caso3-caso1)/2 ; el nmero de bytes a saltar para llegar a caso 3
ADR R4,la tabla ; la recuperacin de la direccin de la tabla
TBB [R4,R1] ; suponemos que el ndice se almacena en R1
Caso 1 AGREGAR R5, R8 ; Caso 1: adicin
B Finalizar ; equivalente a romper en C
Caso 2 sub- R5, R8 ; en el Caso 2: la sustraccin
B Finalizar ; equivalente a romper en C
Caso 3 SBC R5, R8 ; Caso 3: sustraccin invertida
B Finalizar ; equivalente a romper
en C Finalizar ; Resultado de programa
Esta tabla muestra que la lectura distingue entre nmeros firmados y no firmados.
De hecho, como todos los 32 bits de un registro son asignados sistemticamente
durante la carga (la lectura), es necesario que el procesador para saber cmo debe
llenar el 16 (o LDRH LDRSH) o 24 (LDRB o LDRSB) bits ms significativos del
registro. La tcnica de llenado es diferente segn si el nmero representa una cantidad
firmado (cuando decimos firm el ascenso, el bit de signo se copian en el ms
significativo de los bits para ser promovido) o una cantidad sin firmar (unsigned
promocin llena estos bits con ceros). En el escrito, este problema no aparece como
el 8, 16 32 bits del registro se copian tal y como estn y ocupan el mismo espacio
en memoria que ocupan en el registro.
REMARK 5.2.- llaves en esta sintaxis, a diferencia de lo que ocurre en el resto de las
instrucciones, no indican una caracterstica opcional. Es la sintaxis requerida para la
lista de registros. Otro, ms imparable, La trampa est en la LDM, STM, y LDMDB
STMDB instrucciones, donde la Rn register se comporta como un puntero, pero no es
necesario ponerlo entre corchetes ([Rn]). Con respecto a la instruccin no es ilgico
(no es posible llenar un registro con el contenido de varios registros), pero para el
programador esto requiere mucha flexibilidad mental.
El registro que contiene la direccin base no puede ser parte de la lista de registros.
Sin embargo, puede ser el SP. Esto es muy til cuando se realizan un contexto
Save/Restore, mientras que la tramitacin de una interrupcin, por ejemplo. El PC
(R15) registro puede ser incluido en la lista, que no es sin consecuencias durante la
carga como esto es equivalente a realizar un salto. Por lo tanto, utilizarse con gran
precaucin.
Instrucciones descritas aqu como "sistema" las instrucciones que nos permitan
actuar sobre el estado del procesador. Los "otros" se incluyen instrucciones utilizando
un hipottico coprocesador o gestionar la depuracin de secuencias. En cualquier caso,
stas slo son tiles en un enfoque detallado para el funcionamiento del ncleo Cortex-
M3 y, por consiguiente, quedan fuera del alcance de este libro. Una lista simple se da
aqu. El usuario avanzado encontrar completa informacin en los manuales de
referencia DEL BRAZO [06a, brazo 06c].
Sistema...
#<BKPT imm8> Pide una excepcin de
CPD,CPD2 .... depuracin
Lanza una instruccin sobre un
CLRX Suprimecoprocesador
la exclusividad del procesador.
Cambia el estado de Cortex-M3
CPS <efecto><banderas>
modificando y FAULTMASK PRIMASK
DBG><c # <option> Lanza una solicitud Trace o
DMB<c> # <option> Debug
La instalacin de una barrera de
acceso a la memoria
La instalacin de una barrera de
Osd<c> # <option>
acceso a la memoria
ISB<c> <opc.> con la sincronizacin
Vaca la canalizacin del
LDC, LDC2 ... procesador
Leer (memoria de) un coprocesador
LDRBT,LDRHT,LDRT Escribaregistrarse
(sin firma) de memoria en modo sin
LDRSBT,LDRSHT privilegios
Leer (firmado) de memoria en modo sin
STRBT,STRHT,STRT privilegios
Escriba (sin firma) de memoria en modo sin
STRSBT,STRSHT privilegios
(Firmado) Escritura de la memoria en modo
LDREX,LDREXB,LDREXH sin privilegios
Leer (unsigned) de memoria en modo
STREX,STREXB,STREXH exclusivo.
Escriba (sin firma) de memoria en modo
De MCR, MCR2 exclusivo. Escribir un coprocesador
registrarse
86 Assembly Language Programming Instruction Set 86
Algoritmos y estructuras de
datos.
Por tanto, preferimos alentar un anlisis de rbol, conocido como anlisis modular
en la que cada programa est formado exclusivamente por una sucesin de elementos
celulares, genricamente llamados mdulos, cada mdulo en s una serie de sub-
mdulos, etc. en el nivel ms bsico, llegamos a la idea de un lenguaje estructurado
compuesto de instrucciones que, al igual que los mdulos, slo tiene un punto de
entrada y un punto de salida. De esta manera es posible obtener lenguaje estructurado
cuando se programa correctamente.
88 Assembly Language Programming Algorithmic and Data Structures 88
Eleccin est motivada por el hecho de que la instruccin slo puede acondicionar un
mximo de cuatro instrucciones, por lo que no es una respuesta definitiva al problema.
Lo que es ms, no nos permiten abordar los problemas estructurales, que son
necesarias para avanzar hacia un mtodo sistemtico de la programacin. No
obstante, es cierto que el uso de la instruccin puede ser una respuesta eficaz que es
para poner en marcha rpida y eficiente en trminos de tamao de cdigo y por lo
tanto no debe ser olvidado completamente.
6.2. Estructuras
alternativas
Entrada_Point
Si Val_CMP,val_2
... ; para
... ; el tratamiento
Exit_Point ...
Unejemplo PPLIED 6.1.- Tome el valor absoluto de una firma (32-bit) entero
contenida en el registro R1:
Si entero < 0
Luego -Integer Integer
End If
Estudio de la condicin: cond es "<", es decir, firmado LT, as que no(cond) es "
firmado", o GE (firmado es mayor que o igual a). Podemos codificar esta como
sigue:
Entrada_Point
CMP, R1#0
Exit_punto ...
Si
Entonces el tratamiento_luego
(cond)
Entonces el tratamiento_else
Else
End If
Esto demuestra el caso del trato exclusivo. Para representar esta estructura
algortmica, podemos utilizar no(cond) tan bien como hemos visto por la alternativa
simple, cond.
Si entero < 0
A continuacin, R0 @ mensaje negativo
Otra cosa
A continuacin, R0 @ mensaje positivo.
End If
Pantalla(R0)
;*************************************************************
; Seccin de datos
; Zona*************************************************************
MyDATA, datos, ALIGN=0
;************************************************* ************
Message_Pos "DCB es estrictamente positivo, 10,13,0 "
Neg_Mensaje "DCB es negativo o nulo", 10,13,0
;*************************************************************
; seccin de cdigo
;******************************************************** *****
MyCode, cdigo de rea, readonly, ALIGN=2
;*************************************************************
...
Entrada_Point
Lab_Si SXHT R3,R4 ; 32 bits firmado
ampliar
CMP, R3#0 ; comparacin en 0
BGT, Lab_else
Lab_luego LDR, R0=Mensaje_Neg ; R0 @ Message_Neg
B Exit_Point ; la evitacin del
bloque Else
Lab_else LDR, R0=Mensaje_Pos ; R0 @ Message_Pos.
Exit_Point BL DispStr ; la pantalla Llamada
a procedimiento
...
93 Assembly Language Programming Algorithmic and Data Structures 93
Pasando por el registro R3, la extensin del entero firmado para ser probado en
32 bits podran evitarse usando un 16-bit shift derecha o mediante pruebas
(TST instrucciones)
Slo los bits firmado (peso 15) del entero.
Exit_Point
BL DispStr ; llamada al procedimiento
de visualizacin
...
Si variable= valor_0
Entonces el tratamiento_0
Else If variable = valor_1
Entonces el tratamiento_1
Else If variable = valor_2
Entonces el
tratamiento_2
(etc.).
Else default_tratamiento
95 Assembly Language Programming Algorithmic and Data Structures 95
EJEMPLO 6.6.- estructura Switch Case tratada como una cadena de estructuras IfThen
Entry_punto ...
MOV R4,ref_variable
Lab_Switch CMP, R4#value_0
BNE Ver_Uno ; cond = EQ, por lo que no(cond) = NE BL tratamiento_0
B Exit_point ; final de
tratamiento => Salir ! Ver_One CMP,
R4#value_1
BNE,VER_2
Tratamiento BL_1
B Exit_point ; final de
tratamiento => Salir ! Ver_DOS CMP,
R4#value_2
BNE,ver_Default
Tratamiento BL_2
B Exit_point ; final de tratamiento => Salir !
Ver_Default
BL default_tratamiento
Exit_punto ...
El salto incondicional Punto B_Exit que finaliza cada clusula Then nos
permite salir de la estructura Switch Case: el equivalente en C es la instruccin break.
Tratamiento_Default PROC
97 Assembly Language Programming Algorithmic and Data Structures 97
...
BX LR ; Volver al llamador
Tratamiento_Default ENDP
;************************************************************
*
; Seccin de datos
;
Zona*****************************************
******************** MyData, datos, ALIGN=0,
READONLY
;****************************************************
********* jump_Tabla_0 Tratamiento DCD,
tratamiento_Default ; de 0 y 1.
Tratamiento de la DCD_2, el tratamiento_Default ; para 2 y 3
Tratamiento de la DCD_Default_Default Tratamiento ; para 4 y 5
Tratamiento de la DCD_6 ; para 6
;*************************************************************
A continuacin, default_tratamiento
Switch Case Else (variable)
final Switch Case
End If
Repita
Tratamiento
Hasta (cond)
Entrada_Point
Una vez ms, la decisin de salto es establecido por la (no)cond. Podemos superar
esto, sin embargo, expresar el algoritmo como una repeticinAunque. La condicin
de salto se convierte entonces en la misma condicin que el texto. Lo que es importante
en la identificacin de esta estructura es que la prueba se realiza al final de la
estructura. Por lo tanto, el tratamiento se lleva a cabo al menos una vez.
Ptr @Table
Ptr_end @End_Table
Repita
*(Ptr) 0
Ptr Ptr + 2
;*************************************************************
; Seccin de datos
;
Zona***********************************************
************** MyData, datos, ALIGN=0
;********************************************************
***** tabla rellenen 24,0xff,2 ; el llenado de 12 palabras de media
; inicializado para 255
End_Table ; simple etiqueta para
; Marca el final de la tabla
;*************************************************************
; seccin de cdigo
;********************************************************
***** MyCode, cdigo de rea, readonly, ALIGN=2
;********************************************************
***** LDR, R0 = Tabla ; carga de PTR
LDR R5, =End_Table ; carga de PTR_end
MOV R2#0 ; variable local para limpieza
Entrada_Point
Repita STRH R2,[R0] ; supresin de corriente
; valor apuntado
Agregar R0,#2 ; el incremento del puntero
CMP R0,R5 ; prueba de no(cond)
BLT Repetir ; Saltar si tabla_end no alcanzado
Exit_punto ...
;*************************************************************
El cdigo sugerido puede ser optimizado. En efecto un solo indirecto se utiliza para
llevar a cabo la eliminacin. Por lo tanto, supone un incremento "manual" del puntero,
pero el conjunto de instrucciones tiene un post-desplazados el modo de
direccionamiento. Las dos primeras lneas de la repeticinhasta que la estructura
puede ser sustituido por una sola lnea que integra el incremento del puntero: STRH
R2,[R0],#2.
Ptr @Table
contador 10
Repita
*(Ptr) -(*(Ptr)
PTR Ptr + 1
CONTADOR contador - 1
Hasta 0 (contador)
;*************************************************************
; Seccin de datos
; Zona************************************************************* MyData,
datos, ALIGN=0
; Tabla***************************************************
********** DCB 12,0x23,-3,24 ; reserva de 12 bytes
El DCB -56,0xAB,0,0 ; inicializado con diversos valores.
1,2,5,9 DCB
Llenar 10,0XE4,1 ; seguido de 10 bytes
; inicializado a 0XE4
;*************************************************************
; seccin de cdigo
;*************************************************************
MyCode, cdigo de rea, readonly, ALIGN=2
LDR, R0 = Tabla ; carga de PTR
MOV R11, #10 ; la inicializacin del contador
Entrada_Point
Repita LDRB R2,[R0] ; Recuperacin del valor sealado actual
NEG R2,R2 ; signo inversin
STRB R2,[R0],#1 ; volver a escribir con post-desplazados
SUBS R11,#1 ; Decremento del contador
; con asignacin de bandera
102 Assembly Language Algorithmic and Data Structures 102
Programming
...
LDR, R0 = Tabla ; carga de PTR
MOV R11, #9 ; la inicializacin del contador
Entrada_Point
Repita LDRB[R2, R0, R11] ; Recuperacin del valor sealado actual
NEG R2,R2 ; signo inversin
STRB[R2, R0, R11] ; volver a escribir con la indexacin
SUBS R11,#1 ; Decremento del contador
; con asignacin de bandera
BGE Repetir ; Saltar si menos de 10 tratamientos
Exit_punto ...
La forma genrica
es:
Mientras (cond) el
tratamien
to
Fin mientras
103 Assembly Language Algorithmic and Data Structures 103
Programming
Es posible construir una hasta que bucle utilizando no(cond). En este caso,
expresando el algoritmo como hasta (cond) es posible construir general
codificacin con la misma prueba de lenguaje ensamblador que se establece en el
algoritmo.
Entrada_Point
Lab_mientras CMP Val_1,val_2
B Exit_point ; corresponden a no(cond)
... Instrucciones ;
... ; de
... ; Tratamiento
B Lab_mientras
Exit_punto ...
;****************************************
;* Procedimiento de visualizacin de una cadena
;* de entrada : puntero en la cadena : R0
;* Salir : ninguno
;* Utilice el procedimiento DispChar
;*******************************
********* DispStr PROC
Empujar
{LR}
Empujar {R1}
ENDP
Otro registro es guardado: el enlace Registrar (LR). De hecho, esta rutina tambin
exige un procedimiento (BL Dispchar) este registro ser borrado por la nueva llamada.
Por lo tanto, es necesario para salvar a nosotros mismos. Esto sucede en el empuje
inicial. En el otro lado no hay equivalente simtricos, es decir, POP LR. Tampoco
existe un BX LR. Estas dos lneas son sustituidos por POP PC, que nos permite llevar
a cabo la restauracin y el retorno al mismo tiempo. Volveremos a este punto
especfico en el Captulo 9.
La prueba es reportada al final del bucle. A tal fin podrn realizarse al comienzo
del bucle, un salto incondicional comienza la estructura. La ventaja de esto es que
podemos obtener comenzando con una codificacin que no prueba cond (cond). Esto
se traduce en una ligera prdida de legibilidad, ya que la prueba se coloca despus de
la estructura, incluso si se lleva a cabo antes de ella.
Los dos stackings estn comprimidos en una sola instruccin por empujar {R1,LR}.
Simtricamente los dos unstackings son sustituidos por POP{R1,PC}. Ser consciente
del orden en el que se especifique la lista de registros!
DispStr PROC
Empujar {R1,LR}
B Lab_Cond
Var Val0
Mientras (Var1) No Val
Tratamiento
var var + K
Hasta el final
REMARK 6.4.- el bucle For existen? En algortmica, sin duda alguna! En lenguaje
ensamblador, esto es menos evidente porque aqu, en cualquier caso, se transforma en
un tiempobucle Do. Hay otros procesadores (los de Intel o de Freescale, por
ejemplo), sin embargo, que tener una instruccin integrada que reduce un registro y
saltar a una etiqueta si el decremento no da un resultado cero, permitiendo la
codificacin directa de una estructura.
6.4 Condiciones
compuesto.
Las estructuras y los ejemplos que hemos tratado hasta ahora siempre han tenido
las condiciones individuales. En la prctica, a menudo es necesario cambiar a
condiciones compuestas, como por ejemplo:
Si (cond_A y cond_B)
Entonces el tratamiento
End If
Si (cond_A)
Entonces si (cond_B)
Entonces el tratamiento
End If
End If
Entrada_Point
Lab_Si CMP var,val_A ; Evaluacin de cond_A
B Exit_Point ; corresponden a no(cond_A)
Lab_luego_A CMP var,val_B ; Evaluacin de cond_B
B Exit_Point ; corresponden a no(cond_B)
108 Assembly Language Algorithmic and Data Structures 108
Programming
Repita
Tratamiento
Hasta (cond_A y cond_B)
Entrada_Point
Repetir las instrucciones ;
... ; de
... ; Tratamiento
CMP var,val_; Evaluacin de cond_A
B Exit_point ; corresponden a no(cond_A) CMP
var,val_B ; Evaluacin de cond_B
B Exit_point ; corresponden a no(cond_B) B Repeat ;
Loop en repetir la etiqueta
Exit_punto ...
...
REMARK 6.6.- la condicin de salida del bucle puede, en este caso, ser tan bien
expresado como mientras [no(cond_A) o no(cond_B)].
Si (cond_A O cond_B)
entonces el
tratamiento
End If
Si (cond_A)
Entonces el tratamiento
Else If (cond_B)
entonces el
tratamiento
End If
Entrada_Point
Lab_Si CMP var,val_; Evaluacin de cond_A
B Tratar ; corresponden a (cond_A)
Lab_Else CMP var,val_B ; Evaluacin de cond_B
B Exit_point ; corresponden a no(cond_B)
Tratamient
o
... Instrucciones ;
... ; de
... ; Tratamiento
Exit_Point
REMARK 6.7.- debemos tener en cuenta que con esta composicin es directo y natural
que probamos cond_A y no su opuesto. Este esfuerzo no durar mucho, ya que
no(cond_B) viene detrs tan naturalmente.
Repita
Tratamiento
Entrada_Point
Repetir ... Instrucciones ;
... ; de
... ; Tratamiento
CMP ; Evaluacin de cond_A
var,val_B Exit_ ; corresponden a (cond_A)
Pointvar,val_B
CMP ; Evaluacin de cond_B
B Repetir ; corresponden a no(cond_B)
Exit_Point
REMARK 6.8.- lgebra booleana nos muestra que hasta (cond_A O cond_B) = mientras
[(NO(cond_A) y no(cond_B)].
Permtanos ilustrarlo con el caso de una matriz de tres filas y cuatro columnas:
La fila por fila arreglo se almacenan en orden creciente de direccin como sigue:
Un0, Un0, Un0, Un0, Un1, Un1, Un1, Un1, Un2, Un2, Un2, Un2,
0 1
Direccin 2
base 3 0 1 2 3 0 1 2 3
Un0, Un1,0 Un2,0 Un0,1 Un1,1 Un2,1 Un0,2 Un1,2 Un2,2 Un0,3 Un1,3 Un2,
0 3
Direccin
base
6.5.3. Inscripcin
Uso temporal del espacio (el momento de la ejecucin del procedimiento) en la pila
del sistema; esta zona de almacenamiento se perdern cuando el programa regrese al
procedimiento.
Fuera del caso de asignacin dinmica, las variables se dice que es esttico: llaman
a una tabla permanente, la reserva se hace con antelacin (Espacio, relleno, etc.) y el
tamao del espacio de memoria reservado es fijo. Por lo tanto, debemos reservar un
lugar en la memoria que nos permitir recibir la tabla ms grande que podramos
esperar.
Un segundo problema que aparece aqu. Dado que la tabla es de tamao variable,
de qu tamao es por el momento nos interesa? Hay dos formas de mostrar el tamao
de una tabla:
- En primer lugar, creamos una estructura donde el primer campo contiene el
tamao actual de la tabla.
- La segunda es la propia tabla.
REMARK 6.10.- debemos recordar para reservar un lugar de memoria para el elemento
de marcador en el extremo de la mesa, con el fin de n elementos utilizando una tabla
necesitamos espacio para n+1 elementos.
6.5.5. Cola
Una cola es una FIFO (primero en entrar, primero en salir) estructura de datos.
Los elementos de la cola, que generalmente son todos del mismo tipo, se colocan en
posiciones contiguas en la memoria. Para gestionar la cola, usamos los dos
registros, Rt y Rq, donde Rt apunta a la cabeza - el primer elemento de la cola - y Rq a
la posicin libre que sigue al ltimo elemento de la cola. La absorcin se realizan a la
cabeza de la cola y adiciones al final. Para elementos de 8, 16 o 32 bits, utilizamos el
post-desplazados el modo de direccionamiento para aadir ({Rq]#<imm>) y retirar
([Rt]#<imm>) elementos.
La desventaja de esa cola es que solo crece hacia la creciente direcciones como se
utiliza. Esto significa que se producen con frecuencia una cola circular direccin
limitando el mximo que puede alcanzarse. Tratando de ir ms all de esto implica el
retorno de la direccin actual del menor valor esperado. La posicin de la cola vara
entre estos dos extremos direcciones durante la ejecucin.
115 Assembly Language Algorithmic and Data Structures 115
Programming
Top
Agregar
La ltima
escritura
En la cola.
CI
Un
A
continuaci
n, lea
En la cola.
Retirar
Parte inferior
Los datos de
superficie
Figura 6.1. Una cola de 32 bits que crece al aumentar las direcciones
6.5.6. Pila
Una pila es un LIFO (ltimo en entrar, primero en salir) estructura. Los datos estn
ordenados consecutivamente en la memoria durante el apilamiento. Son unstacked en
el orden inverso a su orden de apilamiento: el ltimo puesto ser el primer eliminado.
Un nico puntero Rp es suficiente para administrar una pila. Podemos distinguir entre
dos modos de administracin de la pila:
116 Assembly Language Algorithmic and Data Structures 116
Programming
Parte
inferior
La ltima
escritura en
la pila
Agregar
Prim
Retirar er
lugar
"libre"
Top
Los datos de
superficie
Tenga cuidado de no unalign una pila destinados a recibir las palabras (o medias
palabras, respectivamente). La direccin contenida en el registro debe ser doblemente
(respectivamente por separado), incluso, es decir, terminando con dos
(respectivamente, 1) cero! Esta es la razn por la que no se recomienda construir una
pila mixta donde apila bytes, palabras y palabras medio indiscriminadamente.
Colas y pilas de que los elementos no son bytes ni medias palabras ni las palabras
son el ms delicado para administrar. Es necesario calcular cambios analgico similar
a las que hemos visto en el caso de tablas. Una tcnica ms ventajosa a menudo
consiste en aadir un nivel de direccionamiento indirecto mediante la creacin de colas
o pilas consistente de las direcciones (referencias) de elementos. La posicin y el
tamao de los elementos son entonces sin importancia real.
Captulo 7
Modularidad
interior
Aqu est una primera versin del procedimiento, titulado MaxVer1. Se accede
directamente a los datos que necesita.
;*************************************************************
; Seccin de datos
; Zona************************************************************* MyData,
datos, ALIGN=2
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ValOne DCD
345
0DCD ValTwo xABF
Maxi espacio 4
;*************************************************************
; seccin de cdigo
;*************************************************************
MyCode, cdigo de rea, readonly, ALIGN=2
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Procedimiento principal
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
BL MaxVer1 ; llamada al procedimiento
ENDP
122 Assembly Language Programming Internal Modularity 122
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Procedimiento que investiga el mximo
; argumentos pasados : ninguno
; variables globales : ValOne, ValTwo, Maxi
; se utilizan registros: R0, R1, R2, R4
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MaxVer1
PROC
Empujar {R0-R4} ; Guardar los registros modificados
LDR R0=ValOne ; Carga de los
LDR R1,[R0] ; Primer valor
LDR R3=ValTwo ; Carga de los
LDR R2,[R3] ; Segundo valor
CMP R1,R2
BHS Bon ; Si ValOne < ValTwo ...
Cambiar MOV R1,R2 ; ... A
continuacin, exchange
Buena LDR R4= Maxi ; Almacenamiento en Maxi
STR R1,[R4] ; El resultado contenida en R1
POP {R0-R4} ; Restaurar registros guardados
BX LR ; Volver
Infinito B infinito ; Fin del programa
ENDP
En este caso, todo est muy bien, pero debemos tener en cuenta que un programa
que se cuelga tambin pierde mucho tiempo!
123 Assembly Language Programming Internal Modularity 123
Cada argumento puede ser pasados por valor o por referencia. Si se pasa por valor,
una copia de los datos que se proporcionan a los llamados por el procedimiento de
llamada, por lo que su posible modificacin por sta no afecta a la original: la
modificacin sigue siendo local a la subrutina llamada. Cuando un argumento es
pasado por referencia, nos proporciona la direccin a la subrutina que, mediante
engao, posiblemente podra cambiar el valor de los datos en esa direccin.
Cuando la entrada de dos argumentos son pasados por valor y el valor del resultado
es devuelto. En la presentacin de estos ejemplos, slo las piezas modificadas sern
reescritas; las declaraciones de secciones, reservas, etc., son completamente
idnticos.
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
LDR, R0=ValOne ; carga del
LDR R1,[R0] ; Primer valor
LDR, R3=ValTwo ; carga del
LDR R2,[R3] ; segundo value
BL MaxVer2 ; llamada al
procedimiento LDR, R4= Maxi ;
escrito el resultado STR
R1,[R4] ; contenida en R1
Infinito infinito B ; Fin del programa
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MaxVer2
PROC
CMP R1,R2
BHS Bueno ; si ValOne < ValTwo ... Intercambio MOV R1,R2 ; ... Se
convierte en el buen max ValTwo BX LR ; Volver
ENDP
Como una funcin en un lenguaje de alto nivel, tales como ANSI C, para que el
prototipado sera:
Long int Ver2 Max (long int, long int arg1 arg2);
De hecho, la asignacin del valor del resultado es llevada a cabo por el programa
de llamadas, exactamente como en el programa en lenguaje ensamblador.
Los compiladores suelen utilizar pasando por registro porque es ms sencillo y ms directo
(y tan rpido).
REMARK 7.2.- Cuando queremos llamar a una rutina escrito en lenguaje ensamblador
de un programa desarrollado en C, es necesario conocer las convenciones del paso de
argumentos que el compilador usa. Por ejemplo, el brazo de RealView compilador
utiliza registros R0 a R3 para pasar hasta cuatro argumentos de entrada. El retorno se
llev a cabo sistemticamente por el registro R0 (complementado con R1 en el caso
de devolucin de un doble codificada en 8 bytes). Si el paso de argumentos por registro
ya no es posible, por ejemplo, si hay ms de cuatro argumentos de entrada, el
compilador finaliza el proceso utilizando pasando por pila del sistema.
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
LDR, R0=ValOne ; Pasaring de la @ del primer argumento LDR,
R3=ValTwo ; pasando del @ del segundo argumento LDR,
R4= Maxi ; pasando del @ argumento de la salida.
BL MaxVer3 ; llamada al procedimiento
Infinito infinito B ; Fin del programa
126 Assembly Language Programming Internal Modularity 126
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MaxVer3 PROC
Empujar {R1-R2} ; Save la registros modificado
LDR R1,[R0] ; lea el primer argumento
LDR R2,[R3] Leer ; segundo argumento
CMP R1,R2
BHS buena ; Si ValOne < ValTwo ...
Intercambio MOV R1,R2 ; ... ValTwo pasa a ser
el mx.
Buena STR R1,[R4] ; Store el resultado contenida en R1
POP {R1-R2} ; restaurar los registros
guardados
BX LR ; Volver
ENDP
Y el uso como:
REMARK 7.3.- Si el programador est preparado para definir una subrutina que
requieran ms de 10 argumentos (por lo que hay ms de 10 registros para pasar
argumentos utilizando slo el registro tcnica), sera bastante razonable para l o ella
a considerar la posibilidad de reestructurar el programa o los datos a fin de desarrollar
una nueva organizacin basada en simples funciones de bloque.
La idea final es, por lo tanto, organizar los argumentos directamente en una pila:
no ms problemas de tamao (siempre que tengamos nuestra pila de tamao correcto,
es decir, hemos reservado suficiente espacio en la memoria para su funcionamiento)
ni problemas con guardar porque la pila crece, naturalmente, estamos avanzando
argumentos.
Por lo tanto tres pasos principales marcan la evolucin de este montn cuando se
trata de pasar argumentos:
- creacin: el programa llamante apila los argumentos antes de llamar al
procedimiento;
- Utilizacin: el acceso a los argumentos que se lleva a cabo con la ayuda del modo
de direccionamiento indexado indirecto [rn + #desplazamiento];
- Desaparicin: esto significa quitar los argumentos cuando ya no son de utilidad.
Hay dos opciones: o bien el llamado procedimiento quita de ellos, o el procedimiento
llamado unstacks ellos. Las siguientes secciones muestran las dos opciones.
REMARK 7.4.- as como la tcnica utilizada para realizar el paso de argumentos deben
ser parte de la documentacin proporcionada al utilizar un procedimiento, por lo que
el creador de un procedimiento utilizando la pila tambin deben informar a los futuros
usuarios de quin debe borrar la pila de argumentos de dumping antes de la llamada. A
priori, esta eleccin no tiene ninguna consecuencia concreta, sino que debe ser
absolutamente respetado. De hecho, una pila deriva no puede ser visto en una prueba
unitaria , pero en el caso de mltiples llamadas esta deriva podra provocar un
desbordamiento de pila, que pueden ser catastrficas.
128 Assembly Language Programming Internal Modularity 128
EJEMPLO 7.6.- investigacin en el mximo: pasando por usuario y por valor de pila
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
LDR, R0=ValOne
LDR R1,[R0]
LDR, R0=ValTwo
LDR R2,[R0]
MOV R1,#0
BL MaxVer4 ; llamada
ENDP
MaxVer4 PROC
CMP R1,R2
BX LR ; Volver
ENDP
En este listado, los nmeros en crculos que aparecen no tienen nada que ver con
la sintaxis del ensamblador. Estos son slo los marcadores para ser comparados con
los que se muestran en la Figura 7.1. Que indican cmo el usuario sp evoluciona
durante la ejecucin del programa. Podemos compararlos con los breakpoints que
congelar el estado del procesador en un momento dado para observar las evoluciones.
Xx 00 00 00
xx 00 00 00
rea reservada para la pila
xx 01 01 01
xx 59 59 +8 59
xx 00 00 00
xx 00 00 00
xx 0A 0A 0A
xx BF BF +4 BF
xx 00 00 00
xx 00 00 00
xx 00 0A 0A
xx 00 BF BF
xx xx xx xx
xx xx xx xx
XXXX XXXX
Figura 7.1. Los argumentos pasados por valores en una pila de usuario
Tenga en cuenta que la pila est sujeta a pre-decremento, por lo que suponemos
que crece hacia la parte inferior de la memoria, es decir que la direccin actual de la
pila disminuye en el transcurso de apilamiento. En cada momento el
puntero R11 seala a la direccin donde el ltimo escrito fue llevado a cabo.
Pero esta sintaxis no existe. Esto es comprensible porque significa dos diferentes
pero activaciones simultneas del bus de acceso a la memoria.
EJEMPLO 7.7.-
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
LDR, R0=ValOne
@ValOne31- 2 4
@ValOne23- 1 6
@ValOne15- 8
3 00
@ValOne7-0 @ValOne31- 2 4 00
Zona reservada para la
@ValTwo31- 2 4 @ValOne23- 1 6 00
R5
@ValOne
@ValTwo23- 1 6 @ValOne 15- 8
00 Maxi
@ValTwo15- 8 @ValOne 7-0 3
00
R4
@ValTwo7-0 @ValTwo31- 2 4 @ValTwo Yyyyyyyy
00
R2
@MaXi31- 24 @ValTwo23- 1 6 0A
@Maxi23- 1 6 @ValTwo15- 8 R BF ValTwo
@Maxi15- 8 @ValTwo7-0
00
pila
R3
@Maxi Xxxxxxxx
@Maxi7-0 @MaXi31- 24
00
Xx
R1
@Maxi23- 1 6
01
xx @Maxi15- 8 ValOne
59
@Maxi7-0 xx
xx XX
xx
XX
XXXX
Figura 7.2. Los argumentos pasados por referencia sobre una pila de usuario
Esta es la ltima variante que presentaremos (Ejemplo 7.8 y Figura 7.3) para
ilustrar el paso de argumentos. En lugar de pasar argumentos por una pila
administrada por un registro general, podemos pasar argumentos por el apilado en la
pila del sistema. Esto es gestionada por el sistema SP. Este es utilizado regularmente
por los compiladores y implica que la pila del sistema debe ser de tamao suficiente.
Debemos reconocer que, adems del problema del mximo tamao de la pila, el
uso de la pila del sistema es bastante delicado, aun en el caso del ensamblador del
brazo no es el ms crtico de1. Las dificultades provienen del hecho de que la pila del
sistema se usa para otras cosas que no sean el simple paso de argumentos. Este es
especialmente el caso cuando se guardan datos temporales (contenido del registro, la
direccin de retorno en el caso de llamadas anidadas, etc.); en consecuencia, la SP
flucta segn el push/POP insertado en el procedimiento. Por lo tanto, debemos
considerar estas fluctuaciones para alcanzar los argumentos.
EJEMPLO 7.8.- investigacin en el mximo: pasar por referencia y por pila del
sistema
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
LDR, R0=ValOne
Pulsar R0 ; el apilado de @
Parmetro 1
LDR, R0=ValTwo
Pulsar R0 ; apilar @ Parmetro 2
LDR, R0= Maxi
Pulsar R0 ; el apilamiento del
parmetro de
BL MaxVer6 ; llamada
devolucin
Infinito B infinito ; Fin del programa
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MaxVer6 PROC
Empujar {R9} ; Guardar registro
modificado
MOV R9,SP ; la inicializacin del anexo
puntero
Agregar R9#4 ; Offset en R9
Empujar {R1-R5} ; Guardar registros
modificados
135 Assembly Language Programming Internal Modularity 135
Figura 7.3. Pila del sistema evolution (mostrando el cdigo de ejemplo 7.8)
136 Assembly Language Programming Internal Modularity 136
Todas las versiones de pasar argumentos que han sido presentados en las secciones
anteriores se pueden mezclar a voluntad. Esta es la fuerza y la flexibilidad de la
programacin en lenguaje ensamblador, pero es tambin la dificultad. En efecto,
podemos, por ejemplo, pasar un primer argumento por valor y por registro, un segundo
por referencia y por el sistema de pila y recuperar los resultados del procedimiento en
una pila de usuario. Es fcil comprender que esa mezcla corre el riesgo de ocasionar
terribles problemas. Por lo tanto, salvo que se estn obligadas (por motivaciones que
puede aparecer oscura) para hacerlo, lo mejor es evitar la mezcla.
Para llevar a cabo su labor, una subrutina puede tener que utilizar sus
propios datos. Estos son los datos locales de la subrutina. La regla de localizacin nos
invita a poner estos datos de modo que slo son visibles y utilizables por la subrutina
patentados. La manera ms sencilla de hacerlo en lenguaje ensamblador es utilizar
los registros generales para contener las variables locales. Funciona perfectamente en
los casos ms simples, especialmente si los datos no son demasiado numerosos.
Lamentablemente, el nmero de registros est limitado. Lo que es ms, este mtodo
no es til en el caso de llamadas a subrutinas anidadas o para una funcin recursiva
sin necesitar varios salva. Podramos considerar la planificacin de la creacin de
estos datos en una seccin de datos especficos, pero esto lleva a un "desecho" de la
memoria porque slo se utiliza durante la ejecucin del procedimiento. Una solucin
ms satisfactoria sera superponer todas estas secciones especificndolas como
siendo comunes, que se especifican como atributos en la declaracin de la
seccin: REA DE DATOS Mydata align=2, comn, por lo que comparten la misma
porcin de memoria. No obstante, podemos aplicar las mismas crticas a este mtodo
de superposicin en el caso de argumentos dispuestos en un espacio fijo: el
lanzamiento de una subrutina puede conducir a una prdida parcial o total de datos
locales desde el programa que realiza la llamada. Por tanto, preferimos crear los datos
en una forma dinmica al comienzo de la ejecucin del procedimiento. Aqu hay dos
opciones, ambas con el montn:
- adems de la pila de los argumentos, podemos utilizar una segunda pila para las
variables locales.
- durante la ejecucin podemos colocarlos en la misma pila como los argumentos.
REMARK 7.6.- variables locales creado dinmicamente en una pila puede igualmente
ser creado en una pila de usuario (un montn) o en la pila del sistema. Como en el caso
de pasar argumentos, el uso de la pila del sistema es ms delicado y, por tanto,
peligrosa. Como tal, si no hay imperativos vinculados al uso de la memoria, siempre
es preferible y ms seguro utilizar la pila del usuario.
137 Assembly Language Programming Internal Modularity 137
Vamos a ilustrar el uso de una pila de usuario, tras lo cual tanto el procedimiento
argumentos y variables locales se pueden arreglar. Suponemos que la pila de usuario
se crea e inicializa debidamente, con R11, como el registro SP.
En primer lugar, veamos un primer mtodo donde las variables locales son
simplemente reservado en la pila del usuario por el programa que realiza la llamada.
El procedimiento considerado en el ejemplo 7.9 y Figura 7.6 empieza por restablecer
las variables locales, el cuerpo del procedimiento al no haberse desarrollado.
Suponemos que el procedimiento recibe dos argumentos de 32 bits,
denotados Arg1 , Arg2, que estn almacenados en la misma pila de usuario durante la
llamada.
REMARK 7.7.- No es necesario considerar que las variables locales son inicializadas a
cero. De hecho, ocupan un espacio de memoria que se pueden utilizar muchas veces,
y la liberacin de memoria se realiza slo por compensacin punteros dirigidos a la
memoria de las zonas de que se trate. Los valores son, por tanto, ni borrarse ni
guardado.
Las diferentes etapas de la gestin de la pila del usuario para la gestin de las
variables locales son:
- Creacin: tomemos el caso de cuatro variables locales: uno de 32 bits, uno de los
16 bits, y dos de 8 bits. En la parte superior de los argumentos, nos reservamos un lugar
(4+2+1+1 bytes) creando un agujero en la pila, gracias a esta instruccin colocado al
inicio del procedimiento: SUB R11#8.
- Uso: Distribuimos estos 8 bytes a voluntad entre las distintas variables locales.
En el ejemplo 7.9, el datum Local32 (32 bits) se alcanza
por [R11,#4], el datum Local16 (16 bits) por [R11,#2], 1 Byte (8 bits)
por [R11,#1] y 2 Byte (8 bits) por [R11]. Tenga en cuenta que estos smbolos no estn
definidos a priori.
- Extraccin: esto es llevado a cabo por un desplazamiento hacia la parte superior
de la pila que se utiliza para rellenar el hueco. Podemos utilizar este paso, como se ha
hecho en este ejemplo, tambin se quitan los dos argumentos que se pasan en la
llamada, que en nuestro caso corresponde a la instruccin ADD R11,#16.
EJEMPLO 7.9.- Borrar de variables locales.
Borrar_Local PROC
Empujar {R1,R2,R10} ; Guardar registros
modificados
MOV R10,R11 ; anexo asignacin de
puntero
SUB R11,#8 ; "hueco" para las 4
variables locales
MOV R2#0 ; para borrar
STR [R2, R11,#4] ; Borrar32 Local.
138 Assembly Language Programming Internal Modularity 138
La figura 7.4. Lugar relativo de las variables locales en la pila (ver ejemplo 7.9)
Comencemos con las pocas lneas de llamada que simplemente utilizar post-
incremento para la lectura de los diferentes valores de tabla (apuntado por R0) y pre-
decrementacin por escrito a la pila (sealado con R11).
140 Assembly Language Programming Internal Modularity 140
...
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Principales PROC
...
LDR R11=Top_stack
LDR, R0=Tabla
LDR R1,[R0],#4
STR [R1, R11,#-4]! ; Tabla Pila[0] (N1) LDR R1,[R0],#4
STR [R1, R11,#-4]! ; Tabla Pila[1] (N2) LDR R1,[R0],#4
STR [R1, R11,#-4]! ; Tableau Pila[2] (N3) LDR R1,[R0]
STR [R1, R11,#-4]! ; Tabla Pila[3] (N4).
BL Max_4
Agregar R11,#16 ; quien apila unstacks
LDR, R0=ResuMax
STR R4,[R0] ; el resultado es en R4
Infinito B infinito ; Fin del programa
ENDP
Max_4 PROC
Empujar {LR} ; llamadas anidadas
Empujar {R1,R2,R10} ; Guardar registro
modificado
MOV R10,R11 ; la inicializacin del
SUB R11,#8 argumento puntero
; el agujero para crear
LDR[R1, R10,#12] ;
2 Carga N1 locales
variables
STR [R1, R11,#-4]!
LDR[R1, R10,#8] ; Carga N2
141 Assembly Language Programming Internal Modularity 141
ENDP
142 Assembly Language Programming Internal Modularity 142
argumentos
Max_cuatro
N1 N1 N1
argumentos
Max_cuatro
argumentos
Max_cuatro
N2
N2 N2
N3
N3 N3
R10 R10 R10 N4
N4 N4
M1=max(N1,N2)
Local
Local
M1=? M1=?
Los argumentos locales
M2=? R11
es
es
R11
M2=? M2=?
N1
Xxxxxxxx N1
N2
Xxxxxxxx N2
MaxV4
R11 Max(N1,N2)
Xxxxxxxx 0
Xxxxxxxx
Xxxxxxxx Xxxxxxxx
N1 N1 N1
argumentos
Max_cuatro
argumentos
Max_cuatro
argumentos
Max_cuatro
N2 N2 N2
N3 N3 N3
Local
locales
N4 N4 N4
es
Los argumentos
N3 N3 M1
MaxV4
MaxV4
N4 N4 M2
R11 R11
0 Max(N3,N4) Max(M1,M2)
de cdigo son: Ejemplos de 7.12.- Reinicio de variables locales: versin con anexo
puntero
Borrar2_Local PROC
Empujar {R1, R2, R9, R10} ; Guardar los registros modificados
MOV R10,R11 ; Anexo puntero (argumentos)
MOV R9,R11 ; Anexo puntero (variables locales)
SUB R11,#8 ; Agujero para crear las 4 variables
MOV R2#0 locales
; Para borrar
STR [R2, R9,#-4] ; Reset 32 Local.
STRH[R2, R9,#-6] ; Reset 16 Local.
STRB[R2, R9,#-7] ; Restablecer Byte2
STRB[R2, R9,#-8] ; Resto Byte1
LDR[R1, R10,#4] ; La carga del primer parmetro
LDR R2,[R10] ; Carga de parmetros 2
...... ; Cuerpo de
...... ; El procedimiento
Agregar R11,#16 ; Extraccin de local
; (8) variables y argumentos (8)
POP {R1,R2,R9,R10} ; Restaurar registros modificados
BX LR ; Volver
ENDP
144 Assembly Language Programming Internal Modularity 144
Figura 7.6. Lugar relativo de la variable local localizaciones en la pila (ver ejemplo 7.12)
7.3.2.2. Encadenamiento
Hemos generalizado el mtodo anterior para todos los llamados procedimientos,
sino que se utiliza el mismo registro R9 como la pila anexo puntero. Por tanto,
tomemos el caso de un procedimiento proc1 llamar a un procedimiento proc2, que
llama a un procedimiento proc3.
145 Assembly Language Programming Internal Modularity 145
Es suficiente con esto para poder recuperar los valores anteriores de R9, sin cargar
su valor actual; por ejemplo, vea los siguientes temas:
146 Assembly Language Programming Internal Modularity 146
La figura 7.7 muestra cmo los diferentes argumentos anidan en la pila del usuario.
Si lo deseamos, esto nos permite implementar una jerarqua de las variables locales,
como permitido en Ada, por ejemplo. De hecho, esta jerarqua es muy interesante
para escribir un compilador, pero poco utilizado porque es muy pesado para el trabajo
actual de un programador en general
Idioma en un controlador .
Captulo 8
Gestin de
excepciones
Por ltimo, otro tipo de comunicacin puede surgir, que se refiere a la puesta en
marcha de un reinicio o una interrupcin no enmascarable (NMI). Estos dos
acontecimientos son generalmente transmitidos por pasadores externos especficos del
procesador y puede considerarse como una "parada de emergencia".
148 Assembly Language Programming Managing Exceptions 148
1 Los guardianes son bits que debe (cuando estas unidades estn conectados) que
peridicamente se establece en 1. Este mecanismo permite a los controller para garantizar que
la ejecucin del programa no est bloqueado en un bucle infinito, entre otras cosas.
149 Assembly Language Programming Managing Exceptions 149
Cada excepcin tiene una entrada en la tabla que se encuentra en su posicin. As,
la direccin de memoria donde la direccin de la rutina de procesamiento para el
nmero de excepciones "posicin" se almacena corresponde a:
Reset_Handler PROC
Exportar Reset_Handler [principal]
Importacin dbiles
LDR R0, =principales
BX R0
ENDP
NMI_Handler PROC
Exportar nmi_Handler dbil [B] .
ENDP
152 Assembly Language Programming Managing Exceptions 152
8.2.1. Trampas
Esta es una triple registrarse en el sentido de que estos tres nombres corresponden
a 2 bytes y un semi-palabra de una palabra de memoria NVIC colocado en
0xE000ED28 (vase la figura 8.4). La lectura de la palabra MMFSR dar pues los tres
registros, pero la lectura de 1 byte en esta misma direccin slo da el contenido del
primer byte. La MMSFR es por lo tanto parte del registro. Un usuario encuentra un
problema de "fallo" podra, mediante la lectura del contenido de estos registros,
rastrear la causa de estos fallos. Slo el contenido de UFSR sern explicados (vase la
seccin 8.2.1.4) como en todo el mundo corresponden a cuestiones que abarcan
software en lugar de hardware, y para que un desarrollador pueda responder.
8.2.1.3. Fallo de
bus
Con esta trampa, problemas que estn potencialmente presentes en la fase de
desarrollo comienzan a aparecer. Esto corresponde a la imposibilidad para el
procesador para recuperar unprefetch de instrucciones ( Anular) o efectuar la
lectura/escritura de un dato (datos Cancelar). El caso tpico en el que Cortex-M3 cae
en la trampa es que de mala gestin del puntero (y tan indirecto direccionamiento),
donde prcticamente la direccin seal (el contenido del registro de
direccionamiento indirecto) no corresponde a una direccin de datos vlidos. Otro
problema comn es el mal uso de un perifrico que, por ejemplo, intenta recuperar
una palabra de modo que slo puede proporcionar un byte. En ciertos casos,
la BFAR (Bus Fault address Register) conserva la direccin de memoria que ha
producido el fallo. Poco
17 del registro SHCSR nos permite validar o invalidar esta trampa y 14 bits y
1 nos permiten determinar su estado de actividad (activo o
pendiente).
155 Assembly Language Programming Managing Exceptions 155
Un fallo de uso puede ser desactivado. Para hacerlo, debemos ajustar el bit 18 de
la SHCSR a 0. 12 y 3 bits de este registro permite el conocimiento del estado de
actividad (activo o pendiente).
156 Assembly Language Programming Managing Exceptions 156
Esta trampa es llamado por lo tanto en un nivel de software por la instruccin VCS
n, donde n es un valor de <255 (que es inmediatamente codificado) que representa
un ncleo especfico de servicio. Este servicio llamado mecanismo es el mismo para
todas las excepciones. Por lo tanto, sera necesario referirse a la documentacin de este
hipottico kernel para averiguar acerca de los diferentes servicios y cmo utilizarlos.
Es interesante, sin embargo, detenerme en lo que el manejador de esta excepcin
puede hacer para recuperar el valor de n. De hecho, la instruccin codifica el
valor n mediante direccionamiento inmediato, por lo que este valor no se encuentra en
un registro, sino en el propio cdigo. El nico mtodo por el cual podemos recuperar
su
2 mediante el desarrollo de este servicio, es posible construir las dos funciones de "pilares" de
la librera stdio.h (en lenguaje C).
157 Assembly Language Programming Managing Exceptions 157
SVC_Handler PROC
Y R0,LR,#0X000F ; En la mscara 4 LSB.
CMP R0, #0x0001 ; Llamada de modo manipulador
BEQ StackMSP
CMP R0, #0x0009 ; Llamada desde el modo de
subproceso
; Con privilegiadas
BEQ StackMSP
CMP R0, #0x000D ; Llamada desde el modo de
subproceso
; Sin privilegio
BNE Salir ; Exec_Return es inidentificables
; ...extrao!
StackPSP La Sra. R0,PSP ; ... usar PSP WWE
B Search_suario
StackMSP La Sra. R0,MSP ; ...utilizamos MSP
Search_suario LDR[R1, R0,#6*4] ; PC puntero es la sptima
guardar
LDRB[R7, R1, #-2] ; Valor inmediato es el
segundo byte
Para grabar las llamadas a rutinas del kernel correspondientes a distintos servicios
con referencia a una tabla de salto o un If...ElseIf...ElseIf basada en el valor
contenido en R7.
8.2.1.6. El monitor
Para llevar a cabo todos los desarrollos y pruebas de una aplicacin determinada,
Cortex-M3 ofrece una estructura de hardware llamado debug. La unidad de
desarrollo tiene la opcin de congelar el ncleo ( modo de parada) y as tomar el control
completo de la ejecucin del cdigo y todas las excepciones (aparte
del restablecimiento y la NMI) que pueden ocurrir. No siempre es posible o deseable,
sin embargo, para congelar completamente el procesador. Por ejemplo, a veces es
conveniente preservar la actividad de ciertas tareas, tales como la aceptacin de nivel
superior patches de excepciones, mientras que el resto del cdigo para supervisar, a
fin de garantizar un mnimo de seguridad.
8.2.2. Interrumpe
Hay mecanismos que son comunes a todos los diseos, sin embargo: las
interferencias con el NVIC. De hecho como esta unidad recibe y gestiona todas las
excepciones, es normal encontrar dentro de ella registra que slo actan sobre el
comportamiento de los perifricos o, al menos, el comportamiento en el
desencadenamiento de las interrupciones. En primer lugar, hay
el NVIC_ISER[x] (Interrupt Set-Enable registra), que validan la transmisin de estas
interrupciones y en forma simtrica. Entonces hay el NVIC_ICER[x] (Interrupt claro-
Activar registros), que invalida la transmisin. Cabe sealar que, como se ha visto,
para poner las trampas SysTick PendSV y en pendiente, validacin e invalidacin se
producen a travs de distintos bits en registros separados se establece a 1, cuando un
estado binario habra sido suficiente para transcribir esta dualidad. En cada caso el
restablecimiento de bits no tendr ningn efecto y, como un botn, cambiar
un juego (o borrar) a 1 bits se restablecer la clara (o SET) bit del doble registro. El
8 ISERs ocupan las direcciones 0xE000E100 a 0xE000E11C y cada uno de los 32 bits
corresponde a una interrupcin, como se muestra en la Figura 8.6. Una distribucin
completa similar para las rceas entre las direcciones 0xE000E180 yE000E
0x19C corresponde a la invalidacin bits.
Otros dos grupos de registros, con las mismas caractersticas y rceas ISERs, nos
permiten cambiar el estado pendiente de una interrupcin. Esto involucra el 8
NVIC_ISPER[x] (Interrupcin Set-Pending registra) cambiar a modo de pendiente
(forzando as uno de estos bits en 1 para disparar a travs del manejador de la
interrupcin correspondiente) y los ocho NVIC_ICPER[x] (Interrupt Clear-Pending
registra) para cancelar el modo de pendiente (y por tanto la cancelacin de una
solicitud de interrupcin). Estos dos grupos de registros ocupan las direcciones
0xE000E200 a 0xE000e21c (para ISPER) y 0xE000E280 a
0xE000E29C (para ICPER).
Los eventos que son susceptibles de producir una excepcin generalmente ocurren
en un asincrnico, y por lo tanto, manera impredecible. Es cierto que siempre es
posible activar esos mecanismos, mediante la ejecucin de cdigo; esto es,
naturalmente, el caso de SVC. Es tambin el caso de las interrupciones, a travs de
la ISPERs, pero esta posibilidad sigue siendo bastante atpica. Por lo tanto, es necesario
considerar varias excepciones que ocurren simultneamente, exactamente en el mismo
ciclo de reloj o algunos ciclos de reloj despus, pero lo suficientemente cerca para que
el procesamiento de la primera excepcin no se ha terminado antes de que comience
la siguiente.
Por otro lado, es responsabilidad del desarrollador para definir el orden de todas
las restantes excepciones, todos estos niveles inicialmente igual a 0 despus de
un restablecimiento.
162 Assembly Language Programming Managing Exceptions 162
Las figuras 8.7 y 8.8 muestran que los niveles de prioridad se codifican en un byte.
En teora, por lo tanto, hay 256 diferentes niveles de prioridad. Lamentablemente no
es tan simple en la prctica. ARM provee dos sutilezas:
- un diseador puede querer menos niveles, codificado, no slo sobre la base de 8 bits, pero
slo en
3, 4 o 7 bits. Esta eleccin, que no pueden ser modificados por el usuario, se
administra de modo que slo los bits ms significativos (MSB) del nivel son
importantes. As en 3 bits los 8 niveles posibles son 0x00, 0x20, 0x40, 0xE0. En 4
bits, el 16 niveles sera 0x00, 0x10, 0x20, 0xF0. Uno de los problemas de
programacin (pequeo) se refiere al clculo del valor para ser colocado en el registro
con el cdigo de un determinado nivel de prioridad. Un desplazamiento de la
izquierda el nmero de bits necesarios para la codificacin es suficiente para llevar a
cabo esta traduccin. Ejemplo 8.5 muestra las pocas lneas de programacin en el
caso de niveles de codificacin de 5 bits en la rutina de procesamiento asociado
con SysTick;
- la existencia de subniveles: en el NVIC_AIRCR, el campo de 3 bits PRIGROUP
(8 peso a peso 10) nos permite dividir los 8 bits del nivel en dos con el fin de
163 Assembly Language Programming Managing Exceptions 163
Separar la prioridad los niveles y subniveles. Esta separacin - y es aqu donde las
cosas se complican un poco ms, no est relacionada con el nmero de bits elegido
por el diseador para calificar a sus niveles de prioridad; simplemente puede
intervenir con el bit no significativa y, en consecuencia, puede quedar sin efecto.
Las figuras 8.9 a 8.14 ilustrar todas las opciones combinadas resultantes de estos
dos sutilezas. Los bits marcados con una x dar el nivel de prioridad de codificacin y
aquellos marcados con una preocupacin y la codificacin de subniveles. En cada
figura, el valor que debe darse a la
3-bit prio- campo de grupo para definir el nivel deseado/subnivel separacin est
indicada. Cabe sealar que para escribir en el AIRCR, es esencial (para hardware de
seguridad) que la MSBVECTKEY 16 () del valor escrito contiene exactamente
0xFA05, de lo contrario, la escritura no se llevar a cabo. La importancia de los dems
bits del registro es la indicada en la figura 8.15, sin embargo no son directamente
tiles a priori en una programacin comn.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Ajuste del nivel de prioridad
; para el Manejador SysTick
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LDRB,
R0=0xE000ED23 ; la direccin del registro SHPR
MOV R1,#9 ; 5 bytes de codificacin elegimos un
nivel 9 (sobre 32) aqu
LSL , R1#3 ; => (8-5) Mays izquierda para asignar MSB
STRB R1,[R0] ; Registro de asignacin y para el establecimiento de prioridades
Reservado reservado
- Caso No. 2: una prioridad menor excepcin (C) surge durante la tramitacin de
la excepcin (B): (C) conserva el estado pendiente, y va a pasar a ser activo y ser
procesada cuando el procesamiento de (B) est terminado, salvo una excepcin, con
un nivel de prioridad superior (C) aparece en el nterin.
167 Assembly Language Programming Managing Exceptions 167
8.4.1. Re-enrutamiento.
Cuando la excepcin pasa al estado activo, el Cortex-M3 lleva a cabo una serie de
operaciones a fin de permitir la ejecucin del controlador especfico. Parte de la re-
secuencia de enrutamiento ya ha sido descrito: la que consiste en la recuperacin de
la direccin donde la rutina se almacena en la IVT. Una vez recuperado, esta direccin
ser modificar el puntero de instrucciones de PC y la rutina ser ejecutado.
Hay otros, sin embargo, las operaciones que se llevan a cabo antes de este salto
asincrnica:
Figura 8.17. Estado de la pila del sistema despus de una excepcin re-enrutamiento.
169 Assembly Language Programming Managing Exceptions 169
Valor Tipo de
retorno
0xFFFFFFF1 Volver a modo de controlador - la pila es MSP
0xFFFFFFF9 Volver al modo de subproceso - la pila es MSP
0xFFFFFFFD Volver al modo de subproceso - la pila es PSP
8.4.2. Volver
El caso de llegada tarda implica una prioridad mayor excepcin (A), que se
produce cuando el re-direccionamiento secuencia de una excepcin de nivel inferior
(B) ya ha comenzado. Esto podra corresponder al caso No. 1 por avanzar en el flanco
de la solicitud (A) de modo que tiene lugar justo despus de que (B) pasa al estado
activo. Aqu tambin el tiempo de latencia puede ser optimizado por no realizar un
doble guardar; es decir, al no iniciar una secuencia despus de guardar (A), desde el
punto de guardar es el mismo (B). (A) sern sustituidos por (B) en el re-enrutamiento
y (B) se cambiar a PENDIENTE. Al final de la letra a), salvo excepciones han surgido
con mayor prioridad, un mecanismo de encadenamiento de cola ser implementada
con el fin de reanudar el re-direccionamiento de (B).
PriMask FaultMask BasePri , y son tres registros bsicos; por lo tanto, no ocupar
una direccin de memoria. No son parte del NVIC, pero su papel es, sin embargo,
directamente vinculada a la gestin de excepciones. stas se describen en la
documentacin especial porque no son directamente accesibles. Para acceder a ellos,
el cdigo debe utilizar las instrucciones especiales Sra. (pasar de Registro especial)
para la lectura y el MSR (Mover a registro especial) para escribir, consulte el Captulo
5. Estas dos instrucciones requieren privilegios para ser ejecutado.
Los registros y cada FaultMask PriMask slo tienen una significativa en 0 bits.
As, cuando la lectura, el 31 de MSB son siempre en 0 y, simtricamente, escribiendo
a estos bits no tendr ningn efecto. Estos dos registros, como su nombre indica,
permiten enmascarar las excepciones. Cuando el LSB es de 1 en FaultMask, sin
excepciones, aparte de la excepcin de NMI, cambiar a estado activo y, si una
solicitud interviene, permanecer en estado pendiente. Tan pronto como el bit es
restablecer, pendiente excepciones cambiar a un estado activo siguiendo el orden de
sus respectivas prioridades. Es idntico a FaultMask PriMask, con la diferencia de
que adems de NMI tambin permite la puesta en marcha de la tercera excepcin con
un nivel de prioridad no configurables, a saber, un duro fallo.
171 Assembly Language Programming Managing Exceptions 171
Prohibir a todos (o casi todos) las posibles excepciones que pueden ser tiles en
situaciones "catastrficas" para el que un kernel en tiempo real va a cambiar el
procesador a un "cuasi" modo degradado que esperamos proveer soluciones a estas
situaciones.
BasePri es similar. Esto implica un registro de que los ocho LSBs puede ser
significativo. En efecto, contienen una mscara en el mnimo nivel de prioridad de las
excepciones que podran cambiar a estado activo. Todas las excepciones con un nivel
de prioridad inferior quedara pendiente. Esta configuracin de registro 0x00 es
equivalente a la ausencia de la mscara. Dos pequeos escollos debe evitarse para
ajustar BasePri. En primer lugar, debe recordarse que la escala de prioridad es el
inverso de la numeracin normal (nivel 3 es inferior al nivel 2). Entonces, como se
podra hacer para ajustar las prioridades en los registros asociados (ver ejemplo 8.5),
no se debe olvidar efectuar los 8 - n desplaza a la izquierda del valor deseado si el
procesador slo cdigos de niveles de prioridad de n bits.
En la lista de ejecutables:
modularidad externo
La figura 9.1 muestra cmo las diferentes herramientas pueden ser conectados uno al otro.
Ocurren, incluso antes de haber escrito una lnea, para elegir la mejor herramienta
para sus necesidades y prcticas.
Este captulo, al igual que las otras partes de este libro y, especialmente, el captulo
3 de las directrices de la asamblea, utiliza el Keil-ARM-MDK (Kit de desarrollo de
microcontroladorKEI ) [cadena], que es armar la propia
1
herramienta . Algunos elementos de la GNU (GNU no es UNIX) cadena figuran en
el Apndice D. Este captulo slo est interesada en los principios bsicos de los
diferentes instrumentos aplicados en una cadena de desarrollo transversal, por lo que
la transposicin a otro producto puede hacerse sin mucha dificultad.
9.1. Modularidad
externo
Para ilustrar el objetivo de este captulo tan simplemente como sea posible. Este
proyecto consiste en el clculo del promedio ponderado de dos nmeros de la
siguiente manera:
Las dos palabras de media Val1 y Val2 son ledos por una rutina de biblioteca de
recursos y se declaran, como resu, que almacena el resultado en una seccin de datos
del mdulo principal Principal.s. Coef byte es la tabla de los dos elementos declarados
en una seccin de datos del mdulo CallProc.s.
;//**************************************************************
pulgar
;//**************************************************************
Importacin/Exportacin ;
;//**************************************************************
importar ||LibRequestarmlib|| [Cdigo,dbil]
Importar Ave_Weight
importar ReadData
principal exportacin
Exportar Val1
Exportar Val2
Exportar Resu
;//**************************************************************
; Seccin de datos
;// AREA************************************************************** mydata,
datos readwrite
Val1 espacio 2
Val2 espacio 2
Resu DCW 0
;//**************************************************************
; seccin de cdigo
;//**************************************************************
Principales PROC
LDR, R0= Val1
BL ReadData ; lee primero los datos
(Val1)
LDR, R0= Val2
BL ReadData ; segunda lectura de
datos (Val2)
BL CallProc
Infinito B infinito ; Fin del programa
ENDP
;//**************************************************************
Importacin/Exportacin ;
;// exportacin**************************************************************
Ave_Weight
Importar Val1
Importar Val2
Importar Resu
;// AREA************************************************************** mydata,
datos
Coef DCB 8,12 ; coeficientes fijos
;// AREA************************************************************** mycode,
cdigo
Ave_Weight PROC
LDR R0, =Val1
LDRH R4,[R0]
Ponderacin LDR R0, =Coef
LDRB R2,[R0]
MUL R4,R2 ; Ponderacin de Val1
LDR R0, =Val2
LDRH[R5, R0, R0]
LDR =Coef LDRB[R3,
R0, #1]
MUL R5,R3 ; Ponderacin de Val2
Suma
178 Assembly Language Programming
From Listing to Executable: External Modularity 178
Agregar R4,R5
Agregar R2,R3
Promedi
o
UDIV R4,R2 ; el clculo de la media
LDR R0, =Resu
STRH R4,[R0] ; el almacenamiento del resultado
BX LR
ENDP
END ; Fin del mdulo
Cules son las consecuencias si nuestro programa est escrito en piezas? Para
responder a esta pregunta, es necesario analizar las relaciones entre los mdulos del
programa, a fin de comprender la necesidad de directivas presentadas posteriormente.
Las instrucciones que contiene el mdulo puede referirse no slo a los datos o
procedimientos ubicados en el mismo mdulo, sino tambin para datos o
procedimientos3 definido en otro mdulo. En un lenguaje de alto nivel, hablamos de
importar datos o procedimientos. El principal.El mdulo de llamadas (y por lo tanto las
importaciones) el Ave_Weight procedimiento desde el CallProc.s y el mdulo de la
biblioteca ReadData resource.lib procedimiento. Simtricamente,
la CallProc.s archivo utiliza el Val1 Val2 y Resu variables declaradas en el mdulo
principal.s. Tales referencias son, por tanto, llamado mdulo externo referencias.
Cuando lee el anuncio, el ensamblador elaborar una lista de los smbolos, que se
divide en tres categoras:
- smbolos absolutos: estos son los smbolos cuyo valor asociado
es totalmente definida en el listado. Normalmente, estos son constantes
(directiva EQU). Cuando el ensamblador encuentra este smbolo, puede resolverlo sin
ambigedad y determinar el cdigo de word para ser almacenados en la memoria.
- smbolos reubicables: estos son smbolos pertenecientes al mdulo actual, pero
cuyo valor numrico no puede ser determinada. stas son variables inicializadas o
De lo contrario, que se declaran en una seccin de datos del mdulo, y las etiquetas o
los nombres de procedimiento de una seccin de cdigo. En todos los casos los
smbolos corresponden a direcciones. A nivel de construccin de programa, el
ensamblador slo puede darles un valor relativo. Esto permite que el ensamblador para
encontrarlas en la seccin donde fueron declarados;
- smbolos externos: estos son los smbolos que no pertenecen al mdulo y a que
el ensamblador no puede dar ningn valor. Cuando se utiliza este tipo de referencia
externa en un mdulo, es necesario indicar al ensamblador que el smbolo afectado
est definida en otro mdulo. En la ausencia de esta indicacin, el ensamblador va a
considerar que se trata de un smbolo no definido y producir un mensaje de error.
Esta directiva es la directiva import.
Smbolos reubicables
Coef 00000000
Ave_Weight 00000000
0000001C ponderaci
n
media 0000000E Sum
a 00000018
Smbolos externos
Resu 00000000
Val1 00000000
Val2 00000000
181 Assembly Language Programming
From Listing to Executable: External Modularity 181
Visto desde el exterior, cada mdulo por defecto se comporta como una caja negra,
con sus propios recursos y smbolos. A priori sus smbolos no son accesibles por otros
mdulos. Esto evita cualquier interferencia exterior dentro del mdulo. Sin embargo,
debemos considerar el caso de un mdulo que contiene ciertos smbolos para ser usado
por uno o ms mdulos. Estos smbolos, llamados bienes exportables, deben marcarse
explcitamente como tales porque, de forma predeterminada, los smbolos definidos
en un mdulo son privados, lo que significa que son visibles slo en ese mdulo. El
alcance de los smbolos exportables (equivalente a la visibilidad en lenguaje
ensamblador) es global, a diferencia de los smbolos privados cuyo alcance es slo
local. Por lo tanto, cualquier smbolo slo puede ser privado o exportables (global).
La opcin dbil especifica si el smbolo est definido en otro lugar (en el mdulo
actual o en cualquier otro mdulo); esta definicin sern priorizados para la
exportacin. Esta opcin se utiliza para la declaracin de smbolos asociados con
excepcin de vectores (ver ejemplo C.1 en el Apndice C). Por lo tanto, es posible que
el desarrollador para reescribir un controlador de excepciones: su nombre debe ser
reconocido correctamente a fin de modificar la tabla de vectores de interrupcin sin
entrar en conflicto con la rutina escrito por defecto.
La importacin puede ser substituida por EXTERN; estas dos directivas son casi
totalmente equivalentes. Con la directiva extern, un smbolo slo ser incluida en la
tabla de smbolos si se utiliza en el mdulo. Como resultado, por ejemplo, si el
smbolo
182 Assembly Language Programming
From Listing to Executable: External Modularity 182
10 00000000 ;**********************************************
11 00000000 Importacin/Exportacin ;
12 00000000 ;**********************************************
13 00000000
14 00000000 Importar ||LibRequestarmlib|| [cdigo] DBIL
15 00000000
16 00000000 Importar Ave_Weight
17 00000000 Importar ReadData
18 00000000
19 00000000 Principal exportacin
20 00000000 Exportar Val1 [CODE]
21 00000000 Exportar Val2
22 00000000 Exportar Resu
23 00000000
24 00000000 ;**********************************************
25 00000000 ; Seccin de datos
26 00000000 ;**********************************************
27 00000000
28 00000000 rea myData, datos readwrite
29 00000000
30 00000000 00 00 Val1 espacio 2
31 00000002 00 00 Val2 espacio 2
4 hace mucho tiempo en la ciencia de la computacin, antes toolchain exista, era a travs de la
lectura de este archivo que el desarrollador podra conocer los errores que se detectaron por el
ensamblador y donde estaban ubicados.
184 Assembly Language Programming
From Listing to Executable: External Modularity 184
9.2.2. Contadores de
colocacin
El ensamblador realiza todos sus trabajos de una manera relativa. Para cada mdulo
se numera cada lnea, como se puede ver en la primera columna de ejemplo 9.4. Esta
primera bsqueda no es muy complicado, ya que consiste en localizar el retorno de
carro de caracteres ASCII en el listado de procesados. Sin embargo, cabe sealar que
tambin se encuentran en lneas vacas, un detalle importante para un sistema de
desarrollo que debe indicar la lnea donde se encuentra un error o para el desarrollo
cuando el anuncio se coloca en paralelo con el cdigo desensamblado. Para cada
seccin, ya que es cdigo o datos - el ensamblador tambin utiliza un contador de
colocacin (la segunda columna de la lst ) cuyo valor inicial es 00000000. La direccin
de la salida de cada seccin se fij provisionalmente en 0. En el caso de una seccin
de cdigo, en la medida en que lleva a cabo su traduccin, el ensamblador aumenta el
valor del contador de colocacin por 2 4, dependiendo del tamao de la instruccin.
El contador de colocacin, por lo tanto, indica la posicin relativa de cada instruccin.
Funciona de la misma manera para cada seccin de datos, el incremento de su contador
interno dependiendo del tamao de la variable.
Valores inmediatos que debe estar codificado en 32 bits en esas zonas especficas
(vase la seccin 4.2.2.3). El ensamblador por lo tanto proporciona las reservas
necesarias por insertar lneas en los lugares as determinado. Estas lneas, en la medida
en que recibir an sin resolver (reubicable datos smbolos), se rellenan con 0s en el
primer pase. En el ejemplo 9.4 hay dos instrucciones para cargar el registro R0 con las
direcciones de Val1 (lnea 41) y Val2 (lnea 43). Estas dos instrucciones
sern codificadas como la lectura del contador de programa (PC) con relativa
indirecto hacia la zona de la piscina literal, una zona de 10 bytes inicializadas a 0 que
podemos ver justo despus de la lnea 52. En el presente caso, dos bytes de relleno se
han agregado a aquellos que son efectivamente necesaria para alinear el literal de
la zona de piscina con un doblemente siquiera abordar.
Para evaluar las etiquetas que busque las instrucciones, en el curso de la primera
pasada el ensamblador examina los operandos de las instrucciones y deduce la longitud
de la palabra de cdigo mediante la traduccin de las instrucciones. Esto nos permite
calcular el valor (que es siempre relativa) de la colocacin de la siguiente instruccin:
el valor de la etiqueta es que la colocacin actual del contador. Este valor no
es definitivo, pues la seccin comienza en 0. El valor real de la etiqueta slo se
conocer despus de la colocacin de memoria (reubicacin) por el linker: las
etiquetas son, por tanto, necesariamente reubicable.
Por smbolos externos, se utiliza un valor que slo puede ser provisional, ya que, en
el mejor de los casos, slo se sabe que el seguimiento de la labor del vinculador.
Podemos ver que para esta pequea seccin de cdigo, el enlazador tendr cinco
traslados a llevar a cabo. Cada uno de estos traslados se caracteriza por su
desplazamiento (segunda columna). La reubicacin puede venir completamente
desde el exterior (Ref indicada en la ltima columna) o de manera relativa, con
respecto a otra seccin del mdulo actual (el nombre de la seccin donde el dato
relativo se encuentra aparece en la ltima columna).
188 Assembly Language Programming
From Listing to Executable: External Modularity 188
9.3.1. Principio de
funcionamiento
Y otra zona como una funcin del estado de dos pasadores, despus de un reinicio. El
principio de esta maniobra es ser capaz de encontrar el vector de reset (y por lo tanto
el cdigo de reinicio) en la memoria Flash interna, en la memoria del sistema o en el
interior de RAM esttica. Aqu la zona de destino del alias es [0x08000000 a
0x10000000], que corresponde a la memoria Flash interna. En este proyecto, las
direcciones bajas estn presentes, incluso si son virtuales.
Recordemos que la arquitectura Cortex-M3 es del tipo Harvard, por lo que hay una
separacin completa del cdigo y los datos de las zonas (vase la figura 1.5). El
vinculador debe, por lo tanto, asignar las secciones de cdigo con direcciones
presentes en el [0x00000000-
0x1FFFFFFF] zona y las secciones de datos con direcciones presentes en el
[0x20000000-0x2FFFFFFF] zona.
Cada seccin de entrada recibidos por el vinculador tiene un tipo y atributos. Los
tres tipos principales son:
- RO () Zona de slo lectura, la cual es una ROM o Flash zona cuyo contenido
tpico es el cdigo. Es comn (en el mundo GNU, por ejemplo) para ver la
abreviatura .texto para este tipo de seccin.
- RW (lectura/escritura) zona, que es una zona de RAM cuyos contenidos tpicos
son los datos inicializados. El sinnimo habitual para esto es .datos;
- ZI () Zona Cero inicializado. Esta es tambin una zona de lectura y escritura que
contendr datos no inicializados. Por defecto ZI zonas estn a 0. Este tipo de seccin
es tambin llamado
.BSS
.
Adems de escribir, hay toda una serie de atributos que, en el caso de aquellos que
se encuentran a la cabeza de Elf archivos, permiten la grabacin de diferentes
informaciones que puedan ser requeridos por el vinculador, carga o incluso la
depuracin simblica.
El tamao del programa: Cdigo = 200 RO-data = 268 RW-data = 12 ZI-data = 516
- el cdigo zona toma 200 bytes. A priori, no hay nada que decir acerca de esto.
Nuestros dos "fuente" archivos contienen slo 22 lneas de instrucciones (seis
para Principal.s y 16 para CallProc.s). Esto genera entre 44 (codificacin slo en el
pulgar) y 88 (codificacin slo en pulgar2) bytes de cdigo, pero el proyecto no se
limita a eso. El cdigo tambin se compone de otros archivos
(STM32F10x.s y resource.lib) y el MicroLib;
- rw- zona de datos tarda 12 bytes. Las listas muestran slo cuatro declaraciones
de variables, la contabilidad de 10 bytes (dos para Coef, dos para val1, dos para Val2 y
cuatro para Resu). Los dos bytes extra son falsos bytes que se agreg debido a que la
secuencia de inicializacin funciona con Word transferencias (y hasta cuatro bytes):
12 bytes correspondientes a tres escrituras. Sin embargo, estn reservadas por el
vinculador para evitar la inicializacin causando modificacin de zonas de memoria
no deseados;
- la Zi-data toma 516 bytes: en nuestro proyecto, estos datos no inicializados estn
relacionadas con la pila del sistema. Esto es creada en el STM32F10x.s archivo (ver
Apndice C), que tiene un tamao de 512 bytes. El extra de cuatro bytes son debido a
la alineacin. En la declaracin de la seccin de opciones que aloja la pila,
encontramos la opcin Align = 3. Esto implica que la direccin de reserva de la pila
debe comenzar en un triplemente siquiera abordar (termina en 3 bits en 0). Si nos
fijamos en la asignacin de memoria en la Figura 9.6, la ltima variable es Coef
almacenado en la direccin 0x2000000C. El primero gratis triplemente incluso
192 Assembly Language Programming
From Listing to Executable: External Modularity 192
Tambin contiene las direcciones de zonas no inicializada (que se borrar al ser reset)
y el nmero de palabras que contienen. Esta tabla es un elemento esencial para
la librera MicroLib y tambin para la aplicacin integrada que permite que el
destino sea reiniciado completamente en determinadas condiciones.
0x20005000
Inicializacin Datos ZI
0
0x20000010
RW Data
Inicializacin 0x20000000
en la pila de
de los datos
0x10000000
Cdig
Regin
0x080000CE
n
de
o
T.V.I Datos RO
0x08000000
Base
Datos (valores
iniciales)
Regin$$$$Base mesa
Cdig
o
T.V.I
0x00000000
9.3.2.3. La "dispersin" de
carga_file
Como acabamos de ver, el enlazador necesita una descripcin de la distribucin de
memoria para saber dnde asignar las diferentes secciones que componen su archivo
ejecutable. En la herramienta de cadena de Keil , Visin es una interfaz que nos
permite introducir las direcciones donde los diferentes bloques de memoria estn
ubicados. Por defecto, una vez dado el controlador del destino, el equipamiento de
las direcciones de memoria del chip (on
194 Assembly Language Programming
From Listing to Executable: External Modularity 194
Esta segunda distribucin de memoria no es muy realista, pero nos permite ver
cmo es posible imponer sobre el vinculador de una distribucin de los distintos
mdulos en las cuatro zonas de memoria. El RO del cdigo y los datos de
la principal.o mdulo tendr que ser asignado en la primera regin de ejecucin que
incluye la ROM EXEC_ROM_1 y EXT_RAM. La segunda regin de
carga (LOAD_ROM_2) recibir todas las secciones de la CallProc.o mdulo. Tambin
se especifica que el resto de RO datos sern asignados a EXEC_ROM_1 regin, que
sern datos no inicializados en el ext_RAM regin y que el resto de los datos
inicializados se colocarn en la regin de SRAM.
Ejecutado. Esto se puede lograr generalmente con el Trace Macrocell unidades que
pueden, en tiempo real y sin causar cualquier alteracin del procesador, analizar y
transmitir datos sobre el comportamiento y el rendimiento de la meta lo observado.
Este enfoque, conocido como no intrusiva en el brazo documentacin, es
particularmente interesante para el sistema de vigilancia, o en el caso de la disfuncin
que es particularmente difcil de localizar o explicar.
Un
Yo
Oh
Rd RM
El ORN{S}<c> {<Rd>} <Rn> # <const.> O NO(const)
Rd RM
El ORN{S}<c> {<Rd>} <Rn> <Rm>
O NO(shift(Rm))
{<cambio ORR>}{S}<c> {<Rd>} <Rn> # Rd Rm o const.
Rd Rm o shift(RM)
<const.>
ORR{S}<c> {<Rd>} <Rn> <Rm> {<Mays>}
205 Assembly Language Programming Appendix A 205
El temporizador
SysTick
Solicitar n15
Valor mximo: 0x00FFFFFF
Valor actual
N
Valor de recarga
Inicio
Ciclo de desbordamiento: (N+1)*h
Clcck
H: perodo de reloj
B.2. SysTick
Cuando SysTick est activo, el valor de este registro disminuye con cada aumento
frente al reloj. Como este temporizador est codificado en 24 bits, los 8 bits ms
significativos en este registro, estn siempre en el 0. Es posible obtener acceso de
lectura para averiguar el valor actual. Sin embargo, si se permite el acceso de
escritura, es limitada: cualquiera que sea el valor que desea escribir, dicho acceso se
traducira en la eliminacin de los contenidos. Por lo tanto, no es posible escribir un
valor a este registro - slo puede borrar uno.
Este registro (vase la Figura B.2) tiene slo cuatro bits significativos:
- COUNTFLAG: cambia a 1 si el recuento registro (Valor Actual) ha cambiado
a 0. Se restablece cuando el procesador lee el registro con este bit decontrol y estado
(), o cuando el procesador escribe un valor en el registro de valor actual. Este bit
permite el uso del temporizador sin utilizar interrupciones, simplemente escaneando
el estado de este bit. Obviamente, esto no es tan eficaz como la interrupcin porque
utiliza el anlisis del tiempo de CPU. Lo que es ms, la deteccin no es simultnea con
el evento, as que la precisin de la medida del tiempo no est garantizada.
- CLKSOURCE: hay dos fuentes de reloj que abastecen el temporizador. La
primera, que es estndar y se corresponde con el bit se establece a 1, consiste
en utilizar el reloj interno del Cortex-M3. No obstante, es posible (con el conjunto de
bits a 0) para especificar
Un reloj externo. Este reloj slo es externo a Cortex-M3 y no el controlador que
integra y debe ser una fraccin (al menos 2,5 veces ms pequea) del interno
212 Assembly Language Programming Appendix B 212
B.3.3. La recarga
registrarse
Este registro, en la medida en que sirve como un valor para restablecer el valor
actual registro, slo puede recibir un valor entre 1 y 0x00FFFFFF. Es posible
asignarle un valor de 0, pero esto impedira el funcionamiento de SysTick. Despus de
un reinicio, el valor de este registro es impredecible.
En este ejemplo, tres procedimientos genricos han sido escritas. Los dos primeros
(_de_inicio y Stop_SysTick SysTick) nos permiten iniciar/detener el temporizador. La
tercera (SysStickSetPeriod) se llama Start_SysTick para calcular el valor de recarga
necesaria para operar el SysTick periodicidad en un valor elegido
(Freq_Request). Suponemos que el reloj SysTick tiene una frecuencia de 8 MHz.
;*************************************************************
; Seccin de datos
;
Zona********************************************
***************** MyData, datos, ALIGN=0
;****************************************************
********* Freq_Quartz EQU 8000000
Freq_Request EQU 100
SysTick_CTRL EQU 0xe000e010
SysTick_LOAD EQU 0xe000e014
SysTick_VAL EQU 0xe000e018
SysTick_CALIB EQU
0xe000e01C Time_VAL DCW
123
;*************************************************************
; Seccin de Programas
;****************************************************
********* MyCode, cdigo de rea, readonly, ALIGN=2
215 Assembly Language Programming Appendix B 215
;************************************************************
*
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SystickSetPeriod PROC
LDR, R1=Freq_Quartz ; leer la frecuencia del reloj
SDIV R2,R1,R0; clculo del nmero n de
; para ciclos de
frecuencia deseada. SUBS R2,R2#1 ; la
modificacin del valor de N - 1
LDR, R3=Systick_LOAD ; de recargar registrarse
STR R2,[R3]
BX LR
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start_SysTick
PROC
Empujar LR
LDR, R0=Freq_Request ; valor de carga del perodo solicitado
LDR, R1=SysTick
STR_VAL R0,[R1]
BL SystickSetPeriod ; la inicializacin de
recargar
LDR, R0=Systick_CTRL
LDR R1,[R0]
ORR R1,R1,#4 ; la eleccin del reloj
ORR R1,R1,#2 ; la autorizacin de interrumpir
ORR R1,R1,#1 ; el lanzamiento del temporizador
STR R1,[R0]
POP PC
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Stop_Systick
PROC
LDR, R0=Systick_CTRL
LDR R1,[R0]
BIC R1,R1,#2 ; Desactiva systick
interrumpir
BIC R1,R1,#1 ; detiene el temporizador
STR R1,[R0]
BX LR
ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
216 Assembly Language Programming Appendix B 216
Handler_SysTick PROC
Exportar SysTick_Handler
LDR, R0= Time_Val; Carga de variable global
LDRH R1,[R0]
SUB R1,#1 ; Decrementacin STRH R1,[R0] ; y el
almacenamiento BX LR
ENDP
;*************************************************************
; Seccin de Programas
;*************************************************************
;*************************************************************
Principales PROC
LDR, R5=time_VAL
Start_Systick BL
R0 LDRH inconclusa,[R5]
CMP, R0#0
BNE inacabado
Stop_Systick BL
ENDP
Apndice C
Ejemplo de un archivo de
"Bootstrap"
C.1. El listado
;//**************************************************************
;/* STM32F10x.s : archivo de inicio para ST STM32F10x dispositivo
serie */
;//**************************************************************
;/* < "Usar el Asistente para configuracin en el men de contexto" >
*/
;/* Este archivo es parte de las herramientas de desarrollo uVision/brazo.
*/
;/* Copyright (c) 2005-2007 Keil Software. Todos los derechos
reservados. */
;/* Este software slo pueden ser usados bajo los trminos de un
documento vlido, actual */
;/* KEIL de licencia de usuario final para obtener una versin compatible de
KEIL
218 Assembly Language Programming Appendix C 218
Software */
/* Las herramientas de desarrollo. Nada le da derecho a utilizar
este software. */
;//**************************************************************
;//**************************************************************
;// <h> Configuracin de pila
;// <o> Pila Tamao (en bytes) <0x0 -0xFFFFFFFF :8>
;// </h>
;//**************************************************************
STACK_SIZE EQU 0x00000200
Pila de rea, NOINIT, READWRITE ALIGN=3
Stack_mem Espacio inicial
STACK_SIZE_sp
;//**************************************************************
;// <h> Configuracin del montn
;//> <o Heap Tamao (en bytes) <0x0 -0xFFFFFFFF
:8>
;// </h>
;//**************************************************************
HEAP_SIZE EQU 0x00000000
rea HEAP, NOINIT, READWRITE ALIGN=3
Heap_base
Heap_Mem espacio heap HEAP_SIZE_limit
Conservar8
Pulgar
;//**************************************************************
; tabla vectorial asignado a la
direccin 0 en el
rea de reset reset,
VectorsD DATOS
CD
READONLY
initial_sp;
parte Vectores de
superior de
exportacin
StackDCD
Reset_Han
dler;
Restablece
r
HandlerD
CD
nmi_Hand
ler; NMI
HandlerD
CD
HardFault
_Handler;
Incidente
duro
HandlerD
CD
MemMana
ge_Handle
219 Assembly Language Programming Appendix C 219
; interrupciones externas
DCD _WWDG IRQHandler ; Vigilante de ventana
DCD _PVD IRQHandler ; PVD mediante lnea EXTI
Detecta
r
DCD _IRQHandler ; tamper antisabotaje
DCD RTC_IRQHandler ; RTC_FLASH ; IRQHandler
DCD DCD Flash RCC_IRQHandler ; RCC
EXTI DCD0_IRQHandler ; EXTI LNEA 0
EXTI DCD1_IRQHandler ; EXTI LNEA 1
EXTI DCD2_IRQHandler ; EXTI LNEA 2
EXTI DCD3_IRQHandler ; EXTI LNEA 3
EXTI DCD4_IRQHandler ; EXTI LNEA 4
DCD 1_DMAChannel IRQHandler ; canal DMA 1
DCD 2_DMAChannel IRQHandler ; canal DMA 2
DCD 3_DMAChannel IRQHandler ; canal DMA 3
DCD 4_DMAChannel IRQHandler ; canal DMA 4
DCD 5_DMAChannel IRQHandler ; canal DMA 5
DCD 6_DMAChannel IRQHandler ; canal DMA 6
DCD 7_DMAChannel IRQHandler ; canal DMA 7
DCD _ADC IRQHandler ; ADC
DCD USB_HP_CAN_TX_IRQHandler ; USB de alta prioridad DCD
USB_LP_CAN_RX0_IRQHandler ; USB de baja prioridad DCD
PUEDE_RX1_IRQHandler ; puede RX1
DCD PUEDE_SCE_IRQHandler ; puede SCE
EXTI DCD9_5_IRQHandler ; EXTI Lnea 9..5
TIM DCD1_BRK_IRQHandler ; TIM1 romper
220 Assembly Language Programming Appendix C 220
;//**************************************************************
AREA |.texto|, Cdigo, READONLY
Reset_Handler PROC
Exportar Reset_Handler [principal]
Importacin dbiles
LDR, R0 = principal
BX R0
ENDP
ENDP
MemManage_Handler
PROC
Exportar MemManage_Handler dbil [B] .
ENDP
BusFault_Handler
PROC
Exportar BusFault_Handler dbil [B] .
ENDP
UsageFault_Handler
PROC
Exportar UsageFault_Handler dbil [B] .
ENDP
SVC_Handler PROC
Exportar SVC_Handler dbil [B] .
ENDP
DebugMon_Handler
PROC
Exportar DebugMon_Handler dbil [B] .
ENDP
PendSV_Handler PROC
Exportar PendSV_Handler dbil [B] .
ENDP
Handler_SysTick
PROC
Exportar SysTick_Handler dbil [B] .
ENDP
Default_Handler PROC
222 Assembly Language Programming Appendix C 222
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_ 1_IRQHandle
r IRQHandler SPI
SPI2_IRQHandler USAR
T1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler EX
TI15_10_IRQHandler RT
CAlarm_IRQHandler
USBWakeUp_IRQHandler
B .
ENDP
Ms ;- - - - - - - - -
IMPORT use_DOS_region_memory
Exportar usuario_initial_stackheap
user_initial_stackheap LDR, R0 = Heap_mem
LDR, R1 =(stack_Mem + STACK_SIZE) LDR,
R2 = (heap_Mem + HEAP_SIZE) LDR, R3 =
Stack_mem
BX LR
ENDIF ;- - - - - - - - -
225 Assembly Language Programming Appendix C 225
C.2. Puntos
importantes
El Ensamblador
GNU
D.1.1. Generalidades
Estos no son estrictamente las directivas mencionadas, pero las siguientes reglas
sintcticas deben respetarse para producir cdigo que sea aceptable para el
ensamblador:
- los comentarios son, como es habitual en C, el conjunto de caracteres entre los
delimitadores '/*' y '*/'. El usuario tiene una segunda oportunidad para insertar un
comentario insertando una '@'. El resto de la lnea (hasta el retorno de carro) entonces
ser ignorado. Esta segunda sintaxis es inevitablemente no muy legible;
- smbolos estn compuestas de varios "carta" caracteres (maysculas o
minsculas), el "nmero" de caracteres (con la excepcin del primer carcter) y los
dos caracteres especiales '.' y '_'. Por favor tenga en cuenta que elcarcter '$', que est
permitido en otros procesadores, no se puede utilizar aqu porque (como #) que indica
el inicio de un valor inmediato.
- Una etiqueta es un smbolo seguido de un ':';
- no hay diferencias a la hora de dar la expresin de un valor numrico distinto de
expresin en cualquier base numrica. Slo las bases 10, 16 y binarios estn permitidos.
Para nmeros binarios, el valor debe ser con el prefijo 0b. Por ejemplo, la
instruccin mov R0, #0b100 se carga el valor 4 en R0.
229 Assembly Language Programming Appendix D 229
No hay una nica directiva para crear secciones. Hay tres directivas que nos
permiten realizar las aberturas (cierres pasar automticamente con la apertura de una
nueva seccin). Estos se identifican por el tipo de seccin que se cree:
- .El texto nos permite abrir una seccin de cdigo.
- .data nos permite abrir una seccin de datos inicializados;
- .bss nos permite abrir una seccin de datos inicialmente ajustado a cero.
Las diferentes directivas que siguen nos permiten hacer varias reservas. No hay
que olvidar que los smbolos que corresponden a esas reservas deben, como para las
etiquetas, estar seguido por ':':
- .la "cadena ascii..." hace una reserva de tantos bytes como hay caracteres en la
cadena despus de esta directiva. Tenga en cuenta que una versin .asciiz existe y est
configurado en 0 al final de la cadena.
- .byte exp1{,exp2}{...} se reserva un byte inicializado por exp. Hay tantas reservas
como expresiones;
- .equ smbolo, expresin acta como un hallazgo (smbolo)/reemplazar
(expresin) en el mdulo actual. Por consiguiente, esta directiva nos permite definir
constantes;
- .Fill repetir {,tamao}{,valor} nos permite crear copias de repetir el
valor valor codificado en tamao de bytes. Si el valor no est definido, el valor ser
cero. Si no se especifica tamao, el tamao predeterminado ser de un byte.
- .hword exp1{,exp2}{...} es equivalente a .byte para reservas de 16 bits (una media
palabra);
230 Assembly Language Programming Appendix D 230
Las siguientes directivas nos permiten llevar a cabo condicionado general (vase la seccin
3.5.2):
- .si la expresin significa que las lneas que siguen se incluirn en la seccin si
Expresin no es falso.
- .endif marca el final de la parte condicional;
- .else nos permite incluir una alternativa compuesta con .Si.
D.1.5. Miscelnea
La inclusin (ver ejemplo D.1) es un ejemplo de una rutina que lleva a cabo estas
inicializaciones. El principio es muy simple, ya que se trata de hacer transferencias de
memoria a memoria (inicializar variables) o restablecimiento de otras zonas
( variables simples). Qu puede ser ms oscuro es la forma en que es posible
recuperar las direcciones y tamaos de estas diferentes zonas. En nuestro caso, que
por cierto es bastante estndar, el Startup_constants tabla que contiene esta
informacin se compone de nombres genricos creados en los archivos de descripcin
de la memoria utilizada por el vinculador. Los nombres de estas direcciones son lo
suficientemente significativas para pasar el comentario. El
prefijo cs significa CodeSourcery.
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nombre : Inicio.asm
Propsito : Sistema de inicializacin de variables y se inicializa la pila
Versin : V1.1
Autor : SDM (INSA de Toulouse)
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.text
.Alinee 2
.inicio global
.Escriba startup, %funcin
Inicio : ;la inicializacin de pila
LDR R0, Startup_constants+12
MOV SP, R0
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Inicializacin de variables inicializadas
R0 : @Destination, R1 : @Source, R2 : size, R3 : counter, R4 : time
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Start_init_RAM:
LDR R0, Startup_constants+16
232 Assembly Language Programming Appendix D 232
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Inicializacin de
variables no inicializadas a cero
R0 : @Destination, R2 : size, R3 : counter, R4 : time
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Start_ZERO_ram :
LDR R0, Startup_constants+0
LDR R2, Startup_constants+8
MOV R3, #0
MOV R4, #0
loop_ZERO_ram :
CMP R3, R2
BCS principal
llamada_ STR [
R4,
R0,#0] Aadir R3,
#4
Agregar R0, #4
B loop_ZERO_ram
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - el final de la rutina de
inicializacin, principal llamada
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Call_main : BL principal
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
233 Assembly Language Programming Appendix D 233
//******************************************************************
/* STM32F10x.s : archivo de inicio para ST STM32F10x dispositivo serie
*/
//***********************************************************
/* Versin : CodeSourcery Sourcery g++ Lite (con CS3) */
/* modificado por SDM (llamada a Inicio) */
//******************************************************************
//******************************************************************
La configuracin de la pila /* */
//******************************************************************
.equ STACK_SIZE, 0x00000200
.data
.alinear 3
.globl cs3_stack_mem
.globl cs3_STACK_SIZE
234 Assembly Language Programming Appendix D 234
_ _cs3_stack_mem :
.Si el STACK_SIZE
.espacio STACK_SIZE
.endif
.tamao cs3_stack_mem, . - cs3_stack_mem
.set cs3_stack_size . - cs3_stack_mem
//******************************************************************
/* */ Configuracin de montn
//******************************************************************
.data
.alinear 3
.globl cs3_heap_start
.globl cs3_heap_end
Cs3_heap_start :
.Si el HEAP_SIZE
.El espacio HEAP_SIZE
.endif
Cs3_heap_end :
//******************************************************************
Tabla de vectores /* */
//******************************************************************
.seccin ".cs3.interrupt_vector"
.globl cs3_interrupt_vector_cortex_m
.tipo cs3_interrupt_vector_cortex_m,
Cs3_interrupt_vector_cortex_m :
.palabra cs3_stack /* */ la parte superior de la pila
.palabra cs3_reset /* */ controlador de Reset
.palabra nmi_Handler : manejador de NMI /* */
.palabra HardFault_Handler duro /* */ controlador de errores
.palabra MemManage_Handler /* */ controlador fallo MPU
.palabra BusFault_Handler /* */ controlador de errores de bus
.palabra UsageFault_Handler /* */ controlador de errores de uso
.palabra reservada 0 /* */
.palabra reservada 0 /* */
235 Assembly Language Programming Appendix D 235
.palabra reservada 0 /* */
.palabra reservada 0 /* */
.palabra SVC_Handler Handler SVCall /* */
.palabra DebugMon_Handler /* */ controlador de Monitor de depuracin
.palabra reservada 0 /* */
.palabra PendSV_Handler Handler PendSV /* */
.palabra SysTick_Handler Handler SysTick /* */
//******************************************************************
/* */ interrupciones externas
//******************************************************************
.palabra WWDG_IRQHandler /* */ Vigilante de ventana
.palabra EVP_IRQHandler /* PVD mediante EXTI
detectar lnea */
...
Tabla incompleta....
.tamao __cs3_interrupt_vector_cortex_m, . -
cs3_interrupt_vector_cortex_m
//******************************************************************
Controlador de Reset /* */
//******************************************************************
.text
.globl cs3_reset_cortex_m
.tipo cs3_reset_cortex_m, %funcin
Cs3_reset_cortex_m :
LDR, R0=Inicio
BX R0
.text
//******************************************************************
Controladores de excepcin /* */
//******************************************************************
.dbil nmi_Handler
.Escriba nmi_Handler, %funcin
NMI_Handler :
B .
.tamao nmi_Handler, . - NMI_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
236 Assembly Language Programming Appendix D 236
.dbil HardFault_Handler
.escriba HardFault_Handler, %funcin
Handler_HardFault :
B.
.tamao HardFault_Handler, . - HardFault_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
.dbil MemManage_Handler
.escriba MemManage_Handler, %funcin
Handler_MemManage :
B .
.escriba MemManage_Handler, . - MemManage_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
.dbil BusFault_Handler
.escriba BusFault_Handler, %funcin
Handler_BusFault :
B.
.escriba BusFault_Handler, . - BusFault_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
.dbil UsageFault_Handler
.escriba UsageFault_Handler, %funcin
Handler_UsageFault :
B.
.escriba UsageFault_Handler, . - UsageFault_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
. SVC_Handler dbil
.tipo SVC_Handler, %funcin
SVC_Handler :
B .
.tipo SVC_Handler, . - SVC_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
.dbil DebugMon_Handler
.escriba DebugMon_Handler, %funcin
Handler_DebugMon :
B .
.escriba DebugMon_Handler, . - DebugMon_Handler
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
.dbil PendSV_Handler
237 Assembly Language Programming Appendix D 237
Brazo [06a] UnaRM, ARMv7M en el nivel de aplicacin manual de referencia, el brazo limitada,
Cambridge,
2006.
Brazo [06b] UnaRM, ARMv7-M Architecture Reference Manual, el brazo limitada, Cambridge,
2006.
Brazo [06c] UnaRM, Cortex-M3 Technical Reference Manual, el brazo limitada, Cambridge,
2006. [10] Una BRAZORM, herramientas de compilacin de RealView - Ensamblador, el
brazo gua limitada, Cambridge,
2010.
[COD] CODASOURCERY, http://www.codesourcery.com.
[KEI] KEIL, http://www.keil.com.
YIU [07] YIU J., La Gua Definitiva para el ARM Cortex-M3, Elsevier, Amsterdam, 2007.
ndice
BL, 20, 21, 26, 35, 43, 44, 51, 56, 65, D
78, 92, 93, 95, 104, 105, 119-121,
Datos
123-125, 129, 132, 134, 140, 176,
Cadena, 36, 38, 94, 95, 175, 185,
183, 187, 202, 214, 216, 231
193, 227, 229,
BLX, 78, 96, 97, 202
113 de registro
bus
Seccin, 36, 47, 98, 136, 176, 179,
(AHB), 5
180, 185, 189, 196
AHB-Lite, 5
Pila, 1, 18-20, 27, 40, 41, 51, 81,
Fallo, 77, 153-156, 158, 161, 167,
83, 85, 115 - 117, 120, 126-131,
170, 217,
133, 134, 136, 137, 139, 140,
233, 5, 6 matriz
142-144, 148, 149, 157, 168,
El MPP, 5
169, 182, 191, 217, 225, 231,
BX, 20, 21, 26, 35, 51, 56, 65, 77, 78,
233
96, 105, 119-121, 124, 125, 129,
Estructura, 32, 60, 61, 111, 114
132, 134, 137, 140, 143, 150, 155,
DCI 41
157, 169, 177, 202, 214, 217, 233,
Estado de depuracin, 16, 17
C Depurador, 77, 174, 185, 197, 230
Llevar la bandera C, 52, 70, 71 la depuracin, 9, 85, 87, 158, 188-
CBNZ, 79, 202 190,
CBZ, 79, 202 196, 198
Lista encadenada, 143, 145 Desmontaje, 25, 26, 54, 225
CLRX, 85 doble
CLZ, 71, 202 Direccionamiento
CM3Core, 3, 15 indirecto, 97, 131,
CMN, 76, 52, 202 59, 131 sealador
CMP, 52, 65, 66, 76, 79, 89, 90-93, Osd, 85
95, 99, 100, 103-105, 107-111, DWT, 6
121, 124, 125, 129, 132, 134, 157, dinmica
202, 216, 231 Asignacin de
del cdigo datos, 114,
Direccin, 22, 198 111, 127
Seccin, 57, 179, 180, 185, 189
Comn, 40, 41, 136, 196, 106-111 E, F, G
condicin condicin compuesta, 64
a 66, 76, 79, 88, 90, 98 EOR, 52, 71, 202
99, 102, 106-109 EQU, 30, 39, 40, 48, 128, 179, 214,
condicionado 217
General, 43 jump, El ETM, 6
65, 89, 102 Exportacin, 39, 45, 149, 150, 151, 176,
CPD, 85 177, 181-183, 214, 217
CPS, 85 externo
Desarrollo transversal, 196 La modularidad, 88,
175, 180 de
referencia
Archivo, 2, 25, 27, 28, 39, 42, 44, 48, 88,
173, 175, 178, 179, 182 a 185, 187-
197, 217, 228, 233
243 Assembly Language Programming Index 243
La memoria PLD, 86
Direccin, 9, 13, 21, 29, 32, 39, 97, PLI, 86
147-149, 154, 170, 182, 192, POP, 78, 84, 104, 105, 120, 121, 124,
193, 153 Fallo de gestin 125, 129, 132-134, 137, 140, 143,
El MLA, 67 169, 205, 214
MLS, 67 Conservar8, 41, 217, 123,
Nemotcnica, 2, 31, 35, 37, 58, 65, argumentos del procedimiento
72, de promocin de 137, 58, 73,
78, 83, 84 81, 205
Programacin modular, 119, 123, 178 Empujar, 19, 85, 104, 105, 120, 121,
MOV, 2, 30, 33, 48, 53-55, 58, 75, 124, 125, 129, 132-134, 137, 140,
95, 100-102, 121, 124, 125, 129, 143, 205, 214
130, 132, 134, 137, 140, 143, 163,
204, 228, 231 R
MOVT, 75, 204
RAM, 9, 13, 18, 39, 188, 189, 195-
MPU, 4, 6, 217, 233
197
MRC, 86
RBIT, 72 205
MRRC, 86
registrarse
Seora, 24, 51, 75, 157, 170
APSR, 23, 24, 75, 76
MSR, 24, 51, 76, 170, 204
Registro base, 57, 60-62, 64
MUL, 67, 68, 177, 204
BasePri, 170, 171
MVN, 71, 204
BFAR, 154
CONTROL, 16, 18, 75, 76
N, O, P
DHCSR, 17
El desarrollo nativo, 173, 196 EPSR, 23, 24, 31, 75, 76, 155
NEG, 72, 90, 101, 102, 204 FaultMask, 170
anidados, 4, 15, 119, 120, 126, FAULTMASK, 18, 75, 76, 85
127, registros generales, 19, 23, 49, 51,
133, 136, 140, 146, 148, 166, 169 64
NMI, 23, 147-149, 151, 153, 158, 123, 136
161, 170, 217, 233 Registros de alta, 19
NOP, 20, 21, 26, 32, 40, 56, 66, 182, ICER, 160
204 El ISER, 160
Expresin numrica, 36 ISPER, 161, 166, 171
NVIC, 4, 15, 148, 150, 153, 154, 156, ISR, 23, 149
159, 160 a 162, 165-167, 169-171 Registra baja, 19
opcode, 18, 22, 50, 53, 157, 186, LR, 18, 20, 21, 26, 35, 51, 56, 78,
187 operando, 30, 32, 33, 39, 47, 52- 84, 85, 96, 104, 105, 119-121,
54, 124, 125, 129, 132, 134, 137,
58, 64, 68, 69, 187 140, 143, 155, 157, 168, 169,
El ORN, 52, 72, 204 177, 194, 202, 214, 217
ORR, 52, 72, 204, MSP (SP_Main), 19
214, 196, NVIC_dpi, 161, 162
superposicin NVIC_SHCSR, 154
PENDSV, 158
Perifrico, 4, 5, 7 a 10, 154, 160
245 Assembly Language Programming Index 245
NVIC_SHPR, 161, 162 Puntero, 18, 27, 51, 81, 116, 117,
PC, 18, 19, 21, 22, 54, 55, 57, 58, 120, 148, 149
59, 75, 78-85, 104, 105, 119, STC, 86
120, 155, 157, 167-169, 186, STM, 58, 82-85, 206
197, 202, 203, 207, 214 STMDB, 82, 84, 206
PRIMASK, 18, 75, 76, 85 STR, 47, 57, 58, 60, 81, 82, 121, 124,
R0 a R12, 18, 19, 49 125, 129, 132, 134, 137, 140, 143,
R13 o SP, 18, 19, 51, 148 206, 214, 231
R14, 18-20, 51 STRB, 58, 81, 101, 102, 137, 143,
R15, 18, 21, 51, 82, 149 163
UFSR, 153, 155, 156, 168 STRBT, 85
en la tabla de reubicacin, Std, 58, 84, 206
185-190 STREX, 85
Requerir8, 41 STRH, 58, 60, 81, 100, 137, 143,
Reset, 4, 10, 16, 27, 143, 147-151, 177, 214
153, 158, 160, 161, 165, 167, 170, STRSBT, 85
182, 185, 189, 192, 211, 212, 217, SUB, 52, 67, 69, 80, 130, 134, 137,
225, 231, 233 138, 140, 143, 206, 214
REV, 72, 73, 205 SVC, 86, 156-158, 161, 217, 233
REV16, 73, 205 SVCall, 156, 157, 217, 233
REVSH, 73, 205 SWI, 86
RN, 39, 49 Switch Case, 94-98
RO-datos, 191, 192, 194 SXTB, 74, 206
ROR, 52, 73, 74, 205 SXTH, 74, 206
Derrota, 41, 42 Smbolo, 21, 26, 27, 29, 30, 40-45, 48,
RRX, 52, 73 49, 64, 65, 112, 179, 180-182,
RSB, 52, 67, 69, 72 185-190, 197, 228-230
RW-zona de datos, 191 Tabla, 27, 43, 180, 181, 185-189,
197, 230
S Pila del sistema, 1, 2, 19, 27, 28, 41, 84,
85, 104, 114, 117, 120, 125, 126,
SBC, 52, 68, 80
133-136, 148, 157, 168, 175, 191,
SBFX, 73, 74, 205, 206
197, 225, 231
SDIV, 68, 214
SYSTICK, 212
SEV, 86
Simple ejecutable, 175, 194
SMLAL, 67, 68, 205
T, U
SMULL, 68, 205 Cola-encadenamiento, 169, 170
SSAT, 23, 52, 68, 205 TBB, 80, 95, 96, 207
Pila, 1, 18-20, 27, 40, 41, 51, 81, 83 TBH, 80, 95, 96, 207
85, 115 - 117, 120, 126-131, Eqt, 52, 77, 207
133 Modo de subproceso, 15, 16, 19, 148, 168,
134, 136, 137, 139, 140, 142-144, 169
148, 149, 157, 168, 169, 182, 191,
217, 225, 231, 233
246 Assembly Language Programming Index 246