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 12:57] – 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 | + | |
+ | La instrucción | ||
+ | |||
+ | **MOVS <Rd>, #< | ||
+ | |||
+ | El registro de flags (Registro CPSR) es actualizado según el resultado. | ||
+ | |||
+ | |||
+ | #< | ||
+ | |||
+ | Ejemplo | ||
+ | | ||
+ | |||
+ | |||
+ | ==== MOV (registro)==== | ||
+ | |||
+ | Copia un registro fuente <Rm> al registro destino < | ||
+ | En ciertas circunstancias, | ||
- | mov{s}{cond} op1, op2 | + | **MOV{S} <Rd>, < |
- | mov {cond} Rd, #inmediato | + | {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> Es el registro fuente. Puede ser PC ó SP. | ||
Ejemplos | Ejemplos | ||
- | mov | + | MOV r0, r1 // Copia en el registro r0 el contenido del registro r1 |
- | mov | + | MOVS |
+ | ==== ldr y str ==== | ||
- | **MOV{S}{cond}**: | + | 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. | ||
- | {S} Es un sufijo opcional. Si se especifica, se actualiza | + | En nuestro caso disponemos de suficientes registros, por lo que podemos hacer el procesamiento sin necesidad |
- | N Z C | + | ==== PUSH y POP ==== |
- | {cond} | + | Push guarda/ |
- | #inmediato: es un valor en el rango 0-65535. | + | |
+ | **PUSH < | ||
- | ==== PUSH y POP ==== | ||
- | Push: Guarda registro/registros en el stack. El puntero | + | Pop desapila uno ó una lista de registros |
- | Pop: desapila una palabra, indicada por sp. | + | **POP < |
- | [[arquitectura_arm:componentes_fisicos._registros_flags_pila._direcciones_de_memoria_logicas_y_fisicas# | + | Ejemplos: |
- | Más info sobre el funcionamiento del stack, click acá]] | + | |
+ | push r1 | ||
+ | push r2 | ||
+ | push r4 | ||
+ | /* código que modifica los registro r1, r2 y r4 */ | ||
+ | | ||
+ | | ||
+ | | ||
- | PUSH{cond} listreg | ||
- | POP{cond} listreg | + | [[arquitectura_arm: |
- | Ejemplos: | ||
- | push [] | + | 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.1587387464.txt.gz · Última modificación: 2020/04/20 12:57 por mariano