La diferencia entre las instrucciones LDR, MOV y ADR en el ensamblaje

Al observar la primera etapa de arranque de BootLoader, los estudiantes cuidadosos encontrarán que el código usa mov r1, # 0x3; ldr r0, = INTMSK; adr r0, _start y otros comandos para obtener un valor para el registro especificado, entonces ¿por qué? ¿Desea usar diferentes instrucciones para obtener el valor en lugar de usar directamente la instrucción MOV? Antes de explicar, primero presente brevemente las funciones de estos comandos.

  • MOV es un formato de instrucción de transferencia de datos: MOV {<cond>} {s} <Rd>, <shifter_operand>, la función es transferir los datos representados por <shift_operand> al registro de destino <Rd>
  • Seudoinstrucción LDR, formato: LDR R0, = XXX. El rol es transferir el valor al registro objetivo R0.
  • El propósito de la directiva ADR R0, _start es transferir el valor de _start al registro de destino R0.
    Es decir, estas tres instrucciones son para obtener el valor y transferirlo al registro de destino, pero las dos últimas son pseudoinstrucciones, no un lenguaje ensamblador real. Cuando el compilador lo vea, se convertirá en lenguaje ensamblador real.
    Los datos de operación que siguen a la instrucción MOV pueden ser registros, datos inmediatos (no todos los números son datos inmediatos).
    El número que sigue a la instrucción LDR puede ser arbitrario y puede no ser inmediato.
    La instrucción ADR transfiere la dirección de _start a R0, que se convierte en una verdadera instrucción de ensamblaje similar a: SUB R0, PC, # 172 Se trata en relación con el desplazamiento de la PC, es decir, la instrucción se puede encontrar a través de la instrucción de la PC, dentro de un pequeño rango antes y después de la PC. Esto genera un código independiente de la posición, lo que significa que no importa dónde se mueva el programa, la dirección de instrucción de _start se puede obtener correctamente. Y si está escrito como MOV R0, _start entonces el valor en r0 cambiará con la dirección de conexión del programa. Esta instrucción se utiliza en la reubicación de código. Cuando se enciende, el código de arranque se encuentra en la dirección física 0. El código debe moverse a la ubicación física especificada por el vinculador.

La instrucción ADR se usa principalmente para generar código independiente de la dirección, y no es necesario juzgar si un número es un número inmediato; el papel de la pseudoinstrucción LDR es que los datos posteriores pueden no ser un número inmediato; mientras que la instrucción MOV es seguida por un valor, solo puede ser un número inmediato. También se puede conectar a otras formas de operandos.

Publicado 35 artículos originales · Me gusta1 · Visitas 1870

Supongo que te gusta

Origin blog.csdn.net/lzj_linux188/article/details/103645814
Recomendado
Clasificación