【发布时间】: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后来到这里的 :-)
标签: assembly