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

时间:2012-02-10 06:38:13

标签: assembly x86-64

以下行的含义是什么:

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

内存地址前面的星号是什么意思? 此外,当内存访问方法缺少它的第一个寄存器值时,它意味着什么?

通常类似于(“%register”,%rax,8),但在这种情况下它没有第一个寄存器。

任何提示?

7 个答案:

答案 0 :(得分:18)

实际上这是计算表jmp ,其中0x402680是tabele的地址,rax是8字节(qword)指针的索引。

答案 1 :(得分:16)

这是AT& T汇编语法:

  • source来自目的地
  • 助记符后缀表示操作数的大小(四元组的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是一个直接常量,r1r2是通用寄存器和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的助记符。