2015-11-02 44 views
-1

我想編碼64位相對跳轉到x64程序集中存儲在%rax中的地址。據我所知,有對此沒有操作碼,所以我手動計算相應的絕對地址的相對地址,然後我做的是絕對跳轉到絕對地址:x64:如何做一個相對jmp *%rax?

# destination address, relative to end of jmp instruction, is stored in %rax 
00007ffff7ff6020: 0x0000488d1505000000 lea 0x5(%rip),%rdx # load %rip+5 (rip + size of add and jmpq) into %rdx 
00007ffff7ff6027: 0x0000000000004801d0 add %rdx,%rax # calculate absolute address based on %rdx (behind jmpq) and %rax (the relative address) 
00007ffff7ff602a: 0x00000000000000ffe0 jmpq *%rax # do an absolute jump to absolute address 

但是這看起來不必要的複雜我。用更少的指令有更好的方法嗎?還是應該避免64位相對跳轉的另一個原因?

回答

1

所有相對跳轉指令都將指令中的跳轉距離編碼爲立即(=整型常量)操作數。存在相對跳轉(和調用)以將執行從代碼中的一個已知位置轉移到正常執行過程中的另一個已知位置,例如,以執行一個條件跳轉(認爲在許多高級編程語言的如果操作者),一個無條件跳轉(認爲在Basic或C/C++或無條件跳轉隱藏如果的內部轉到的語句)或調用子例程。爲此目的(這是一個非常重要的)就夠了。

如果您需要訪問與RIP有關的數據,您可以這樣做,因爲在64位模式下,存在一種將內存操作數編碼爲相對RIP(在32位模式下不存在此類編碼)的方法。這有助於生成與位置無關的代碼,並有助於減少程序將其所有代碼和靜態數據裝入2GB內存的全部64位地址的開銷。

其他xIP相關用途較少見。所以計算跳轉(除了從子例程返回)。計算跳轉是實現諸如開關聲明的常用方式,例如可在例如C/C++,Java。有幾種實現切換的方法,但最明顯的方法是有一個地址的數組/表的地址,以便跳轉到哪裏,然後使用整數索引來檢索相應的地址。然後你可以跳轉,例如間接跳轉。 jmp rax(或無論它在AT & T語法)。您可以從數組/表格中獲取地址並一次跳轉:jmp [table + rax*8](根據您的AT & T語法進行調整)。