0
在使用相對於程序計數器的數據源時,如何以儘可能少的指令執行絕對跳轉(64位雙字)?使用PC相對數據源進行絕對跳轉(AArch64)
乍一看,人們可以假設LDR
後跟一個BR
是可能的,即:
LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
但由於PC
不再是通用寄存器AArch64,事實並非如此。
那麼如何用盡可能少的指令來完成呢?
在使用相對於程序計數器的數據源時,如何以儘可能少的指令執行絕對跳轉(64位雙字)?使用PC相對數據源進行絕對跳轉(AArch64)
乍一看,人們可以假設LDR
後跟一個BR
是可能的,即:
LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
但由於PC
不再是通用寄存器AArch64,事實並非如此。
那麼如何用盡可能少的指令來完成呢?
可以依靠生成文字池照常編譯器:
LDR x9, =0xBADC0FFEE0DDF00D
BR x9
這是可讀和將基本上產生相同的代碼。
如果你想擁有精確的控制,你可以使用LDR literal
版本,手冊上說:
加載寄存器(文字)從PC值計算一個地址和一個直接偏移量,從裝載一個字內存,並將其寫入一個寄存器。
因此,你可以這樣做:
LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
或者少讀,但沒有一個標籤:
LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D
如果你讀它告訴你的文檔,它是一個PC相關的負載時, pc只是沒有在指令中編碼,它隱含在這個指令集中。 –
我明白了,這就是我困惑的原因。感謝您的澄清! –
「加載寄存器(文字)根據PC值和立即偏移計算地址,從存儲器加載一個字,並將其寫入寄存器。」 –