¿Es necesario para “LDR R0, [R0]” al guardar desde r15 en el brazo?

-1

De ARM® Developer Suite Assembler Guide

  

Guardando desde r15

     

En general, evite guardar desde r15 si es posible.

     

Si guarda desde r15, el valor guardado es la dirección del actual   instrucción, más una constante definida por la implementación. La constante es   Siempre lo mismo para un procesador en particular.

     

Si su código ensamblado podría usarse en diferentes procesadores, puede   averigüe cuál es la constante en el tiempo de ejecución utilizando código como el   siguiente:

     

SUB R1, PC, # 4; R1 = dirección de la siguiente instrucción STR

     

STR PC, [R0]; Dirección de la tienda de la instrucción STR + offset,

     

LDR R0, [R0]; luego recárgalo

     

SUB R0, R0, R1; Calcula el offset como la diferencia

     

Si su código se va a ensamblar para un procesador particular, el valor   de la constante está disponible en armasm como {PCSTOREOFFSET}.

    
pregunta Bumzy

2 respuestas

3

LDR lee una palabra de la memoria.

LDR R0, [R0] lee una palabra de la memoria en la dirección contenida en R0 , luego almacena el valor en R0 (que es el mismo lugar donde se almacenó la dirección).

No se indica explícitamente, al menos en la parte de la documentación que citó, pero antes de este fragmento de código, debe establecer R0 en una dirección que desee que use como espacio para rascar.

    
respondido por el immibis
0

Guardar desde r15 es algo que normalmente no haría, y la especificación de la arquitectura deja abierto a la implementación cómo se implementa.

Como la interfaz de memoria es una etapa opcional en el procesamiento de código de operación, y las instrucciones ldm y stm necesitan manejar múltiples registros, es posible que una implementación retrase la lectura del registro hasta que la instrucción llegue a la interfaz de memoria. etapa, en la que el punto r15 puede haber avanzado en más de una instrucción.

También se deja al implementador si las instrucciones de carga / almacenamiento de registro único se implementan como carga / almacén de una sola palabra con un valor de registro ya descodificado, o como un múltiplo de carga / almacenamiento con solo un bit establecido.

Esto realmente solo afecta el caso poco común de guardar r15 en la memoria; todos los lugares normales donde usaría r15 en una instrucción aún están bien definidos:

  • mov rN, r15 (obtener PC + 4)
  • ldr rN, [r15, #M] (cargar relativa a PC)
  • str rN, [r15, #M] (tienda relativa a PC)
  • ldmia [r13!], {r0-r13,r15} (cargar registros previamente almacenados)
  • subs r15, r14, #4 (retorno de excepción)
respondido por el Simon Richter

Lea otras preguntas en las etiquetas