簡體   English   中英

ARM 組件中的偏移量是多少? 它是如何工作的?

[英]What is offset in ARM Assembly? How does it work?

我正在學習 ARM 匯編語言。 我所做的是在 c 中編寫一個程序並編譯它以查看程序集文件。 下面是這樣一個程序的編譯片段,它有這個ldr r0, [pc, #28] 在這里,我需要幫助來理解這個 PC 的東西。 我知道這意味着程序計數器,但我無法理解指令的實際目的。

1000037c &ltmain>:
1000037c:    b570         push  {r4, r5, r6, lr}
.
.
10000388:    f000 f812    bl    100003b0
1000038c:    4807         ldr   r0, [pc, #28]
1000038e:    626c         str   r4, [r5, #36]
.
.

在 C 程序中,它一定是 integer (>256) 也許,我不完全理解這個概念。 提前致謝。

您正在查看的是預索引加載指令,使用pc寄存器的值作為基地址。

每當您的代碼需要將“大”立即值加載到寄存器中時,您可能會在其下方某處看到類似的數據聲明。 您尚未在代碼段中顯示它,但在程序集中向下滾動一點,您可能會看到如下內容:

.word 0x12345678

甚至可能是 label 的值

_some_label: ...
...
.word _some_label

只要 memory 中的.word值與pc當前執行的位置足夠接近,就可以使用相對偏移量加載數據。 在您的示例中,應該有一個數據字位於該加載指令所在的偏移量 32 處(根據 ARM ISA 為 PC 相對尋址添加 8)。

通常,當您手動編寫匯編時,這種加載立即值的方法可能會很棘手(因為您需要跟蹤放置指令的確切相對偏移量),但編譯器可以非常可靠地做到這一點,這就是為什么您經常在編譯器生成的程序集中看到這一點。

這個問題也可以作為一個很好的參考,我強烈建議你檢查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM