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.

questionAnswers(1)

yourAnswerToTheQuestion