解读《深入理解计算机系统 (CSAPP)》第 3 章程序的机器级表示

简介: C语言机器级编程通过让编译器产生机器级程序的汇编代码表示,了解了编译器以及机器、数据类型和指令集

image.png

前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫
🏆 Java领域优质创作者、阿里云专家博主、华为云享专家🏆
🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

本文导读

本章中,我们了解 C 语言机器级编程,通过让编译器产生机器级程序的汇编代码表示,了解了编译器和他的优化能力,以及机器、数据类型和指令集。

一、程序编码

gcc 命令:C 编译器 ;gcc -0g 代表机器代码的优化等级

机器级编程,两种抽象:一、由指令集体系结构或指令集架构来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式、以及每条指令对状态的影响。二、机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个很大的、按字节寻址的数组。

二、数据格式

x86-64 指令集包括完整的针对字节、字和双字的指令。x86-64 指令集这个东西也是 ISA 指令集的一种,他的作用是编译用的,编译也可以分为三步 前端-》中间语言-》后端,前端就是由不同需要接入当前编译器的前端开发者进行开发,来适配多门语言,过程为 高级语言源代码-》词法分析-》语法分析-》构件 AST 的过程-》到中间语言,中间语言解耦,后端由不同需要接入当前编译器的后端开发进行开发,来适配多门目标机器语言(ISA),拿到中间语言-》做分析优化,最终生成目标语言。

image.png

三、访问信息

一个 x86-64 的中央处理器单元(CPU)包含一组 16 个存储 64 位值的通用目的寄存器。这些寄存器用来存储整数数据和指针。

指令可以对这 16 个寄存器的低位字节中存放的不同大小的数据进行操作。生成 1 字节和 2 字节数字的指令会保持剩下的字节不变, 生成 4 字节数字的指令会把高位 4 个字节置为 0(高 16 位)。如下图所示。

image.png

四、汇编指令大全

数据传输指令:

mov 传送

pushq 压入栈

popq 弹出栈

leaq 加载有效地址(是 movq 指令的变形)


算术和逻辑操作:

INC

DEG

NEG

NOT

ADD

SUB

IMUL

XOR

OR

AND

SAL

SHL

SAR

SHR

imulp

mulp

cqto

idivq

divq


控制指令:

CMP 比较(不修改寄存器的值,只设置条件码)

TEST 测试(不修改寄存器的值,只设置条件码)

SET 访问条件码(根据条件码组合 set0/1)

jump 跳转指令 (跳转到另一条带标号的目的地)

cmove 用条件传送来实现条件分支

switch_eg switch 语句(引用跳转表)


过程指令

call 转移控制(控制从函数 P 转移到函数 Q 的过程,这个东西跳转指令用的)

%rdi %edx…… 数据传送(寄存器中的局部存储变量,很常见)

五、理解指针

1、每个指针都有都有一个值 2、指针用 & 创建 3、* 用于间接引用指针 4、数组引用(a[3])与指针运算和间接引用(*(a+3))有一样的效果 5、将指针从一种类型强制转换成另一种类型,只改变他的类型,不改变他的值 7、指针可以指向函数(int fun(int i);  int (*fp)(int i); fp = fun;)(调用:int result=fp(3))

六、小结

我们了解 C 语言机器级编程,通过让编译器产生机器级程序的汇编代码表示,了解了编译器和他的优化能力,以及机器、数据类型和指令集。

Java 的目标代码是特殊的二进制——java 字节码,可以看成是虚拟机的机器级程序,软件解释器处理字节代码。另外有一种及时编译(just-in-time compilation JIT)动态的将字节码序列翻译成机器指令。

相关文章
|
Shell 开发工具
【shell脚本】Graylog服务状态异常监测与告警
【shell脚本】Graylog服务状态异常监测与告警
199 0
|
12月前
|
搜索推荐 数据挖掘 双11
淘宝运营进阶秘籍:从业余到专业
淘宝运营涉及市场分析、产品定位、店铺装修、营销推广、客户服务、数据分析等多环节。要脱颖而出,需掌握进阶秘籍。本文从精准定位、店铺装修、定价策略、流量获取、客户服务、数据分析及跨平台合作七大方面深入探讨,助商家实现从平凡到卓越的蜕变。通过目标受众分析、优化店铺形象、合理定价、多种促销手段、提升客户体验、利用数据反馈调整策略以及拓展销售渠道,商家可逐步提升运营能力,在竞争激烈的电商环境中取得成功。
1455 4
|
12月前
|
SQL 关系型数据库 MySQL
小索引大力量,记一次explain的性能优化经历
本文介绍了在MySQL生产环境中使用EXPLAIN工具进行性能优化的过程。通过分析慢查询日志,识别出性能瓶颈,并利用EXPLAIN命令解析SQL执行计划,找出全表扫描、未使用索引等问题。文章还详细描述了如何配置慢查询日志、解读EXPLAIN输出的关键字段(如type、key、rows等),并提供了优化建议,如避免左右模糊查询、减少多表联查等。最终验证优化效果,确保系统性能提升。此外,强调了项目初期建立索引的重要性,以应对未来数据量增长带来的挑战。
475 0
|
存储 前端开发 安全
高通量基因测序在药物研发和靶向治疗中的应用(一)
高通量基因测序在药物研发和靶向治疗中的应用(一)
1270 0
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的深度整合
【8月更文挑战第27天】 在现代Web开发中,后端服务的高效性至关重要。本文深入探讨了如何利用Node.js的非阻塞I/O特性和Express框架的简洁性来打造高性能的后端服务。我们将通过具体案例,展示如何在不牺牲代码可读性和可维护性的前提下,实现高效的请求处理和服务端逻辑。文章旨在为开发者提供一个清晰的指导,帮助他们在构建后端服务时做出更明智的技术选择。
|
缓存 JavaScript 前端开发
前端框架与库 - Vue.js基础:模板语法、数据绑定
【7月更文挑战第14天】Vue.js 是渐进式框架,以简洁API和高效数据绑定知名。本文聚焦模板语法与数据绑定,解释常见问题和易错点,助力初学者避坑。模板语法中,{{ expression }} 用于渲染值,v-bind/: 用于动态绑定属性。数据绑定涉及文本、属性和事件,注意v-model适用于表单元素,计算属性有缓存。理解正确用法,借助文档和IDE,可提升开发质量和效率。善用Vue.js,打造响应式UI。
559 4
|
Java fastjson C++
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
830 2
|
缓存 前端开发 PHP
【PHP开发专栏】Smarty模板引擎详解
【4月更文挑战第30天】Smarty是PHP流行的模板引擎,分离逻辑与UI,加速开发。本文分三部分解析其使用和特性:1)介绍及安装配置;2)基本使用和语法,如数据分配、模板继承、循环与条件判断;3)高级功能,包括缓存机制、插件体系和调试工具。通过学习,开发者能提升Web应用构建效率和可维护性。
273 3
|
存储 Java 数据库连接
Java基础之数据载体定义及场景
Java基础之数据载体定义及场景
123 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的自助甜品网站的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的自助甜品网站的详细设计和实现(源码+lw+部署文档+讲解等)
127 0