Herramientas de usuario

Herramientas del sitio


arm_aspectoprog

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
arm_aspectoprog [2020/05/13 03:29] – [Directivas] andrewarm_aspectoprog [2020/05/13 22:30] (actual) – editor externo 127.0.0.1
Línea 37: Línea 37:
 Un módulo fuente, como el del ejemplo, está formado por instrucciones, datos, símbolos y directivas. Estos elementos se describen a continuación. Un módulo fuente, como el del ejemplo, está formado por instrucciones, datos, símbolos y directivas. Estos elementos se describen a continuación.
    
-==== Instrucciones ==== 
-Las instrucciones son representaciones nemotécnicas del juego de instrucciones del procesador (ver más detalles en [[arm_intro_instrucc|Introducción a las instrucciones ARM]]) 
  
 ==== Datos ==== ==== Datos ====
Línea 44: Línea 42:
  
 Para representar números tenemos 4 bases: Para representar números tenemos 4 bases:
-  * La más habitual es en su forma decimal, la cual no lleva ningún delimitador especial. +  * 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, que indicaremos con el prefijo 0x.    * Luego tenemos otra muy útil que es la representación hexadecimal, que indicaremos con el prefijo 0x. 
 +
 +    mov r1, #0xff
 +
   * Otra interesante es la binaria, que emplea el prefijo 0b antes del número en binario.    * Otra interesante es la binaria, que emplea el prefijo 0b antes del número en binario. 
 +
 +    mov r2, #0b11111111
 +
   * 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.    * 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. 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.
Línea 74: Línea 83:
      .equ N, -3 /* en adelante N se sustituye por -3 */      .equ N, -3 /* en adelante N se sustituye por -3 */
  
-  * //Directivas de control:// **.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, normalmente potencia de 2. Si no especificamos alineamiento por defecto toma el valor de 4 (alineamiento a palabra):+  * //Directivas de control://  
 + 
 +**.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, normalmente potencia de 2. Si no especificamos alineamiento por defecto toma el valor de 4 (alineamiento a palabra):
  
      a1: .byte 25   /* definimos un byte con el valor 25 */      a1: .byte 25   /* definimos un byte con el valor 25 */
          .align    /* directiva que rellena con 3 bytes */          .align    /* directiva que rellena con 3 bytes */
      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.
 +
 +  * //Directivas de operando:// Se aplican a los datos en tiempo de compilación. En general, incluyen las operaciones lógicas &, |, , aritméticas +, -, *, /, % y de desplazamiento <, >, <<, >>:
 +
 +     .equ pies, 9            /* definimos a 9 la constante pies */
 +     .equ yardas, pies /3    /* calculamos las yardas = 3 */
 +     .equ pulgadas, pies *12 /* calculamos pulgadas = 108 */
 +
 +  * //Directivas de Macros//: Una //.macro// es un conjunto de sentencias en ensamblador (directivas e instrucciones) que pueden aparecer varias veces repetidas en un programa con algunas modificaciones (opcionales). Por ejemplo, supongamos que a lo largo de un programa realizamos varias veces la operación n<sup>2</sup>+1 donde n y el resultado son registros. Para acortar el código a escribir podríamos usar una macro como la siguiente:
 +
 +     .macro CuadM1 input, aux, output
 +            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:
 +
 +     CuadM1 r1, r8, r0
 +
 +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, ya que implican un salto cuando aparece la llamada y un retorno cuando se termina. La decisión de usar una macro o un procedimiento dependerá de cada situación en concreto, aunque las macros son muy flexibles (ofrecen muchísimas más posibilidades de las comentadas aquí).
  
 ==== Símbolos ==== ==== Símbolos ====
Línea 91: 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:
  
-     Etiqueta : Nemotécnico Operando/     /* Comentario */+     Etiqueta : Nemónico Operando/     /* Comentario */ 
  
 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: CR, LF, CR LF y LF CR. Los campos se separan entre sí por al menos un carácter espacio (ASCII 32) o un tabulador y no existe distinción entre mayúsculas y minúsculas. 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: CR, LF, CR LF y LF CR. Los campos se separan entre sí por al menos un carácter espacio (ASCII 32) o un tabulador y no existe distinción entre mayúsculas y minúsculas.
