Herramientas de usuario

Herramientas del sitio


arm_inst_mov

¡Esta es una revisión vieja del documento!


Instrucciones de movimientos de datos

MOV (inmediato)

La instrucción MOV (inmediato) escribe un valor inmediato <const> en el registro destino <Rd>.

MOVS <Rd>, #<const>

El registro de flags (Registro CPSR) es actualizado según el resultado.

#<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.

<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>

<Rm> Es el registro fuente. Puede ser PC ó SP.

Ejemplos

   MOV   r0, r1      // Copia en el registro r0 el contenido del registro r1
   MOVS  r0, r3      // Copia en el registro r0 el contenido del registro r3 y actualiza cpsr
   

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 <listreg>

Pop desapila uno ó una lista de registros <listreg> almacenados en el stack, para acceder a ello usa el registro sp.

POP <listreg>

Ejemplos:

   push r1
   push r2
   push r4
   /* código que modifica los registro r1, r2 y r4 */
   pop  r4
   pop  r2
   pop  r1

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

   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

Volver

(2199)

× 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.1589519081.txt.gz · Última modificación: 2020/05/15 05:04 (editor externo)