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

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

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

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

相关文章:

  • php的laravel权限问题
  • 【开源】基于Vue+SpringBoot的二手车交易系统
  • MySQL一些常用命令
  • Unity UnityWebRequest 在Mac上使用报CommectionError
  • 不给病毒留空子:保护您的数据免受.mallox勒索病毒威胁
  • 饥荒Mod 开发(二三):显示物品栏详细信息
  • 嵌入式开发——ADC开发
  • Cisco模拟器-企业网络部署
  • hadoop hive spark flink 安装
  • STL——排序算法
  • pytest pytest.ini 设置目录路径,不执行该目录下的case
  • 前端框架前置学习(4) AJAX
  • 基于Unity Editor开发一个技能编辑器可能涉及到的内容
  • C++设计模式:单例模式(饿汉式、懒汉式)
  • LangChain.js 实战系列:入门介绍
  • 收藏网友的 源程序下载网
  • 「译」Node.js Streams 基础
  • angular2 简述
  • CSS3 变换
  • docker python 配置
  • es6--symbol
  • gcc介绍及安装
  • Go 语言编译器的 //go: 详解
  • JavaScript的使用你知道几种?(上)
  • JS 面试题总结
  • vue.js框架原理浅析
  • 技术发展面试
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊flink的BlobWriter
  • 由插件封装引出的一丢丢思考
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (12)Hive调优——count distinct去重优化
  • (4)Elastix图像配准:3D图像
  • (arch)linux 转换文件编码格式
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)理解angular中的module和injector,即依赖注入
  • (四)Linux Shell编程——输入输出重定向
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net 无限分类
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net的socket示例
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET中winform传递参数至Url并获得返回值或文件
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /etc/fstab和/etc/mtab的区别
  • @Autowired @Resource @Qualifier的区别
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ SNOI 2013 ] Quare