解读《深入理解计算机系统 (CSAPP)》第 3 章程序的机器级表示
前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫
🏆 Java 领域新星创作者、阿里云专家博主、华为云享专家🏆
🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
本文导读:本章中,我们了解 C 语言机器级编程,通过让编译器产生机器级程序的汇编代码表示,了解了编译器和他的优化能力,以及机器、数据类型和指令集。
一、程序编码
gcc 命令:C 编译器 ;gcc -0g 代表机器代码的优化等级
机器级编程,两种抽象:一、由指令集体系结构或指令集架构来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式、以及每条指令对状态的影响。二、机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个很大的、按字节寻址的数组。
二、数据格式
x86-64 指令集包括完整的针对字节、字和双字的指令。x86-64 指令集这个东西也是 ISA 指令集的一种,他的作用是编译用的,编译也可以分为三步 前端-》中间语言-》后端,前端就是由不同需要接入当前编译器的前端开发者进行开发,来适配多门语言,过程为 高级语言源代码-》词法分析-》语法分析-》构件 AST 的过程-》到中间语言,中间语言解耦,后端由不同需要接入当前编译器的后端开发进行开发,来适配多门目标机器语言(ISA),拿到中间语言-》做分析优化,最终生成目标语言。
三、访问信息
一个 x86-64 的中央处理器单元(CPU)包含一组 16 个存储 64 位值的通用目的寄存器。这些寄存器用来存储整数数据和指针。
指令可以对这 16 个寄存器的低位字节中存放的不同大小的数据进行操作。生成 1 字节和 2 字节数字的指令会保持剩下的字节不变, 生成 4 字节数字的指令会把高位 4 个字节置为 0(高 16 位)。如下图所示。
四、汇编指令大全
指令
数据传输指令:
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)动态的将字节码序列翻译成机器指令。
版权声明: 本文为 InfoQ 作者【小明Java问道之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/a7e2d2f5a8423f68736f40ec8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论