当前位置: 首页 > news >正文

怎样做微网站南宁关键词优化公司

怎样做微网站,南宁关键词优化公司,做一家直播卖货的网站,打字赚钱平台 学生一单一结C中的this指针一直比较神秘。任何类的对象,都有一个this指针,无处不在。那么this指针的本质究竟是什么?this指针什么时候会被用到?今天通过几段简单的代码,来揭秘一下。 要先揭秘this指针,先来说一下函数调…

C++中的this指针一直比较神秘。任何类的对象,都有一个this指针,无处不在。那么this指针的本质究竟是什么?this指针什么时候会被用到?今天通过几段简单的代码,来揭秘一下。

要先揭秘this指针,先来说一下函数调用时参数的传递过程。考虑以下代码:

int sum(int i, int j, int k)
{return i + j + k;
}int main()
{int a, b, c;a = 1;b = 2;c = 3; sum(a,b,c);return 0;
}

这是一段非常简单的函数调用代码。我们生成其汇编代码(x86-64),如下所示:

sum(int, int, int):pushq   %rbpmovq    %rsp, %rbpmovl    %edi, -4(%rbp)movl    %esi, -8(%rbp)movl    %edx, -12(%rbp)movl    -4(%rbp), %edxmovl    -8(%rbp), %eaxaddl    %eax, %edxmovl    -12(%rbp), %eaxaddl    %edx, %eaxpopq    %rbpret
main:pushq   %rbpmovq    %rsp, %rbpsubq    $16, %rspmovl    $1, -4(%rbp)movl    $2, -8(%rbp)movl    $3, -12(%rbp)movl    -12(%rbp), %edxmovl    -8(%rbp), %ecxmovl    -4(%rbp), %eaxmovl    %ecx, %esimovl    %eax, %edicall    sum(int, int, int)movl    $0, %eaxleaveret

我们重点来关注一下函数参数的传递过程。通过分析main函数的汇编函数, 我用类似于C语言的伪代码解释了一下每一行的意思,辅助理解,如下所示。

main        pushq   %rbpmovq    %rsp, %rbp      //rbp = rspsubq    $16, %rsp       //rsp -= 16movl    $1, -4(%rbp)    //*(rbp-4) = 1movl    $2, -8(%rbp)    //*(rbp-8) = 2 movl    $3, -12(%rbp)   //*(rbp-12) = 3movl    -12(%rbp), %edx //edx =*(rbp-12)movl    -8(%rbp), %ecx   //ecx =*(rbp-8) movl    -4(%rbp), %eax   //eax = *(rbp-4)movl    %ecx, %esi    //esi = ecx movl    %eax, %edi   //edi = eaxcall    sum(int, int, int)movl    $0, %eaxleaveret

在执行这条指令(call sum(int, int, int))前,main函数的栈空间分布如下:

即main函数会存储三个变量: a, b, c. 同时会将其值分别赋值给edi, esi、edx寄存器。那么我们很好奇,将a, b, c三个变量的值赋值给edi, esi、edx寄存器会有什么用呢?我们先来看一下sum函数,我用类似于C语言的伪代码解释了一下每一行的意思,辅助理解,如下所示。

sum(int, int, int):pushq   %rbpmovq    %rsp, %rbp         //rbp = rspmovl    %edi, -4(%rbp)     //*(rbp-4) = edimovl    %esi, -8(%rbp)     //*(rbp-8) = esimovl    %edx, -12(%rbp)    //*(rbp-12) = edxmovl    -4(%rbp), %edx     //edx = *(rbp-4)movl    -8(%rbp), %eax     //eax = *(rbp-8)addl    %eax, %edx         //edx += eax  movl    -12(%rbp), %eax    //eax = *(rbp-12) addl    %edx, %eax         //eax += edx popq    %rbpret

sum函数的栈空间分布如下:

 

我们重点关注一下这几条指令:

 movl    %edi, -4(%rbp)     //*(rbp-4) = edi
 movl    %esi, -8(%rbp)     //*(rbp-8) = esi
 movl    %edx, -12(%rbp)  //*(rbp-12) = edx

可以看到,在sum函数的栈空间中,其会分配三个存储单元,rbp-4, rbp-8, rbp-12存储1,2,3。而1,2,3这三个值分别又是从edi,  esi、edx三个寄存器中拷贝过来的。而这三个寄存器的值又是来自main函数中a, b, c三个变量的赋值。也就是说,这里edi,  esi、edx三个寄存器,在函数调用时,完成了参数的传递。那么这种参数传递的现像是不是有什么约定呢? 答案是有的!

在Linux/macOS 等 Unix-like系统中,函数的调用约定标准为System V AMD64 ABI,其参数传递机制:

参数位置整数/指针寄存器浮点寄存器
第 1 个RDIXMM0
第 2 个RSIXMM1
第 3 个RDXXMM2
第 4 个RCXXMM3
第 5 个R8XMM4
第 6 个R9XMM5
第 7+ 个栈(右→左)XMM6-7

从这个约定中得知,在传递整数时,第一个参数用的是RDI寄存器,第二个参数用的是RSI寄存器,第三个参数用的是RDX寄存器。上面函数调用的例子中正好符合此调用约定(例子中用的是edi,  esi、edx三个寄存器传递第1,第2,第3个参数,而edi,  esi、edx正好是RDI、RSI、RDX三个寄存器的低32位)。

<this指针揭秘继续...>

 

 

 

http://www.mnyf.cn/news/36889.html

相关文章:

  • 白山市住房和建设局网站小熊代刷推广网站
  • html做网站步骤怎么做电商创业
  • 优化网站建设公司网络建站工作室
  • 360优化大师如何优化关键词的排名
  • 四川网站建设找哪家网络公关公司收费
  • 网站开发做网站谷歌广告推广网站
  • 河南省建筑业协会官网郑州专业seo首选
  • 苏州网站建设情况付费恶意点击软件
  • 宋家庄网站建设seo短视频发布页
  • 企业内部网页设计seo自媒体运营技巧
  • 国外vpsseo关键词排名优化手机
  • 做网站的主要任务东莞seo计费
  • 时时彩网站开发本地推荐本地推荐
  • 农业电商平台有哪些淘宝seo排名优化
  • 大连品尚茗居装修公司怎么样广州网站优化价格
  • 怎么在公众号上做网站软文代写是什么
  • 深圳图派做的网站后台加什么怎么找需要做推广的公司
  • 中国免费空间网重庆二级站seo整站优化排名
  • wordpress做学校网站真正免费的网站建站平
  • 钱宝做任务的网站怎么下搜狗推广开户
  • 织梦美女图片网站手机版友情链接的网站
  • cdr可以做网站页面吗嘉兴seo外包公司费用
  • 天河网站建设服务google play服务
  • 网站有访问量 为什么没有询盘企业网站seo贵不贵
  • 萍乡疫情最新情况重庆seo结算
  • 怎么做网站的步骤重庆网站优化公司
  • 猫扑网站开发的游戏站长工具使用方法
  • 六盘水住房和城乡建设部网站百度搜索app免费下载
  • 非洲外贸平台有哪些免费的seo
  • wordpress上传主题500错误灰色seo关键词排名