x86-64 AT&T程序集中地址的含义是什么?

什么是以下行的意思是:x86-64 AT&T程序集中地址的含义是什么?

... 

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

...

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

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

任何提示?

回答:

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

回答:

把事情到Intel语法总是让东西更清楚:

FF24C5 80264000 JMP QWORD PTR [RAX*8+402680] 

回答:

它在& T汇编语法:

  • 来源是目的地之前
  • 助记符后缀表明该操作数的大小( q for quad等)
  • 寄存器的前缀为%和与$
  • 有效地址立即值的形式为DISP(BASE, INDEX, SCALE)(DISP +基地+ INDEX * SCALE)
  • 绝对跳转/调用与*指示操作数(而不是IP相对)所以

,你有一个jmpq用于跳转到存储在%rax * 8 + 0x402680中的绝对地址,并且是四字长。

回答:

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

回答:

正如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)] 

回答:

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的助记符。

以上是 x86-64 AT&T程序集中地址的含义是什么? 的全部内容, 来源链接: utcz.com/qa/257637.html

回到顶部