从c++ new到汇编

得到一个有意思的 c++语法分析网站,可以把 c++高级版本的程序展开为 c++11的形式,更方便看到那些高级特性是如何实现的,从c++ new到汇编_第1张图片
另外也提供 cpp-> 汇编代码的功能(那个绿色齿轮open in compiler Explore 按键),比起命令行的显示,提供颜色区分,视觉上更加直观。
从c++ new到汇编_第2张图片
详细注释一下 汇编代码的功能,前提知识
栈的生长方向是逆着地址增长方向的,也就是说 栈底地址 > 栈顶地址
rbp, rsp 通常分别用来保存 栈低和栈顶指针的值
edi, eax 通常分别用来表示 入参和返回值


int main() {
  char * a = new char('a');
  char * b = new char[10];
  delete[] b;
  delete a;
  return 0;


}

main:
        push    rbp   //将调用函数的堆栈基底指针保护起来
        mov     rbp, rsp  // 将原栈顶作为本次栈的基底指针
        sub     rsp, 16 // 编译器注意到,本次的局部变量为 16字节(两个指针 a, b ),先更新了栈顶指针
        mov     edi, 1  // 准备 new 的入参
        call    operator new(unsigned long)
        mov     BYTE PTR [rax], 97 // 将'a' 的ASCII码97放到 rax 指向的内存, rax的值为上面 new 出的结果
        mov     QWORD PTR [rbp-8], rax // 把  rax的值拷贝到 rbp-8 的位置,也就是 指针 a的值
        mov     edi, 10 // 准备 new char 的入参10
        call    operator new[](unsigned long)
        mov     QWORD PTR [rbp-16], rax // 将 raw 的值拷贝到 rbp-16的位置,也就是指针 b的值
        cmp     QWORD PTR [rbp-16], 0 // 比较 b 是否是 0,如果是,直接跳转到L2(说明本次 b == nullptr)
        je      .L2
        mov     rax, QWORD PTR [rbp-16] // 为delete 准备入参
        mov     rdi, rax
        call    operator delete[](void*)
.L2:
        mov     rax, QWORD PTR [rbp-8]
        test    rax, rax // test 按位与,如果为 0返回 true
        je      .L3 // true 的话直接调到 L3
        mov     rdi, rax // false的话准备入参
        call    operator delete(void*) // delete a
.L3:
        mov     eax, 0 // 准备返回值为 0
        leave
        ret // return

你可能感兴趣的:(C++,c++,开发语言)