estaba depurando poco de código C++ (WinCE 6 en la plataforma ARM), y me encuentro con un comportamiento extraño:comportamiento extraño del LDR [PC, #value]
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]
Línea 42772214 ldr r3, [pc, #0x69C]
se utiliza para obtener una constante de la sección .DATA, al menos eso creo.
Lo 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 los contenidos de la memoria se carga desde 0x427728B8 (8bytes +), también ocurre con otros ldr.
¿Es culpa del depurador o de mi comprensión de ldr/pc? Otro problema que no entiendo: ¿por qué el acceso a la sección .data es relativo al código ejecutado? Me parece un poco extraño.
Y una cuestión más: no puedo encontrar la sintaxis del comando primero mov (cualquiera podría señalarme una especificación de tipo de operación para el pulgar (1C2))
Lo siento por la descripción laico, pero sólo estoy familiarizando con las asambleas.
que no se ve como 'thumb' código, pero como' código ARM'.Las direcciones de todas las instrucciones están separadas por 4 bytes; solo hay unas pocas instrucciones de 'pulgar' de 4 bytes. –
En la mayoría de las arquitecturas que he visto, el contador del programa se incrementa * antes * de que se ejecute la instrucción. Durante la ejecución de una instrucción, el contador del programa contendrá la dirección del * fin * de la instrucción actual. –