luz leer ldr fotoresistencia encender conexion con codigo c++ assembly arm

c++ - leer - Extraño comportamiento de ldr



modulo sensor de luz arduino (1)

Estaba depurando algunos códigos de C ++ (WinCE 6 en la plataforma ARM), y encuentro un comportamiento extraño:

4277220C mov r3, #0x93, 30 42772210 str r3, [sp] 42772214 ldr r3, [pc, #0x69C] 42772218 ldr r2, [pc, #0x694] 4277221C mov r1, #0 42772220 ldr r0, [pc, #0x688]

La línea 42772214 ldr r3, [pc, #0x69C] se usa para obtener una constante de la sección .DATA, al menos eso creo.

Lo que es extraño es que según el código r2 debe llenarse con la memoria de la dirección pc = 0x42772214 + 0x69C = 0x427728B0, pero de acuerdo con el contenido de la memoria se carga desde 0x427728B8 (8bytes +), sucede para otros usos de ldr también.

¿Es culpa del depurador o de mi comprensión de ldr / pc? Otro problema que no entiendo es: ¿por qué el acceso a la sección .data es relativo al código ejecutado? Me parece un poco extraño.

Y un problema más: no puedo encontrar la sintaxis del primer comando mov (cualquiera podría indicarme una especificación de oppción para el pulgar (1C2))

Perdón por la descripción laica, pero me estoy familiarizando con las asambleas.


Esto es correcto. Cuando se utiliza la pc para leer, hay un desplazamiento de 8 bytes en el modo ARM y un desplazamiento de 4 bytes en el modo Thumb.

Desde ARM-ARM:

Cuando una instrucción lee la PC, el valor leído depende de qué conjunto de instrucciones proviene:

  • Para una instrucción ARM, el valor leído es la dirección de la instrucción más 8 bytes . Los bits [1: 0] de este valor son siempre cero, porque las instrucciones ARM siempre están alineadas con la palabra.
  • Para una instrucción Thumb, el valor leído es la dirección de la instrucción más 4 bytes . El bit [0] de este valor es siempre cero, porque las instrucciones de pulgar siempre están alineadas a medias palabras.

Esta forma de leer la PC se usa principalmente para el direccionamiento rápido e independiente de la posición de las instrucciones y datos cercanos, incluida la bifurcación independiente de la posición dentro de un programa.

Hay 2 razones para el direccionamiento relativo de pc.

  1. Código de posición independiente, que está en su caso.
  2. Obtenga cerca algunas constantes complicadas que no pueden escribirse en 1 instrucción simple, por ejemplo, mov r3, #0x12345678 es imposible de completar en 1 instrucción, por lo que el compilador puede poner esta constante al final de la función y usar, por ejemplo, ldr r3, [pc, #0x50] para cargarlo en su lugar.

No sé qué significa mov r3, #0x93, 30 . Probablemente es mov r3, #0x93, rol 30 (que da 0xC0000024 )?