我是 IAR 和嵌入式編程的新手。我正在除錯以下 C 代碼,發現R0get 持有counter1through的地址??main_0,而R1gets 持有counter2through 的地址[PC,#0x20]。這是完全可以理解的,但我不明白為什么它被分配R0為使用LDR Rd, -label而R1使用LDR Rd, [PC Offset],這兩種方法之間有什么區別?
搜索后我只知道文字池,但它沒有回答我的問題。此外,首先在哪里??main_0定義?
![LDR Rd,-Label vs LDR Rd,[PC Offset]](https://img.uj5u.com/2021/11/02/b376d3544092487d81df3a0f102132a4.png)
int counter1=1;
int counter2=1;
int main()
{
int *ptr;
int *ptr2;
ptr=&counter1;
ptr2=&counter2;
(*ptr);
(*ptr2);
counter2;
return 0;
}
uj5u.com熱心網友回復:
??main_0不是這樣“定義”的,它只是此處使用的地址的自動生成的標簽,因此在閱讀反匯編時,您不必記住該地址0x8c就是那個計數器指標。事實上,使用另一個計數器指標是有意義的??main_1,我不確定為什么它會顯示裸露的[PC, #0x20]。正如您在IAR 匯編參考的第 144/145 頁上看到的那樣,這兩種形式只是對同一機器代碼的不同解釋。如果反匯編器決定為地址分配標簽,則可以顯示標簽形式,否則顯示偏移量形式。
第一條指令的機器碼是48 07,意思是LDR.N R0, [PC, #0x1C]。解釋為??main_0(以及首先??main_0為地址分配標簽0x8c)只是反匯編程式決定做的事情。您無法知道原始匯編源代碼(如果它甚至存在并且編譯器沒有直接編譯為機器代碼)是什么樣的,以及它是否在那里使用了標簽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343796.html
