以下行是什么意思:
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
Run Code Online (Sandbox Code Playgroud)
内存地址前面的星号是什么意思?此外,当内存访问方法缺少它的第一个寄存器值时,它意味着什么?
通常它的类似("%register",%rax,8),但在这种情况下它没有第一个寄存器.
有小费吗?
GJ.*_*GJ. 18
实际上这是计算表jmp,其中0x402680是tabele的地址,rax是8字节(qword)指针的索引.
Mic*_*kis 17
这是AT&T汇编语法:
q
对于四边形等)%
以及前缀值为前缀$
DISP(BASE, INDEX, SCALE)
(DISP + BASE + INDEX*SCALE)*
(与IP相对)所以,你有一个jmpq
跳转到存储的绝对地址%rax * 8 + 0x402680
,并且是一个四字长.
Nec*_*lis 12
进入英特尔语法总是让事情变得更清晰:
FF24C5 80264000 JMP QWORD PTR [RAX*8+402680]
Run Code Online (Sandbox Code Playgroud)
小智 6
jmpq
只是一个无条件跳转到给定地址.'q'意味着我们正在处理四字(64位长).
*0x402680(,%rax,8)
:这是一种在x-86程序集中写入地址的方法.你说第一个逗号之前通常有一个寄存器是正确的,但如果没有指定寄存器,你仍然遵循相同的规则.
格式以这种方式工作:
D(reg1, reg2, scalingFactor)
其中D代表位移.位移基本上只是一个整数.reg1
是第一个或基本寄存器.reg2
是第二个寄存器,scalingFactor
是2,4,8之一(甚至可能是1,但我不确定).现在,您可以通过以下方式添加值来获取地址:位移+(值at reg1
)+ scalingFactor
*(值at reg2
).
我不完全确定地址前面的星号是什么,但我的猜测是,这意味着位移值存储在该地址.
希望这可以帮助.
正如 Necrolis 所写,英特尔语法使其更加明显,但RTN确实更清晰。线路
jmpq *0x402680(,%rax,8)
Run Code Online (Sandbox Code Playgroud)
RTN 中的描述如下:
RIP <- M[0x402680 + (8 * RAX)]
Run Code Online (Sandbox Code Playgroud)
M
系统内存在哪里。
因此,我们可以写出一般形式jmpq *c(r1, r2, k)
,其中c
是立即数,r1
是r2
通用寄存器,并且k
是 1(默认)、2、4 或 8:
RIP <- M[c + r1 + (k * r2)]
Run Code Online (Sandbox Code Playgroud)