C++汇编理解a++,与++a的本质

时间:2019-02-20
本文章向大家介绍C++汇编理解a++,与++a的本质,主要包括C++汇编理解a++,与++a的本质使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
   int main() {
         int a = 10;
         int b = 0;
         b = a++ + 8;
         // a++汇编代码
         mov eax, dword ptr [a]    // 将a的值取出来赋值给eax,即eax = 10
         add eax, 8                // 将eax里面的值加8 即eax += 8,此时a的值是没有变的
         mov dword ptr [b], eax    // 将最终的结果给了b.即 b = eax
         mov eax, dword ptr [a]    // 将a的值取出来给了eax即 eax = 10
         inc eax                   // 将eax加1即 eax += 1
         mov dword ptr [a], eax    // 将eax的值给了a即 a = 9
         // 结论:a++会返回a以前的值进行运算,运算完毕之后才会让a的值+1
     
     
     
         b = ++a + 8;
         // ++a汇编代码
         mov eax, dword ptr [a]      // 将a的值取出来赋值给eax
         inc eax                     // 让eax加1
         mov dword ptr [a], eax      // 又将eax的值送回给了a 即 a = eax,此时a的值为9已经改变
         mov eax, dword ptr [a]      // 将a的值取出来赋值给eax  即eax = a
         add eax, 8                  // 将eax加8    即eax += 8
         mov dword ptr [b], eax      // 再把最终的结果给了变量b 即b = eax
     
         // 结论:++a会先直接让a的值+1,并且返回最新的a
         cout << a << endl;
     
     
         (a++) = 40;//用a以前的值运算完之后才有改变a的值,这个是将a里面的值先给了eax,是一个临时的寄存器,没有意义,说明a++没有返回a,返回的是一个临时的寄存器,这个赋值是错误的
         (++a) = 20; // 先将a的值加1,a里面的值已改变后,再将a在栈空间的值赋值为20
         getchar();
         return 0;
     }