Línea 99: Línea 139:
 El Campo //etiqueta//, si aparece, debe estar formado por una cadena alfanumérica. La cadena no debe comenzar con un dígito y no se puede utilizar como cadena alguna palabra reservada del **as** ni nombre de registro del microprocesador. En el ejemplo, la etiqueta es **main:**. El Campo //etiqueta//, si aparece, debe estar formado por una cadena alfanumérica. La cadena no debe comenzar con un dígito y no se puede utilizar como cadena alguna palabra reservada del **as** ni nombre de registro del microprocesador. En el ejemplo, la etiqueta es **main:**.
  
-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 //Operando/s// indica dónde se encuentran los datos. Puede haber 0, 1 ó más operandos en una instrucción. Si hay más de uno normalmente al primero se le denomina destino (salvo excepciones como str) y a los demás fuentes, y deben ir separados por una coma. Los operandos pueden ser registros, etiquetas, valores inmediatos o incluso elementos más complejos como desplazadores/rotadores o indicadores de pre/post-incrementos. En cualquiera de los casos el tamaño debe ser una palabra (32 bits), salvo contadas excepciones como ldr y str donde puede ser media palabra (16 bits) o un byte (8 bits). En el ejemplo r1 es el operando destino, de tipo registro, y puntero_var1 es el operando fuente, una etiqueta. Tanto r1 como puntero_var1 hacen referencia a un valor de tamaño palabra (32 bits). El campo //Operando/s// indica dónde se encuentran los datos. Puede haber 0, 1 ó más operandos en una instrucción. Si hay más de uno normalmente al primero se le denomina destino (salvo excepciones como str) y a los demás fuentes, y deben ir separados por una coma. Los operandos pueden ser registros, etiquetas, valores inmediatos o incluso elementos más complejos como desplazadores/rotadores o indicadores de pre/post-incrementos. En cualquiera de los casos el tamaño debe ser una palabra (32 bits), salvo contadas excepciones como ldr y str donde puede ser media palabra (16 bits) o un byte (8 bits). En el ejemplo r1 es el operando destino, de tipo registro, y puntero_var1 es el operando fuente, una etiqueta. Tanto r1 como puntero_var1 hacen referencia a un valor de tamaño palabra (32 bits).
  
-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, aunque es lo habitual. También es común verlos al comienzo de una función (ocupando varias líneas) para  explicar los parámetros y funcionalidad de la misma.+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, aunque es lo habitual. También es común verlos al comienzo de una función (ocupando varias líneas) para  explicar los parámetros y funcionalidad de la misma.
  
 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, como lsl rn, #x que codifica mov rn, rn, lsl #x, o bien push/pop que se traducen instrucciones stm/ldm más complejas y difíciles de recordar para el programador. Podemos agrupar el conjunto de instrucciones del **as**, según el tipo de función que realice el microprocesador, en las siguientes categorías: 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, como lsl rn, #x que codifica mov rn, rn, lsl #x, o bien push/pop que se traducen instrucciones stm/ldm más complejas y difíciles de recordar para el programador. Podemos agrupar el conjunto de instrucciones del **as**, según el tipo de función que realice el microprocesador, en las siguientes categorías:
Línea 117: Línea 160:
  
  
----- 
-<color #22b14c>[[arm_aspectoprog2|Continua siguiente página]]</color> 
  
 ~~NOCACHE~~ ~~NOCACHE~~
 ({{counter|total}}) ({{counter|total}})
  
× iphelper toolbox

you see this when javscript or css is not working correct

Untested
IP Address:
First usable:
Subnet:
Last usable:
CIDR:
Amount of usable:
Network address:
Reverse address:
Broadcast address:

arm_aspectoprog.1589340596.txt.gz · Última modificación: 2020/05/13 03:29 por andrew