【问题标题】:LDR Rd,-Label vs LDR Rd,[PC+Offset]LDR Rd,-Label 与 LDR Rd,[PC+Offset]
【发布时间】:2021-12-15 02:26:31
【问题描述】:

我是 IAR 和嵌入式编程的新手。我在调试以下C代码,发现R0通过??main_0保存counter1的地址,而R1通过[PC,#0x20]保存counter2的地址。这是完全可以理解的,但我不明白为什么分配给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;
}

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c assembly iar


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多