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
是一个立即数,r1
和r2
是通用寄存器并且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