学习笔记从汇编看 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++的区别的主要内容,如果未能解决你的问题,请参考以下文章

Go ASM 学习笔记之 ppt 版

C++ | 调试 ·?从汇编代码看i++和++i的区别

[OC学习笔记]ARC与引用计数

JAVA学习笔记——a++与++a的区别

汇编(微机系统上机学习)基于DOSbox实现DEbug

学习笔记--转Parameter与Attribute的区别&servletContext与ServletConfig区别