以下行的含义是什么:
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
内存地址前面的星号是什么意思? 此外,当内存访问方法缺少它的第一个寄存器值时,它意味着什么?
通常类似于(“%register”,%rax,8),但在这种情况下它没有第一个寄存器。
任何提示?
答案 0 :(得分:18)
实际上这是计算表jmp ,其中0x402680是tabele的地址,rax是8字节(qword)指针的索引。
答案 1 :(得分:16)
这是AT& T汇编语法:
q
等)。%
为前缀,立即值为$
DISP(BASE, INDEX, SCALE)
(DISP + BASE + INDEX * SCALE)*
表示的绝对跳转/调用操作数(与IP相对)所以,你有一个jmpq
用于跳转到存储在%rax * 8 + 0x402680
中的绝对地址,并且是四字长。
答案 2 :(得分:12)
使用英特尔语法总能让事情变得更清晰:
FF24C5 80264000 JMP QWORD PTR [RAX*8+402680]
答案 3 :(得分:5)
跳转到内存中包含的地址。地址存储在地址rax*8+0x402680
的内存中,其中rax
是当前rax
值(执行此指令时)。
答案 4 :(得分:5)
jmpq
只是一个非条件跳转到给定地址。 ' q'意味着我们正在处理四字(64位长)。
*0x402680(,%rax,8)
:这是一种在x-86汇编中写入地址的方法。你说第一个逗号之前通常有一个寄存器是正确的,但是如果没有指定寄存器,你仍然遵循相同的规则。
格式以这种方式工作:
D(reg1, reg2, scalingFactor)
其中D代表位移。位移基本上只是一个整数。 reg1
是第一个或基本寄存器。 reg2
是第二个寄存器,scalingFactor
是2,4,8之一(甚至可能是1,但我不确定)。现在,您可以通过以下方式添加值来获取您的地址:置换+(reg1
处的值)+ scalingFactor
*(reg2
处的值)。
我不完全确定地址前面的星号是什么,但我猜是这意味着位移值存储在该地址。
希望这有帮助。
答案 5 :(得分:4)
正如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)]
答案 6 :(得分:3)
最小的例子让事情变得更加清晰:
.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
的助记符。