学习笔记从汇编看 a+++a与 a+a++的区别
Posted 曾胖神父
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记从汇编看 a+++a与 a+a++的区别相关的知识,希望对你有一定的参考价值。
汇编代码查看方法
使用VS2019,新建断点在需要查看的代码文件里,然后点击调试,在调试过程中,点击调试-》窗口-》反汇编,就能看到当前代码的汇编格式了
a+++a与 a+a++的汇编指令与直译
声明变量 a,b,c的汇编指令
int a = 1;
00007FF9854D0FDC mov dword ptr [rbp+34h],1
int b = 1;
00007FF9854D0FE3 mov dword ptr [rbp+30h],1
int c = 1;
00007FF9854D0FEA mov dword ptr [rbp+2Ch],1
a+++a的汇编指令
00007FF9854D0FF1 mov ecx,dword ptr [rbp+34h]
00007FF9854D0FF4 mov dword ptr [rbp+28h],ecx
00007FF9854D0FF7 mov ecx,dword ptr [rbp+34h]
00007FF9854D0FFA inc ecx
00007FF9854D0FFC mov dword ptr [rbp+34h],ecx
00007FF9854D0FFF mov ecx,dword ptr [rbp+28h]
00007FF9854D1002 add ecx,dword ptr [rbp+34h]
00007FF9854D1005 mov dword ptr [rbp+2Ch],ecx
a+++a的汇编指令直译
把变量a内存地址的数据赋给寄存器ecx
寄存器ecx的数据赋给rbp+28h内存地址
把变量a内存地址的数据赋给寄存器ecx
寄存器ecx的值自加1
寄存器ecx的数据赋给变量a内存地址(PS:这个时候就a完成自增并且a=2)
把rbp+28h内存地址的数据赋给寄存器ecx
将寄存器ecx的值与变量a内存地址的值相加,并将值赋予寄存器ecx
寄存器ecx的数据赋给变量c内存地址
a+a++的汇编指令
00007FF9854D100F mov ecx,dword ptr [rbp+34h]
00007FF9854D1012 mov dword ptr [rbp+24h],ecx
00007FF9854D1015 mov ecx,dword ptr [rbp+34h]
00007FF9854D1018 mov dword ptr [rbp+20h],ecx
00007FF9854D101B mov ecx,dword ptr [rbp+34h]
00007FF9854D101E inc ecx
00007FF9854D1020 mov dword ptr [rbp+34h],ecx
00007FF9854D1023 mov ecx,dword ptr [rbp+24h]
00007FF9854D1026 add ecx,dword ptr [rbp+20h]
00007FF9854D1029 mov dword ptr [rbp+30h],ecx
a+a++的汇编指令直译
把变量a内存地址的数据赋给寄存器ecx
寄存器ecx的数据赋给rbp+24h内存地址
把变量a内存地址的数据赋给寄存器ecx
寄存器ecx的数据赋给rbp+20h内存地址
把变量a内存地址的数据赋给寄存器ecx
寄存器ecx的值自加1
寄存器ecx的数据赋给变量a内存地址(PS:这个时候就a完成自增并且a=2)
把rbp+24h内存地址的数据赋给寄存器ecx
将寄存器ecx的值与rbp+20内存地址的值相加,并将值赋予寄存器ecx(结果为2)
寄存器ecx的数据赋给变量b内存地址
a+++a与 a+a++的汇编指令的区别
a+++a与 a+a++的汇编指令的直接区别在于a+a++声明了一个新的内存地址,该内存地址装载了a未自增的值,并且参与计算的是该内存地址,而非自增后的a。
以上是关于学习笔记从汇编看 a+++a与 a+a++的区别的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记--转Parameter与Attribute的区别&servletContext与ServletConfig区别