Acumulación de ensamblajes ARM (actualización continua)

  • 1. El comando de lectura de memoria LDR (carga)
    (4 bytes)
    solo opera la memoria una vez y solo establece un registro.
    Ejemplo:
 LDR R0,[R1]

Suponiendo que el valor de R1 es x, lea los datos (cuatro bytes) en la dirección X a R0

  • 2. STR (almacenar)
    comando de escritura de memoria. El comando de
    lectura de memoria (4 bytes)
    solo opera la memoria una vez y solo establece un registro
STR R0,[R1]

Suponiendo que el valor de R1 es x, escriba el valor de R0 en la dirección x (cuatro bytes)

  • 3. B (Saltar)

  • 4. MOV (mover)
    MOV R0, R1
    asigna el valor de R1 a R0

MOV R0,#0x100
R0=0x100
  • 5. LDR R0, = 0X12345678
    Esta es una pseudoinstrucción, estará superdividida en varias instrucciones de armado
    ¿Por qué se deriva esta instrucción?
    Por ejemplo, tal instrucción
MOV R0,#0X12345678

Las instrucciones de Arm son de 32 bits, parte de los cuales significa MOV, parte de R0 y el
resto es menos de 32 bits. No puede expresar ningún valor, pero solo puede expresar valores simples (números inmediatos),
por lo que se introducen pseudoinstrucciones .

  • 6. bl main
    brarch y link
    jump para ejecutar main, y guardar la dirección de retorno en el registro lr. La
    dirección de retorno está en la siguiente instrucción. Por
    ejemplo:
	bl main 
halt:
	b halt

La dirección devuelta está detenida

  • 7, suma,
    resta y resta
    Ejemplo:
add r0, r1, #4
//r0 = r1 + 4
sub r0, r1, #4
//r0 = r1 - 4
  • 8, ldm, stm important
    LDR y STR
    solo operan la memoria una vez, solo configurando un registro
    m puede entenderse como muchos
    Estas dos instrucciones son
    leer memoria, escribir múltiples registros,
    escribir memoria, escribir los valores de múltiples registros en la memoria
ldmia
stmdb

En cuanto al significado de estas dos instrucciones, podemos abrir el manual de instrucciones del brazo y
encontrar la columna de instrucciones de instalación y almacenamiento del registro.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

stmdb sp !, {fp, ip, lr, pc}

// db se reduce primero y luego se guarda

Primero resta sp = sp-4 = 4092
Inserte la descripción de la imagen aquí

Post-almacenamiento: la regla es la existencia de una dirección de orden
Inserte la descripción de la imagen aquí
superior stmdb sp !, {fp, ip, lr, pc},
por lo que el flujo de esta instrucción es el siguiente

  • 1. Reste primero, sp '= sp-4 = 4092 \
  • 2. Post-almacenamiento: 4092 ~ 4095 almacena el valor de la PC
  • 3. Reste primero: sp '= sp-4 = 4092-4 = 4088
  • 4. Post-almacenamiento: 4088 ~ 4091 almacena el valor del registro lr
  • 5. Menos
  • 6. Almacene el valor de ip en 4084 ~ 4088
  • 7, menos
  • 8. Almacene el valor de fp en 4080 ~ 4084.
    Si sp no tiene un signo de exclamación, entonces sp guardará el valor original de 4096

ldmia sp, {fp, sp, pc}

Inserte la descripción de la imagen aquí
ia se lee primero y luego se incrementa. El registro de números altos almacena el valor de memoria de la dirección alta.
Suponiendo sp = 4080
fp número r11, sp número r13, pc número r15

El proceso es el siguiente

  • 1. Lea primero: fp = 4080 ~ 4083 valor = fp que se ha guardado antes

  • 2. Aumento posterior: sp '= nivel + 4 = 4084

  • 3. Lea primero: sp = 4084 ~ 4087 = el valor del registro de IP guardado originalmente

  • 4. Posterior al aumento: sp '= sp + 4 = 4088

  • 5. Lea primero: pc = 4088 ~ 4091 = el valor original guardado de lr

  • 6. Incremento posterior: sp '= sp + 4 = 4092
    No hay un signo de exclamación después de sp, por lo que el valor de dirección modificado de
    sp no se almacena en sp. El sp se cambia en el tercer paso.

  • pendiente de actualización

Supongo que te gusta

Origin blog.csdn.net/qq_28258885/article/details/111472780
Recomendado
Clasificación