首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LDR Rd,-Label与LDR Rd,[PC+Offset]

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

Stack Overflow用户
提问于 2021-10-30 10:05:45
回答 1查看 71关注 0票数 0

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

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

代码语言:javascript
复制
int counter1=1;
int counter2=1;
int main()
{
    int *ptr;
    int *ptr2;
    ptr=&counter1;
    ptr2=&counter2;
 
    ++(*ptr);
    ++(*ptr2);
 
    ++counter2;
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 )只是反汇编程序决定要做的事情。您无法知道原始汇编源代码(如果它甚至存在,并且编译器没有直接编译为机器码)是什么样子,以及它是否在那里使用了标签。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69778585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档