Herramientas de usuario

Herramientas del sitio


arm_inst_mov

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_inst_mov [2020/04/20 13:21] marianoarm_inst_mov [2020/05/27 03:04] (actual) – editor externo 127.0.0.1
Línea 2: Línea 2:
 ===== Instrucciones de movimientos de datos ===== ===== Instrucciones de movimientos de datos =====
  
-==== MOV ====+==== mov ====
  
-La instrucción MOV copia el valor de Op2 en Op1. En ciertas circunstancias, el ensamblador puede sustituir MVN por Mov, o Mov por Mvn, hay que tenerlo en cuenta cuando debuggeamos. 
-  
-mov{s}{cond} op1, op2 
  
-mov {cond} Rd, #inmediato+La instrucción **mov (inmediato)** escribe un valor inmediato <const> en el registro destino <Rd>
  
 +**MOVS <Rd>, #<const>**
  
-Ejemplos+El registro de flags (Registro CPSR) es actualizado según el resultado. 
  
-     mov  r0, r1       // Copia en el registro r0 el contenido del registro r1 
-     mov  r0, #2      // Carga en el registro r0 constante 2 en decimal por defecto 
-      
  
-**MOV{S}{cond}**:+#<const> es un valor en el rango 0-255 
 + 
 +Ejemplo 
 +     movs  r0, #2      // Carga en el registro r0 la constante 2 
 + 
 + 
 +==== MOV (registro)==== 
 + 
 +Copia un registro fuente <Rm> al registro destino <Rd> 
 +En ciertas circunstancias, el ensamblador puede sustituir MOV por MVN, hay que tenerlo en cuenta cuando debuggeamos. 
 +  
 +**MOV{S} <Rd>, <Rm>**
  
 {S} Es un sufijo opcional. Si se especifica, se actualiza el registro de flags (Registro CPSR) de acuerdo al  resultado de la operación. {S} Es un sufijo opcional. Si se especifica, se actualiza el registro de flags (Registro CPSR) de acuerdo al  resultado de la operación.
  
-N Z C+<Rd> Es el registro destino. Puede ser PC ó SP. Si es PC entonces la instrucción causa un salto a la dirección contenida en <Rm>
  
-{cond} es condicional optativo, en general no lo usamos +<Rm> Es el registro fuente. Puede ser PC ó SP.
-#inmediato: es un valor en el rango 0-65535.+
  
  
-==== PUSH y POP ====+Ejemplos
  
-Push: Guarda registro/registros en el stack. El puntero a la pila, es el reg r13, por convencion lo llamamos SP (stack pointer). Este registro siempre apunta a la palabra del tope de la pilaúltima palabra ingresada en el stack.+     MOV   r0, r1      // Copia en el registro r0 el contenido del registro r1 
 +     MOVS  r0r3      // Copia en el registro r0 el contenido del registro r3 y actualiza cpsr 
 +      
 +==== ldr y str ====
  
-Popdesapila una palabraindicada por sp.+En la arquitectura ARM los accesos a memoria se hacen mediante instrucciones específicas ldr y str (luego veremos las variantes ldm, stm y las preprocesadas push y pop). El resto de instrucciones toman operandos desde registros o valores inmediatos, sin excepciones. En este caso la arquitectura nos fuerza a que trabajemos de 
 +un modo determinadoprimero cargamos los registros desde memorialuego procesamos el valor de estos registros con el amplio abanico de instrucciones del ARM, para finalmente volcar los resultados desde registros a memoria. 
 +Existen otras arquitecturas como la Intel x86, donde las instrucciones de procesado nos permiten leer o escribir directamente de memoria. Ningún método es mejor que otro, todo es cuestión de diseño. Normalmente se opta por direccionamiento a memoria en instrucciones de procesado en arquitecturas con un número reducido de registros, donde se emplea la memoria como almacén temporal.
  
-[[arquitectura_arm:componentes_fisicos._registros_flags_pila._direcciones_de_memoria_logicas_y_fisicas#El Stack o pila y las instrucciones ldm y stm| +En nuestro caso disponemos de suficientes registros, por lo que podemos hacer el procesamiento sin necesidad de interactuar con la memorialo que por otro lado también es más rápido.
-Más info sobre el funcionamiento del stackclick acá]]+
  
 +==== PUSH y POP ====
  
 +Push guarda/almacena uno ó una lista de registros <listreg> en el stack. El puntero a la pila, es el reg r13, por convencion lo llamamos SP (stack pointer). Este registro siempre apunta a la palabra del tope de la pila, última palabra ingresada en el stack.
  
-PUSH{cond} listreg+**PUSH <listreg>**
  
-POP{cond} listreg+ 
 +Pop desapila uno ó una lista de registros <listreg> almacenados en el stack, para acceder a ello usa el registro sp. 
 + 
 +**POP <listreg>**
  
 Ejemplos: Ejemplos:
Línea 51: Línea 65:
      pop  r2      pop  r2
      pop  r1      pop  r1
-     + 
 + 
 + 
 +[[arquitectura_arm:componentes_fisicos._registros_flags_pila._direcciones_de_memoria_logicas_y_fisicas#El Stack o Pila| Más info sobre el funcionamiento del stack, click acá]] 
 + 
 Observemos que el orden de recuperación de registros es inverso a como lo guardamos. En ARM es mucho más fácil que otros procesadores (por ejemplo 8086). Gracias a las instrucciones de carga/escritura múltiple podemos poner los registros en una lista, empleando una única instrucción. :-D Observemos que el orden de recuperación de registros es inverso a como lo guardamos. En ARM es mucho más fácil que otros procesadores (por ejemplo 8086). Gracias a las instrucciones de carga/escritura múltiple podemos poner los registros en una lista, empleando una única instrucción. :-D
  
 +     push {r1, r2, r4}
 +     /* código que modifica los registros r1, r2 y r4 */
 +     pop {r1, r2, r4}
 +     
 +En este caso el orden no es relevante, el procesador siempre usa el orden ascendente para el push y el descendente para el pop, aunque nosotros por legibilidad siempre escribiremos los registros en orden ascendente.
  
  
  
---- //[[mariano.vargas@gmail.com|Mariano]] // \\+***Observación***: Tenemos las instrucciones stm y ldm que son mucho más potentes que las instrucciones push y popEl ensamblador de forma transparente traducirá a stm y ldm las instrucciones push y pop. 
 + 
 +Aunque no usemos las instrucciones stm y ldm, les dejamos como es la sintaxis: 
 + 
 +     ldm{ modo_direc }{ cond } rn {!} , lista_reg 
 +     stm{ modo_direc }{ cond } rn {!} , lista_reg 
 +   
  
  
 ---- ----
 +--- //[[mariano.vargas@gmail.com|Mariano]] // \\
 +
 +
  
 [[oc_raspi0|Volver]] [[oc_raspi0|Volver]]
× 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_inst_mov.1587388889.txt.gz · Última modificación: 2020/04/20 13:21 (editor externo)