2017-07-06 78 views
0

在使用相對於程序計數器的數據源時,如何以儘可能少的指令執行絕對跳轉(64位雙字)?使用PC相對數據源進行絕對跳轉(AArch64)

乍一看,人們可以假設LDR後跟一個BR是可能的,即:

LDR x9, [PC, #0x8]; 
BR x9 
.dword 0xBADC0FFEE0DDF00D 

但由於PC不再是通用寄存器AArch64,事實並非如此。

那麼如何用盡可能少的指令來完成呢?

+0

如果你讀它告訴你的文檔,它是一個PC相關的負載時, pc只是沒有在指令中編碼,它隱含在這個指令集中。 –

+0

我明白了,這就是我困惑的原因。感謝您的澄清! –

+0

「加載寄存器(文字)根據PC值和立即偏移計算地址,從存儲器加載一個字,並將其寫入寄存器。」 –

回答

3

可以依靠生成文字池照常編譯器:

LDR x9, =0xBADC0FFEE0DDF00D 
BR x9 

這是可讀和將基本上產生相同的代碼。

如果你想擁有精確的控制,你可以使用LDR literal版本,手冊上說:

加載寄存器(文字)從PC值計算​​一個地址和一個直接偏移量,從裝載一個字內存,並將其寫入一個寄存器。

因此,你可以這樣做:

LDR x9, foo 
BR x9 
foo: .dword 0xBADC0FFEE0DDF00D 

或者少讀,但沒有一個標籤:

LDR x9, .+8 
BR x9 
.dword 0xBADC0FFEE0DDF00D