在寄存器前加星是啥意思?

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-&gt;show() 需要查看要调用的正确函数是什么。这是因为它是 A 类上的虚函数。

【讨论】:

我写这篇文章是为了确保我理解正确。根据您提供的链接,这是否意味着它将调用从该寄存器中存储的地址开始的函数? @GavinSmith,寄存器是否也可以包含您可以跳转到的偏移量,而不是绝对地址?否则这个引用无论如何都没有意义。

以上是关于在寄存器前加星是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

verilog “RTL仿真”是啥意思?

计算机C语言中的关键字:register是啥意思?

这是啥意思 x86 汇编代码是啥意思? [复制]

就编程而言,“注册”是啥意思?

嵌入式 linux基于arm中,其中的 内存映射 是啥意思?具体完成啥过程?一定采纳

stm32中GPIOB->BSRR这句话是啥意思?是否跟GPIOB.BSRR意思一样?一定采纳