arm_inst_mov
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_inst_mov [2020/04/20 13:02] – mariano | arm_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, | ||
- | |||
- | mov{s}{cond} op1, op2 | ||
- | mov {cond} Rd, #inmediato | + | La instrucción **mov (inmediato)** escribe un valor inmediato < |
+ | **MOVS <Rd>, #< | ||
- | Ejemplos | + | El registro de flags (Registro CPSR) es actualizado según el resultado. |
- | | ||
- | | ||
- | |||
- | **MOV{S}{cond}**: | + | #< |
+ | |||
+ | Ejemplo | ||
+ | | ||
+ | |||
+ | |||
+ | ==== MOV (registro)==== | ||
+ | |||
+ | Copia un registro fuente <Rm> al registro destino < | ||
+ | En ciertas circunstancias, | ||
+ | |||
+ | **MOV{S} | ||
{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 | + | |
+ | | ||
+ | |||
+ | ==== ldr y str ==== | ||
- | Pop: desapila una palabra, indicada | + | 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 determinado: primero cargamos los registros desde memoria, luego 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: | + | En nuestro caso disponemos de suficientes registros, por lo que podemos hacer el procesamiento sin necesidad de interactuar con la memoria, lo que por otro lado también es más rápido. |
- | Más info sobre el funcionamiento del stack, click acá]] | + | |
+ | ==== PUSH y POP ==== | ||
+ | Push guarda/ | ||
- | PUSH{cond} | + | **PUSH <listreg>** |
- | POP{cond} | + | |
+ | Pop desapila uno ó una lista de registros < | ||
+ | |||
+ | **POP <listreg>** | ||
Ejemplos: | Ejemplos: | ||
Línea 51: | Línea 65: | ||
| | ||
| | ||
+ | |||
+ | |||
+ | |||
+ | [[arquitectura_arm: | ||
+ | |||
+ | |||
+ | 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/ | ||
+ | |||
+ | 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***: |
+ | |||
+ | 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 | ||
+ | |||
---- | ---- | ||
+ | --- // | ||
+ | |||
+ | |||
[[oc_raspi0|Volver]] | [[oc_raspi0|Volver]] |
×
iphelper toolbox
you see this when javscript or css is not working correct
Untested
arm_inst_mov.1587387775.txt.gz · Última modificación: 2020/04/20 13:02 (editor externo)