2016-09-19 36 views
1

我處於需要存儲指向Thumb-2彙編代碼中下一條指令的指針的情況。 Thumb-2指令可以是16位和32位,因此是半字對齊的。當我使用PC作爲add中的源操作數時,我實際上讀取了字對齊的程序計數器加4(即比當前指令多2或4)。因此,我需要在當前的程序計數器中加上0或2來獲得下一個指令地址。在ARM彙編預處理中獲得對齊

現在,我可以使用.align來獲得這個指令的字邊界,在這種情況下,我可以簡單地加0.但是,如果沒有必要,我不想使用nop

是否像下面這樣可能?

.if alignment_of_next_instruction % 4 == 2 
     add r12,pc,#2 
.else 
     add r12,pc,#0  @ just an example, mov would be better 
.endif 
     str r12,[sp,#-4]! 

我不能使用nop的原因是,在某些情況下,我並不需要得到下一條指令的地址,但在那之後的指令,甚至一個進一步。在這些情況下,add是必要的,但是否需要添加10或12(例如)取決於對齊。

如果這是不明確的,這裏是.align會是什麼樣子與我所提出的語法:

.if alignment_of_next_instruction % 4 == 2 
     nop 
.endif 

我找不到ARM SDK參考指南中的任何東西,部分彙編表達式和運營商(5.9)但也許我應該在別處尋找。

+0

使用更長的等效指令而不是使用NOP進行填充是x86上的一種已知技術(對於完全相同的指令,通常可以使用不同的編碼),但很少使用,因爲彙編程序不會爲您執行此操作。希望有人知道或希望在開放源代碼彙編中實現這樣的東西,因爲對於這種事情來說,這是一種可行的語法。 –

+0

@PeterCordes我不認爲有一個更長(或更短)的等效指令,這些「add」已經是32位,我沒有辦法讓它們變成16位 - 在ARM上,這些都是選項你得到。我將在早上看到「as」源代碼的樣子,或者可能在binutils列表上寫一封電子郵件。 – Keelan

+0

你可以在* add之前的某個地方做一些指令,所以它總是按照你想要的方式對齊mov嗎? (爲了避免將來發生破損,請在其之前放置一個'.p2align 2',這樣如果有人在創建對齊點的位置和需要的位置之間更改代碼,就會得到一個NOP,所以現在不需要填充,但是將來你會得到填充而不是破壞;或者如果違反了需求,可以使用這個有條件的東西來創建構建時間錯誤。) –

回答

2

比faffing約試圖地址和偏移量的方面去上班,就在指令,即用一個標籤來指定的東西相反:

adr r12, 1f 
    ... 
1: <instruction of interest> 

彙編器和鏈接知道該怎麼辦。

+0

我想這是最簡單的,我應該看到,謝謝。 – Keelan