什麼是以下行的意思是:x86-64 AT&T程序集中地址的含義是什麼?
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
是什麼在內存地址前面的星號是什麼意思? 另外,當內存訪問方法缺少第一個寄存器值時,這意味着什麼?
通常它的意思是(「%register」,%rax,8),但在這種情況下,它沒有第一個寄存器。
任何提示?
什麼是以下行的意思是:x86-64 AT&T程序集中地址的含義是什麼?
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
是什麼在內存地址前面的星號是什麼意思? 另外,當內存訪問方法缺少第一個寄存器值時,這意味着什麼?
通常它的意思是(「%register」,%rax,8),但在這種情況下,它沒有第一個寄存器。
任何提示?
這是跳轉到內存中包含的地址。地址存儲在地址爲rax*8+0x402680
的存儲器中,其中rax
是當前值(當執行此指令時)。
它在& T彙編語法:
q
for quad等)%
和與$
DISP(BASE, INDEX, SCALE)
(DISP +基地+ INDEX * SCALE)*
指示操作數(而不是IP相對)所以,你有一個jmpq
用於跳轉到存儲在%rax * 8 + 0x402680
中的絕對地址,並且是四字長。
但它前面的星號是否有區別?我明白,你所說的話是有道理的。我在想,首先星號會將數據從內存位置0x402680中取出。所以基本上,它會變成%rax * 8 + mem [0x402680] – de1337ed 2012-02-10 07:49:55
星號僅指定這是絕對跳轉。無論如何,'jmp'都會將數據從指定的內存位置中取出。 – 2012-02-10 07:58:39
實際上這是計算表jmp,其中0x402680是tabele的地址,rax是8字節(qword)指針的索引。
當C代碼完成if-else或switch語句時,跳轉表通常用於彙編代碼。它允許控制在一定時間內傳遞,而不必檢查很多個別的等式檢查。 – Eagle 2012-09-21 06:07:11
正如Necrolis寫道,英特爾的語法使其更加明顯,但RTN真的更清晰。行
jmpq *0x402680(,%rax,8)
將在RTN被描述爲:
RIP <- M[0x402680 + (8 * RAX)]
M
哪裏是系統存儲器。
這樣,我們可以寫出一般形式jmpq *c(r1, r2, k)
,其中c
是一個立即數,r1
和r2
是通用寄存器並且k
是1(默認),2,4或8:
RIP <- M[c + r1 + (k * r2)]
jmpq
只是一個無條件跳轉到給定的地址。 'q'表示我們正在處理四字(64位長)。
*0x402680(,%rax,8)
:這是一種在x-86程序集中編寫地址的方法。您說第一個逗號前通常有一個寄存器是正確的,但如果沒有指定寄存器,您仍遵循相同的規則。
格式的工作方式如下: D(reg1, reg2, scalingFactor)
其中D代表位移。位移基本上只是一個整數。 reg1
是第一個或基地註冊。 reg2
是第二個寄存器,scalingFactor
是2,4,8中的一個(可能甚至是1,但我不確定)。現在,您可以通過以這種方式簡單地添加值來獲取地址:位移+(值爲reg1
)+ scalingFactor
*(值爲reg2
)。
我並不完全確定地址前的星號是什麼,但我的猜測是這意味着位移值存儲在該地址。
希望這會有所幫助。
小例子使事情更清晰:
.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
的助記符。
大聲笑,但我得知道它,所以我可以調試一些C代碼。也適用於班級考試。 – de1337ed 2012-02-10 06:56:13