2014-01-26 44 views
0

我正在使用ARM體系結構,對於LDRB的概念我有點不清楚。 LDRB是可選的B命令的LDR,用於加載32位字的最低有效字節。三個問題。ARM ASM中的LDRB - 一般問題

  1. 我真正想要的是前8位,而不是最後8位(我在數組上迭代)。有沒有一個優雅的方式來做到這一點?我找不到它的命令。
  2. 我現在正在做的是SUB r4,r4,#3將r4(我想裝載的指針)移回三個字節,以便最低有效字節現在是32位的前一個字節字。如果我所做的只是迭代,這是否會導致記憶問題?
  3. 我正在使用LDRB r7,r4;這應該將來自r4的最不重要的字節加載到r7中。通過零擴展,它意味着將出現什麼樣的00 ... 00010101或10101000 ... 00?
+0

(也就是說,ARM文檔說LDRB將零擴展,它沒有指定向哪個方向)。 –

+1

'LDRB r7,r4'在上次檢查時不是有效的指令。零擴展意味着用零填充N個最高有效位。 – Michael

+0

你讀的數據的佈局方式有點不清楚(例如你爲什麼需要從指針中減去3)。如果一個指針指向一個單詞的開始(即指針是單詞對齊的),那麼如果你從該指針中讀取'LDRB',你將會讀取最低有效字節(在一個小端機器上)。 – Michael

回答

4

如果你想有一個32位字的MSB,然後得到一個32位字的MSB:

LDR R0, [R1] 
LSR R0, #24 

還有什麼是混亂和不同字節序的系統完全不可移植的 - 試圖假定在BE系統上LE休息時,字節地址字。如果它發現自己在一個古老的BE-32系統上,那麼在BE-8上可以發揮什麼作用。

事實上,如果從[word ptr - #3]加載字節真的給你的最高位,而不是前一個單詞的第二至少顯著字節的話,我想你一個BE-32系統* - 因此這不會正確處理任何現代事物。

*或者也許是BE-8 - 存儲器字節序與總線字節序以及字與字節尋址的技巧是非常混亂的,我沒有聲稱完全使用它。

+0

除了答案之外,現代內存系統還會強制您獲取多個字節 - 系統本地字大小的某些順序(本機字大小在ARMv7上爲四個字節)。通常,內存接口迫使核心至少獲取32個字節。所以如果你需要從內存中獲取一個字節,仍然會獲取一個字(四個字節),然後通過移位訪問你想要的字節。 'LDRB'的Raison d'être是爲了訪問其他硬件組件,他們要求你按字節訪問,因爲從一個地址讀取可能意味着別的東西(比如fifo)。所以總之不要在內存上做LDRB。 – auselen

+0

因此......將R1的地址加載到R0中,然後將R0移位24位?這不會像我上面的代碼那樣在非32位體系結構中造成問題嗎?我想這可能是更優雅的解決方案......在我的代碼中,它會是LDR r7,r4,; LSR r7,#24? –

+1

@JonahStephenSwersey嗯,非32位體系結構完全一樣? AArch64有一個完全不同的指令集,異常模型等等。其他任何東西都不是ARM ... – Notlikethat