gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:56:54 25 4
gpt4 key购买 nike

我正在研究 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++ 使用它来分配内存,
    有人能告诉我更多吗?它在一个库中吗?
    如果可能的话,我可以得到它的源代码吗?如何?
  • 我不太熟悉这个语法,它想做什么?
  • 最佳答案

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

    来自 GNU as manual :

    AT&T absolute (as opposed to PC relative) jump/call operands are prefixed by `*'; they are undelimited in Intel syntax.



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

    关于assembly - 在寄存器前放一颗星是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19088064/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com