将星星放在寄存器前是什么意思?

亚历克斯

我正在研究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

我的问题是:

  1. 我在google上搜索了nwm,它只告诉我c ++使用它来分配内存,有人可以告诉我更多有关它的信息吗?在一个库中吗?如果可能,我可以获取其源代码吗?怎么样?
  2. 我对这种语法不太熟悉,它想做什么?
加文·史密斯

*之前汇编语法呼叫或跳转指令在AT&T的绝对地址使用。这意味着它将跳转到寄存器中包含的地址。另一种选择是相对跳转,相对于当前指令。

GNUas手册

AT&T绝对(相对于PC相对)跳转/呼叫操作数的前缀为*。它们在Intel语法中是无界的。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

寄存器周围的括号是什么意思?

来自分类Dev

“在函数调用之间保留寄存器”是什么意思?

来自分类Dev

移位变量或寄存器是什么意思?1 << REGISTER_ADDRESS

来自分类Dev

\\?\放在文件路径前是什么意思

来自分类Dev

将const放在函数的声明之后是什么意思?

来自分类Dev

将sys_read系统调用linux放在寄存器eax中有什么作用?

来自分类Dev

将值分配给TCP服务器寄存器的pymodbus语法是什么?

来自分类Dev

将 32 位有符号整数存储到寄存器中的具体细节是什么?

来自分类Dev

:: 在函数调用前是什么意思?

来自分类Dev

在Android Java中,将类名放在括号中是什么意思?

来自分类Dev

将类名和标签名放在CSS中是什么意思?

来自分类Dev

将类名放在方括号中是什么意思?

来自分类Dev

RAX寄存器的名称是什么?

来自分类Dev

PCIe中的基址寄存器(BAR)是什么?

来自分类Dev

函数调用后寄存器的状态是什么?

来自分类Dev

寄存器受损架构的含义是什么

来自分类Dev

为什么使用临时寄存器将值传递给段寄存器?

来自分类Dev

变压器是什么意思?

来自分类Dev

“ cdecl = nil”(放在函数声明之后)是什么意思?

来自分类Dev

!<是什么意思?

来自分类Dev

$ @是什么意思?

来自分类Dev

`?:`是什么意思?

来自分类Dev

$($(this))是什么意思?

来自分类Dev

“ ++ a”是什么意思?

来自分类Dev

| =是什么意思

来自分类Dev

〜/`是什么意思?

来自分类Dev

!<是什么意思?

来自分类Dev

!$是什么意思?

来自分类Dev

〜/`是什么意思?