我是IAR和嵌入式编程的新手。我调试了下面的C代码,发现R0通过??main_0获取counter1的地址,而R1通过[PC,#0x20]获取counter2的地址。这是完全可以理解的,但我不明白为什么分配给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;
}发布于 2021-10-30 10:24:52
??main_0不是这样“定义”的,它只是这里使用的地址的一个自动生成的标签,这样在读取反汇编时,您就不必记住地址0x8c就是那个计数器指针。事实上,让另一个计数器指针作为??main_1是有意义的,我不确定为什么它会显示空的[PC, #0x20]。正如您在IAR assembly reference的第144/145页上看到的,这两种形式只是对同一机器代码的不同解释。如果反汇编程序决定将标签分配给地址,它可以显示标签形式,否则显示偏移形式。
第一条指令的机器码是48 07,意思是LDR.N R0, [PC, #0x1C]。解释为??main_0 (以及分配一个标签??main_0来首先处理0x8c )只是反汇编程序决定要做的事情。您无法知道原始汇编源代码(如果它甚至存在,并且编译器没有直接编译为机器码)是什么样子,以及它是否在那里使用了标签。
https://stackoverflow.com/questions/69778585
复制相似问题