LDR Rd,-Label 与 LDR Rd,[PC+Offset]

LDR Rd,-Label vs LDR Rd,[PC+Offset]

我是 IAR 和嵌入式编程的新手。我正在调试以下 C 代码,发现 R0 通过 ??main_0 获取了 counter1 的地址,而 R1 获取了 counter2 的地址通过 [PC,#0x20]。这是完全可以理解的,但我不明白为什么它被分配给 R0 使用 LDR Rd, -labelR1 使用 LDR Rd, [PC+Offset] 这两种方法有什么区别?

我是在搜索之后才知道文字池的,但它并没有回答我的问题。另外,??main_0 最初是在哪里定义的?

int counter1=1;
int counter2=1;
int main()
{
    int *ptr;
    int *ptr2;
    ptr=&counter1;
    ptr2=&counter2;
 
    ++(*ptr);
    ++(*ptr2);
 
    ++counter2;
    return 0;
}

??main_0 并不是这样“定义”的,它只是此处使用的地址的自动生成标签,因此在阅读反汇编时您不必记住该地址 0x8c是那个反指针。事实上,将另一个计数器指针设置为 ??main_1 是有意义的,我不确定为什么它会显示 [PC, #0x20] 。正如您在 IAR assembly reference 第 144/145 页所见,这两种形式只是对同一机器代码的不同解释。如果反汇编器决定给一个地址分配一个标签,它可以显示标签形式,否则显示偏移量形式。

第一条指令的机器码是48 07,也就是LDR.N R0, [PC, #0x1C]??main_0 的解释(以及首先将标签 ??main_0 分配给地址 0x8c )只是反汇编程序决定做的事情。您无法知道原始汇编源代码(如果它甚至存在并且编译器没有直接编译为机器代码)是什么样的,也不知道它是否在那里使用了标签。