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, -label
而 R1
使用 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
)只是反汇编程序决定做的事情。您无法知道原始汇编源代码(如果它甚至存在并且编译器没有直接编译为机器代码)是什么样的,也不知道它是否在那里使用了标签。
我是 IAR 和嵌入式编程的新手。我正在调试以下 C 代码,发现 R0
通过 ??main_0
获取了 counter1
的地址,而 R1
获取了 counter2
的地址通过 [PC,#0x20]
。这是完全可以理解的,但我不明白为什么它被分配给 R0
使用 LDR Rd, -label
而 R1
使用 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
)只是反汇编程序决定做的事情。您无法知道原始汇编源代码(如果它甚至存在并且编译器没有直接编译为机器代码)是什么样的,也不知道它是否在那里使用了标签。