Comportamento estranho de ldr [pc, #value]
Eu estava depurando algum código c ++ (WinCE 6 na plataforma ARM) e acho estranho algum comportamento:
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]
Linha42772214 ldr r3, [pc, #0x69C]
é usado para obter algumas constantes da seção .DATA, pelo menos acho que sim.
O que é estranho que, de acordo com o código r2, seja preenchido com memória do endereço pc = 0x42772214 + 0x69C = 0x427728B0, mas de acordo com o conteúdo da memória carregado de 0x427728B8 (8 bytes +), isso também acontece com outros usos de ldr.
É culpa do depurador ou da minha compreensão do ldr / pc? Outro problema que não entendo - por que o acesso à seção .data é relativo ao código executado? Eu acho isso um pouco estranho.
E mais um problema: não consigo encontrar a sintaxe do primeiro comando mov (qualquer um poderia me indicar uma especificação de tipo para o Thumb (1C2))
Desculpe pela descrição laica, mas estou familiarizando-me com as assembléias.