在寄存器前加星是啥意思?
Posted
技术标签:
【中文标题】在寄存器前加星是啥意思?【英文标题】:what is the meaning of putting a star before a register?在寄存器前加星是什么意思? 【发布时间】:2013-09-30 06:50:48 【问题描述】:我正在研究 c++ 如何通过汇编语言调用正确的成员函数。 我自带的简单程序如下:
class A
public:
virtual void show()
;
class B : public A
public:
void show()
;
int main()
A* pA = new B;
pA->show();
return 0;
它的组装如下:
main:
.LFB2:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
pushq %rbx
subq $24, %rsp
movl $8, %edi
.cfi_offset 3, -24
call _Znwm <<<================ 1
movq %rax, %rbx
movq %rbx, %rax
movq %rax, %rdi
call _ZN1BC1Ev
.L11:
movq %rbx, %rax
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rdx
movq -24(%rbp), %rax
movq %rax, %rdi
call *%rdx <<<=== 2
movl $0, %eax
addq $24, %rsp
popq %rbx
leave
ret
.cfi_endproc
我的问题是:
-
我在 google 上搜索了 nwm,它只告诉我 c++ 使用它来分配内存,
有人能告诉我更多吗?它在一个库中吗?
如果可能的话,我可以得到它的源代码吗?怎么样?
我对这个语法不是很熟悉,它想做什么?
【问题讨论】:
你的代码泄露了内存,顺便说一句......每个新的都必须与删除匹配...... @Goz:Alex 可能已经知道这一点,只是想创建一个Short, Self Contained, Correct (Compilable), Example。 @Goz,我认为 Martin Liversage 已经回答了您的问题,感谢 Martin 的回答并感谢 Goz 为我指出。 您通常会在编译的 C++ 代码中看到这个call *%reg
,其中使用动态调度调用虚拟方法。 _Znwm
是 ::operator new (size_t)
函数的名称修改。
What does an asterisk * before an address mean in x86-64 AT&T assembly? +1 的可能重复因为我也是在反编译virtual
后来到这里的 :-)
【参考方案1】:
*
在 AT&T 汇编语法中用于调用或跳转指令的绝对地址之前。这意味着它将跳转到寄存器中包含的地址。另一种方法是相对跳转,它是相对于当前指令的。
来自GNU as
manual:
AT&T 绝对(相对于 PC 相对) 跳转/调用操作数以 `*' 为前缀;它们在 英特尔语法。
在您的代码中,调用寄存器中的地址是有意义的。调用pA->show()
需要查看要调用的正确函数是什么。这是因为它是 A 类上的虚函数。
【讨论】:
我写这篇文章是为了确保我理解正确。根据您提供的链接,这是否意味着它将调用从该寄存器中存储的地址开始的函数? @GavinSmith,寄存器是否也可以包含您可以跳转到的偏移量,而不是绝对地址?否则这个引用无论如何都没有意义。以上是关于在寄存器前加星是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章