在x86-64 AT&T组装中,地址前的星号*是什么意思?

de1*_*7ed 30 assembly x86-64

以下行是什么意思:

...
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)指针的索引.

  • 当C代码完成if-else或switch语句时,跳转表通常用在汇编代码中.它允许控件在恒定时间内传递,而不必检查大量的个别相等检查. (3认同)

Mic*_*kis 17

这是AT&T汇编语法:

  • 来源在目的地之前
  • 助记符后缀表示操作数的大小(q对于四边形等)
  • 寄存器%以及前缀值为前缀$
  • 有效地址的格式为DISP(BASE, INDEX, SCALE)(DISP + BASE + INDEX*SCALE)
  • 指示的绝对跳转/调用操作数*(与IP相对)

所以,你有一个jmpq跳转到存储的绝对地址%rax * 8 + 0x402680,并且是一个四字长.

  • 星号仅指定这是绝对跳转。无论如何,`jmp` 都会从指定的内存位置中取出数据。 (2认同)

Nec*_*lis 12

进入英特尔语法总是让事情变得更清晰:

FF24C5 80264000  JMP QWORD PTR [RAX*8+402680]
Run Code Online (Sandbox Code Playgroud)

  • 我没有投票,但你并没有完全解释发生了什么...... (21认同)
  • @MichaelFoukarakis:除了用英语逐字重复数学之外,使用英特尔语法时没有太多真正的补充. (3认同)

Ale*_*nze 6

它是跳转到内存中包含的地址.地址存储在地址的存储器中rax*8+0x402680,其中rax是当前rax值(当执行该指令时).


小智 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).

我不完全确定地址前面的星号是什么,但我的猜测是,这意味着位移值存储在该地址.

希望这可以帮助.


eep*_*epp 5

正如 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是立即数,r1r2通用寄存器,并且k是 1(默认)、2、4 或 8:

RIP <- M[c + r1 + (k * r2)]
Run Code Online (Sandbox Code Playgroud)