2012-02-10 96 views
23

什麼是以下行的意思是:x86-64 AT&T程序集中地址的含義是什麼?

... 
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8) 
... 

是什麼在內存地址前面的星號是什麼意思? 另外,當內存訪問方法缺少第一個寄存器值時,這意味着什麼?

通常它的意思是(「%register」,%rax,8),但在這種情況下,它沒有第一個寄存器。

任何提示?

+3

大聲笑,但我得知道它,所以我可以調試一些C代碼。也適用於班級考試。 – de1337ed 2012-02-10 06:56:13

回答

4

這是跳轉到內存中包含的地址。地址存儲在地址爲rax*8+0x402680的存儲器中,其中rax是當前值(當執行此指令時)。

14

把事情到Intel語法總是讓東西更清楚:

FF24C5 80264000 JMP QWORD PTR [RAX*8+402680] 
+0

誰投下了票,謹慎解釋爲什麼?只是反英特爾的語法是*不是*理由... – Necrolis 2012-02-10 10:03:22

+17

我沒有downvote,但你沒有完全解釋發生了什麼.. – 2012-02-10 14:47:16

+3

@MichaelFoukarakis:除了重複英語的數學逐字,沒有使用英特爾語法時真的要添加很多東西。 – Necrolis 2012-02-10 15:48:41

14

它在& T彙編語法:

  • 來源是目的地之前
  • 助記符後綴表明該操作數的大小( q for quad等)
  • 寄存器的前綴爲%和與$
  • 有效地址立即值的形式爲DISP(BASE, INDEX, SCALE)(DISP +基地+ INDEX * SCALE)
  • 絕對跳轉/調用與*指示操作數(而不是IP相對)所以

,你有一個jmpq用於跳轉到存儲在%rax * 8 + 0x402680中的絕對地址,並且是四字長。

+0

但它前面的星號是否有區別?我明白,你所說的話是有道理的。我在想,首先星號會將數據從內存位置0x402680中取出。所以基本上,它會變成%rax * 8 + mem [0x402680] – de1337ed 2012-02-10 07:49:55

+0

星號僅指定這是絕對跳轉。無論如何,'jmp'都會將數據從指定的內存位置中取出。 – 2012-02-10 07:58:39

17

實際上這是計算表jmp,其中0x402680是tabele的地址,rax是8字節(qword)指針的索引。

+3

當C代碼完成if-else或switch語句時,跳轉表通常用於彙編代碼。它允許控制在一定時間內傳遞,而不必檢查很多個別的等式檢查。 – Eagle 2012-09-21 06:07:11

4

正如Necrolis寫道,英特爾的語法使其更加明顯,但RTN真的更清晰。行

jmpq *0x402680(,%rax,8) 

將在RTN被描述爲:

RIP <- M[0x402680 + (8 * RAX)] 

M哪裏是系統存儲器。

這樣,我們可以寫出一般形式jmpq *c(r1, r2, k),其中c是一個立即數,r1r2是通用寄存器並且k是1(默認),2,4或8:

RIP <- M[c + r1 + (k * r2)] 
4

jmpq只是一個無條件跳轉到給定的地址。 'q'表示我們正在處理四字(64位長)。

*0x402680(,%rax,8):這是一種在x-86程序集中編寫地址的方法。您說第一個逗號前通常有一個寄存器是正確的,但如果沒有指定寄存器,您仍遵循相同的規則。

格式的工作方式如下: D(reg1, reg2, scalingFactor)其中D代表位移。位移基本上只是一個整數。 reg1是第一個或基地註冊。 reg2是第二個寄存器,scalingFactor是2,4,8中的一個(可能甚至是1,但我不確定)。現在,您可以通過以這種方式簡單地添加值來獲取地址:位移+(值爲reg1)+ scalingFactor *(值爲reg2)。

我並不完全確定地址前的星號是什麼,但我的猜測是這意味着位移值存儲在該地址。

希望這會有所幫助。

1

小例子使事情更清晰:

.data 
    # Store he address of the label in the data section. 
    symbol: .int label 
.text 
    # Jumps to label. 
    jmp *symbol 
    label: 

沒有*,它會跳轉到symbol地址在.data段和段錯誤。

我覺得這個語法是有點不一致,因爲對於大多數指令:

mov symbol, %eax 
mov label, %eax 

已經在地址symbol移動數據,並$symbol用於地址。英特爾語法在這一點上更加一致,因爲它始終使用[]作爲取消引用。

*當然是C取消引用運算符*ptr的助記符。

相關問題