【C语言学习疑难杂症】第12期:如何从汇编角度深入理解y = (*--p)++这行代码(易懂版)

2023-12-26 23:53:22

对于如下代码,思考一下输出结果是什么?

int a[] = {5, 8, 7, 6, 2, 7, 3};
int y, *p = &a[1];
y = (*--p)++;
printf("%d ",y);
printf("%d",a[0]);

这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。

我们在vs2022的环境下,反汇编得到下面的x86汇编代码:

00E2196F  mov         eax,dword ptr [p]  
00E21972  sub         eax,4  
00E21975  mov         dword ptr [p],eax  
00E21978  mov         ecx,dword ptr [p]  
00E2197B  mov         edx,dword ptr [ecx]  
00E2197D  mov         dword ptr [y],edx  
00E21980  mov         eax,dword ptr [p]  
00E21983  mov         ecx,dword ptr [eax]  
00E21985  add         ecx,1  
00E21988  mov         edx,dword ptr [p]  
00E2198B  mov         dword ptr [edx],ecx 

前6行就不讨论了,简单的说就是它把指针往前移动一个位置,然后解引用把里面的值赋值给y。

但是后面的部分,也就是从第7行开始,我们需要重点理解。

mo

文章来源:https://blog.csdn.net/lws123253/article/details/135232742
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。