把一颗星放在寄存器前是什么意思?

Ale*_*lex 11 assembly

我正在研究c ++如何通过汇编语言调用正确的成员函数.我带来的简单程序如下:

class A                        
{                              
    public:                    
        virtual void show() {} 
};                             

class B : public A             
{                              
    public:                    
        void show() {}         
};                             


int main()                     
{                              
    A* pA = new B;             
    pA->show();                

    return 0;                  
}                              
Run Code Online (Sandbox Code Playgroud)

其装配如下:

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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我搜索谷歌搜索nwm,它只告诉我c ++用它来分配内存,有人可以告诉我更多关于它的内容吗?它在一个lib中吗?如果可能的话,我可以获得它的源代码吗?怎么样?
  2. 我不太熟悉这种语法,它想做什么?

Gav*_*ith 15

*之前的呼叫或跳转指令AT&T汇编语法绝对地址使用.这意味着它将跳转到寄存器中包含的地址.替代方案是相对跳转,它相对于当前指令.

GNU as手册:

AT&T绝对(与PC相对)跳转/调用操作数以"*"为前缀; 它们在英特尔语法中不受限制.

在您的代码中,调用寄存器中的地址是有意义的.调用pA->show()需要查看以查看正确调用的函数是什么.这是因为它是A类的虚函数.