arm_aspectoprog
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
arm_aspectoprog [2020/05/13 03:10] – andrew | arm_aspectoprog [2020/05/13 22:30] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 31: | Línea 31: | ||
* **Sección de datos**. Viene identificada por la directiva //.data//. En esta zona se definen todas las variables que utiliza el programa con el objeto de reservar memoria para contener los valores asignados. Hay que tener especial cuidado para que los datos estén alineados en palabras de 4 bytes, sobre todo después de las cadenas. Alinear significa rellenar con ceros el final de un dato para que el siguiente dato comience en una dirección múltiplo de 4 (con los dos bits menos significativos a cero). Los datos son modificables. | * **Sección de datos**. Viene identificada por la directiva //.data//. En esta zona se definen todas las variables que utiliza el programa con el objeto de reservar memoria para contener los valores asignados. Hay que tener especial cuidado para que los datos estén alineados en palabras de 4 bytes, sobre todo después de las cadenas. Alinear significa rellenar con ceros el final de un dato para que el siguiente dato comience en una dirección múltiplo de 4 (con los dos bits menos significativos a cero). Los datos son modificables. | ||
- | * **Sección de código**. Se indica con la directiva //.text//. En esta parte se escribe el programa y las instrucciones en ensamblador que operan con los datos definidos en la sección anterior. Las instrucciones son representaciones nemotécnicas del juego de instrucciones del procesador. | + | * **Sección de código**. Se indica con la directiva //.text//. En esta parte se escribe el programa y las instrucciones en ensamblador que operan con los datos definidos en la sección anterior. |
De estas dos secciones la única que obligatoriamente debe existir es la sección .text (o sección de código). En nuestro ejemplo comprobamos que están las dos. | De estas dos secciones la única que obligatoriamente debe existir es la sección .text (o sección de código). En nuestro ejemplo comprobamos que están las dos. | ||
Línea 41: | Línea 41: | ||
Un dato es una entidad que aporta un valor numérico, que puede expresarse en distintas bases o incluso a través de una cadena. | Un dato es una entidad que aporta un valor numérico, que puede expresarse en distintas bases o incluso a través de una cadena. | ||
- | Para representar números tenemos 4 bases. La más habitual es en su forma decimal, la cual no lleva ningún delimitador especial. Luego tenemos otra muy útil que es la representación hexadecimal, | + | Para representar números tenemos 4 bases: |
+ | * La más habitual es en su forma decimal, la cual no lleva ningún delimitador especial. | ||
+ | |||
+ | mov r0, #90 | ||
+ | |||
+ | * Luego tenemos otra muy útil que es la representación hexadecimal, | ||
+ | |||
+ | mov r1, #0xff | ||
+ | |||
+ | * Otra interesante es la binaria, que emplea el prefijo 0b antes del número en binario. | ||
+ | |||
+ | mov r2, # | ||
+ | |||
+ | * La cuarta y última base es la octal, que usaremos en raras ocasiones y se especifica con el prefijo 0. Sí, un cero a la izquierda de cualquier valor convierte en octal dicho número. Por ejemplo 015 equivale a 13 en decimal. | ||
+ | |||
+ | mov r3, #015 | ||
+ | |||
+ | Todas estas bases pueden ir con un signo menos delante, codificando el valor negativo en complemento a dos. Para representar carácteres y cadenas emplearemos las comillas simples y las comillas dobles respectivamente. | ||
+ | |||
+ | Ver más información sobre los tipos de datos que podemos encontrarnos en el lenguaje ensamblador de ARM en la sección [[arm_tipodatos|Tipos de Datos]] | ||
==== Directivas ==== | ==== Directivas ==== | ||
Línea 51: | Línea 70: | ||
* // | * // | ||
- | a1: .byte 1 /* tipo byte, inicializada a 1 */ | + | |
- | var2 : .byte ’A’ | + | var2 : .byte ’A’ |
- | var3 : .hword 25000 | + | var3 : .hword 25000 /* tipo hword (16 bits ) a 25000 */ |
- | var4 : .word 0x12345678 /* tipo word de 32 bits */ | + | var4 : .word 0x12345678 |
| | ||
| | ||
- | dat1 : .zero 300 /* 300 bytes de valor cero */ | + | dat1 : .zero 300 |
- | dat2 : .space 200, 4 /* 200 bytes de valor 4 */ | + | dat2 : .space 200, 4 |
La directiva **.equ** (ó .set) es utilizada para asignar un valor a una constante simbólica: | La directiva **.equ** (ó .set) es utilizada para asignar un valor a una constante simbólica: | ||
Línea 64: | Línea 83: | ||
.equ N, -3 /* en adelante N se sustituye por -3 */ | .equ N, -3 /* en adelante N se sustituye por -3 */ | ||
- | * // | + | * // |
+ | |||
+ | **.text y .data** sirven para delimitar las distintas secciones de nuestro módulo. | ||
+ | |||
+ | **.align alineamiento** es para alinear el siguiente dato, rellenando con ceros, de tal forma que comience en una dirección múltiplos del número que especifiquemos en alineamiento, | ||
a1: .byte 25 /* definimos un byte con el valor 25 */ | a1: .byte 25 /* definimos un byte con el valor 25 */ | ||
| | ||
a2: .word 4 /* variable alineada a tama ño palabra */ | a2: .word 4 /* variable alineada a tama ño palabra */ | ||
+ | |||
+ | **.include** para incluir un archivo fuente dentro del actual. **.global** hace visible al enlazador el símbolo que hemos definido con la etiqueta del mismo nombre. | ||
+ | |||
+ | * // | ||
+ | |||
+ | .equ pies, 9 /* definimos a 9 la constante pies */ | ||
+ | .equ yardas, pies /3 /* calculamos las yardas = 3 */ | ||
+ | .equ pulgadas, pies *12 /* calculamos pulgadas = 108 */ | ||
+ | |||
+ | * // | ||
+ | |||
+ | | ||
+ | mul aux, input, input | ||
+ | add output, aux, #1 | ||
+ | .endm | ||
+ | |||
+ | Esta macro se llama CuadM1 y tiene tres parámetros (input, aux y output). Si posteriormente usamos la macro de la siguiente forma: | ||
+ | |||
+ | | ||
+ | |||
+ | el ensamblador se encargará de expandir la macro, es decir, en lugar de la macro coloca: | ||
+ | |||
+ | mul r8, r1, r1 | ||
+ | add r0, r8, #1 | ||
+ | |||
+ | No hay que confundir las macros con los procedimientos. Por un lado, el código de un procedimiento es único, todas las llamadas usan el mismo, mientras que el de una macro aparece (se expande) cada vez que se referencia, por lo que ocuparán más memoria. Las macros serán más rápidas en su ejecución, pues es secuencial, frente a los procedimientos, | ||
==== Símbolos ==== | ==== Símbolos ==== | ||
Línea 81: | Línea 130: | ||
Las instrucciones del as (a partir de ahora usamos as para referirnos al ensamblador) responden al formato general: | Las instrucciones del as (a partir de ahora usamos as para referirnos al ensamblador) responden al formato general: | ||
- | | + | |
De estos campos, sólo el nemónico (nombre de la instrucción) es obligatorio. En la sintaxis del **as** cada instrucción ocupa una línea terminando preferiblemente con el ASCII 10 (LF), aunque son aceptadas las 4 combinaciones: | De estos campos, sólo el nemónico (nombre de la instrucción) es obligatorio. En la sintaxis del **as** cada instrucción ocupa una línea terminando preferiblemente con el ASCII 10 (LF), aunque son aceptadas las 4 combinaciones: | ||
Línea 89: | Línea 139: | ||
El Campo // | El Campo // | ||
- | El campo //Nemotécnico// (ldr en el ejemplo) es una forma abreviada de nombrar la instrucción del procesador. Está formado por caracteres alfabéticos (entre 1 y 11 caracteres). | + | El campo //Nemónico// (ldr en el ejemplo) es una forma abreviada de nombrar la instrucción del procesador. Está formado por caracteres alfabéticos (entre 1 y 11 caracteres). |
El campo // | El campo // | ||
- | El campo Comentario es opcional (r1 <- &var1, en el ejemplo) y debe comenzar con la secuencia /* y acabar con */ al igual que los comentarios multilínea en C. No es obligatorio que estén a la derecha de las instrucciones, | + | Para más detalles sobre el nemónico y los operandos ver [[arm_intro_instrucc|Formato de las instrucciones de Ensamblador ARM]]) |
+ | |||
+ | |||
+ | El campo //Comentario// es opcional (r1 <- &var1, en el ejemplo) y debe comenzar con la secuencia /* y acabar con */ al igual que los comentarios multilínea en C. No es obligatorio que estén a la derecha de las instrucciones, | ||
Cada instrucción del **as** se refiere a una operación que puede realizar el microprocesador. También hay pseudoinstrucciones que son tratadas por el preprocesador como si fueran macros y codifican otras instrucciones, | Cada instrucción del **as** se refiere a una operación que puede realizar el microprocesador. También hay pseudoinstrucciones que son tratadas por el preprocesador como si fueran macros y codifican otras instrucciones, | ||
Línea 107: | Línea 160: | ||
- | ---- | ||
- | <color # | ||
~~NOCACHE~~ | ~~NOCACHE~~ | ||
({{counter|total}}) | ({{counter|total}}) | ||
×
iphelper toolbox
you see this when javscript or css is not working correct
Untested
arm_aspectoprog.1589339439.txt.gz · Última modificación: 2020/05/13 03:10 (editor externo)