IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> C++:lamda:汇编查看实现 -> 正文阅读

[开发工具]C++:lamda:汇编查看实现

文章目录

代码

nclude <iostream>
using namespace std;
int main()
{
int b = 9;
auto d = [](int a){cout<<"a="<<a<<endl;};
auto c = [&](int a){cout<<"a="<<a<<"b="<<b<<endl;};
d(3);
c(4);
}

汇编

这个也会生成一个汇编函数。带入的参数。如果是捕获引用,就会将引用地址通过 rax 传递栈地址,到lamda函数里,使用。
lamda函数名包含:父函数名::{lambda(返回类型)编号}::operator()(参数类型)const

0000000000400876 <main::{lambda(int)#1}::operator()(int) const>:
  400876:       55                      push   %rbp
  400877:       48 89 e5                mov    %rsp,%rbp
  40087a:       48 83 ec 10             sub    $0x10,%rsp
  40087e:       48 89 7d f8             mov    %rdi,-0x8(%rbp)
  400882:       89 75 f4                mov    %esi,-0xc(%rbp)
  400885:       be 49 0a 40 00          mov    $0x400a49,%esi
  40088a:       bf 60 10 60 00          mov    $0x601060,%edi
  40088f:       e8 ac fe ff ff          callq  400740 <basic_ostream<char, char_traits<char> >& operator<< <char_traits<char> >(basic_ostream<char, char_traits<char> >&, char const*)@plt>
s 400894:       48 89 c2                mov    %rax,%rdx
  400897:       8b 45 f4                mov    -0xc(%rbp),%eax
  40089a:       89 c6                   mov    %eax,%esi
  40089c:       48 89 d7                mov    %rdx,%rdi
  40089f:       e8 cc fe ff ff          callq  400770 <std::ostream::operator<<(int)@plt>
  4008a4:       be 20 07 40 00          mov    $0x400720,%esi
  4008a9:       48 89 c7                mov    %rax,%rdi
  4008ac:       e8 9f fe ff ff          callq  400750 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))@plt>
  4008b1:       90                      nop
  4008b2:       c9                      leaveq
  4008b3:       c3                      retq
00000000004008b4 <main::{lambda(int)#2}::operator()(int) const>:
  4008b4:       55                      push   %rbp
  4008b5:       48 89 e5                mov    %rsp,%rbp
  4008b8:       48 83 ec 10             sub    $0x10,%rsp
  4008bc:       48 89 7d f8             mov    %rdi,-0x8(%rbp)
  4008c0:       89 75 f4                mov    %esi,-0xc(%rbp)
  4008c3:       be 49 0a 40 00          mov    $0x400a49,%esi
  4008c8:       bf 60 10 60 00          mov    $0x601060,%edi
  4008cd:       e8 6e fe ff ff          callq  400740 <basic_ostream<char, char_traits<char> >& operator<< <char_traits<char> >(basic_ostream<char, char_traits<char> >&, char const*)@plt>
s 4008d2:       48 89 c2                mov    %rax,%rdx   将传进来的引用地址放到,rdx 
  4008d5:       8b 45 f4                mov    -0xc(%rbp),%eax 
  4008d8:       89 c6                   mov    %eax,%esi
  4008da:       48 89 d7                mov    %rdx,%rdi   将引用放到第一个参数
  4008dd:       e8 8e fe ff ff          callq  400770 <std::ostream::operator<<(int)@plt>
  4008e2:       be 4c 0a 40 00          mov    $0x400a4c,%esi
  4008e7:       48 89 c7                mov    %rax,%rdi
  4008ea:       e8 51 fe ff ff          callq  400740 <std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@plt>
  4008ef:       48 89 c2                mov    %rax,%rdx
  4008f2:       48 8b 45 f8             mov    -0x8(%rbp),%rax
  4008f6:       48 8b 00                mov    (%rax),%rax
  4008f9:       8b 00                   mov    (%rax),%eax
  4008fb:       89 c6                   mov    %eax,%esi
  4008fd:       48 89 d7                mov    %rdx,%rdi
  400900:       e8 6b fe ff ff          callq  400770 <std::ostream::operator<<(int)@plt>
  400905:       be 20 07 40 00          mov    $0x400720,%esi
  40090a:       48 89 c7                mov    %rax,%rdi
  40090d:       e8 3e fe ff ff          callq  400750 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))@plt>
  400912:       90                      nop
  400913:       c9                      leaveq
  400914:       c3                      retq

0000000000400915 <main>:
  400915:       55                      push   %rbp
  400916:       48 89 e5                mov    %rsp,%rbp
  400919:       48 83 ec 10             sub    $0x10,%rsp
  40091d:       c7 45 fc 09 00 00 00    movl   $0x9,-0x4(%rbp)   变量 b;9 
  400924:       48 8d 45 fc             lea    -0x4(%rbp),%rax  变量b的地址放到rax
  400928:       48 89 45 f0             mov    %rax,-0x10(%rbp)  变量的地址放到栈  0x100x8
  40092c:       48 8d 45 fb             lea    -0x5(%rbp),%rax   rbp - 5 放到rax 为什么要在栈上分配一个内存传递过去,因为只有一个参数。
  400930:       be 03 00 00 00          mov    $0x3,%esi    第二个参数
  400935:       48 89 c7                mov    %rax,%rdi    第一个参数
  400938:       e8 39 ff ff ff          callq  400876 <main::{lambda(int)#1}::operator()(int) const>
  40093d:       48 8d 45 f0             lea    -0x10(%rbp),%rax  将要捕获的引用放到rax
  400941:       be 04 00 00 00          mov    $0x4,%esi
  400946:       48 89 c7                mov    %rax,%rdi
  400949:       e8 66 ff ff ff          callq  4008b4 <main::{lambda(int)#2}::operator()(int) const>
  40094e:       b8 00 00 00 00          mov    $0x0,%eax
  400953:       c9                      leaveq
  400954:       c3                      retq

解释

在汇编里出现的符号,可以参考下面这个文章理解
00000000004008b4 <main::{lambda(int)#2}::operator()(int) const>:
https://blog.csdn.net/zhangxiangdavaid/article/details/44064765
https://web.mst.edu/~nmjxv3/articles/lambdas.html

这个出处是哪里?没找到文档。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 09:03:29  更:2021-11-26 09:04:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:39:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码