计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)
第三章 程序的机器级表示
3.1 历史观点
3.2 程序编码
1. 命令行
(1)编译
Linux> gcc -Og -o p p1.c p2.c #编译 p1.c 和 p2.c 文件
(2)ATT 格式汇编Linux>gcc-Og-S mytry.c#产生 C 语言汇编文件 mytry.s, 可直接查看
Linux>gcc-Og-c mytry.c#产生二进制目标代码文件 mytry.o, 无法直接查看
Linux>objdump-d mytry.o#输出 mytry.o 文件的机器代码和反汇编代码, 在命令行中输出
Linux>gcc-Og-o prog main.c mytry.c#生成可执行文件 prog
Linux>objdump-d prog#输出 prog 文件的机器代码和反汇编代码, 在命令行中输出
(3)Intel 格式汇编
Linux> gcc -Og -S -masm=intel mytry.c #产生 C 语言汇编文件 mytry.s, 可直接查看
2. gcc 命令的过程
C 预处理器(扩展源代码, 插入 #include 的文件并扩展 #define 定义的宏)
编译器(产生源文件的汇编代码. s)
汇编器(将汇编代码转换成二进制目标代码文件. o)
链接器(将目标代码文件与实现函数库的代码合并, 并产生可执行文件. p)
3.2.1 机器级代码
1. 两种抽象
(1)指令集架构 / 指令集体系结构(Instruction Set Architecture, ISA)
(2)虚拟地址
3.2.2 代码示例
1. 汇编 vs 反汇编
(1)指令长度: 1-15 字节
(2)反汇编器省略许多指令结尾的 q, 而给 call 和 ret 指令添加 q 后缀
2. 反汇编. o vs 反汇编 prog
(1)地址不同
(2)反汇编 prog 填上了 callq 等指令所需的地址
(3)反汇编 prog 在末尾插入 nop, 使函数代码变为 16 字节, 便于储存下一个代码块
3.2.3 关于格式的注释
1."." 开头的行: 伪指令, 指导汇编器和链接器工作
2.ATT 格式汇编 vsIntel 格式汇编
(1)intel 省略表示大小的后缀
(2)intel 省略寄存器前 %
(3)intel 用不同的方式描述内存中的位置, 如 "QWORD PTR [rbx]" 替代 "(%rbx)"
(4)在带有多个操作数的指令情况下, 列出的操作数顺序相反
3.3 数据格式
1.C 语言数据类型在 x86-64 中的大小
注:
(1)b = byte = 8 bits, w = Word = 16 bits, l = long Word = 32 bits, q = quad Word = 64 bits
(2)浮点数: s = short float(? 我猜的) = 32 bits, l = long float(?) = 64 bits
(3)l 既表示 4 字节整数又表示 8 字节浮点数, 但并不会产生歧义, 因为浮点数使用一组完全不同的寄存器
3.4 访问信息
1.16 个整数寄存器(非常重要)
注:
(1)生成小于 8 字节结果的指令, 剩下的字节会如何?
生成 1 或 2 字节的指令保持剩余字节不变, 生成 4 字节的指令把高位 4 字节置 0
(2)(i guess)栈指针 %rsp = register stack pointer
3.4.1 操作数指示符
1. 操作数(operand)
(1)立即数(immediate): 表示常数值, ATT 汇编代码中表示为 "$"+ 标准 C 表示法表示的整数, 自动选择最紧凑的方法编码(?)
(2)寄存器(register): 表示某个寄存器的内容, 16 个寄存器中的低位 1,2,4,8 字节中的一个作为操作数
(3)内存引用: 根据有效地址访问内存位置
注:
(1)ra 表示任意寄存器 a,R[ra]表示它的值(这是将寄存器集合视为数组 R, 寄存器标识符作为索引)
(2)Mb[Addr]表示对存储在内存中地址 Addr 开始的 b 个字节值的饮用, 可省去下标 b
(3)Imm(rb, ri, s)是最常用的内存引用的寻址模式, 包含: 立即数偏移 Imm(缺省为 0), 基址寄存器 rb(缺省为 0), 变址寄存器 ri(缺省为 0), 比例因子 s(s=1,2,4,8, 缺省为 1), 有效地址为 Imm+R[rb]+R[ri]*s
写在前面: 书中把许多不同的指令划分为指令类, 每一类执行相同的操作, 只不过操作数的大小不同
3.4.2 数据传送指令
1.MOV 类 -- 简单的数据传送指令: 把数据从源位置复制到目的位置
格式: MOV source 源操作数, destination 目的操作数
注:
(1)寄存器部分的大小必须与指令做后一个字符 (b,w,l,q) 指定的大小相匹配
(2)S,D 均可以是内存地址或寄存器, 但不能同时为内存地址; 从内存传送数据到内存需要两条指令: 内存 ->寄存器, 寄存器 ->内存
(3)movq vs movabsq: movq 只能表示以表示为 32 位补码数字的立即数作为源操作数, 然后扩展符号得到 64 位, 而 movabsq 能够以任意 64 位立即数作为源操作数, 但只能以寄存器作为目的
2.MOVZ 和 MOVS 类: 将较小的源值复制到较大的目的时使用
格式:
(1)零扩展(MOV zero)-- 高位补 0: MOVZ + 源大小 + 目的大小 source, register
(2)符号扩展(MOV sign)-- 高位扩展符号位: MOVS + 源大小 + 目的大小 source, register
注:
(1)S 可以是内存地址或寄存器, R 只能是寄存器
(2)不存在 movzlq 指令, 但可以用以 32 位寄存器为目的的 movl 指令实现, 高位 4 字节置 0
(3)cltq 指令无操作数, 效果与 movslq %eax,%rax 完全一致, 但是编码更紧凑(我理解为: 更省地方)
(4)一个有趣的小练习
答案:
3.4.3 数据传送示例
1. 示例
2. 又一个有趣的小练习
答案
注意:
(1)对于长度扩展的情况: 先扩展, 再转移
(2)对于长度缩减的情况: 先转移, 再截断
(3)在有符号数扩展时, 用 movs; 无符号数扩展时, 用 movz
(4)movzbl 与 movzbq 等价, 因为前者会自动把高位 4 字节补 0, 但为了优化 CPU 的效率, 选择了前者(问了助教学长, 但是仍存疑)
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示(持续更新)
来源: http://www.bubuko.com/infodetail-3223302.html
计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...相关推荐
- java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略
java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...
- Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧
Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示
本章主要介绍了计算机中的机器代码--汇编语言.当我们使用高级语言(C.Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现.既然有了高级语言,我们为什么还需要学习汇编语言呢?学习 ...
- python第三章上机实践_《机器学习Python实践》读书笔记-第三章
<机器学习Python实践>,第三章,第一个机器学习项目 以往目录:橘猫吃不胖:<机器学习Python实践>读书笔记-第一章zhuanlan.zhihu.com 书中介绍了一 ...
- 《php开发典型模块大全》读书笔记 第三章 mysql数据库基础
第三章 mysql基础 show columns from table describe table alter table 修改表 rename table t1 to t2 整型 ...
- sql经典实例_读书笔记 前三章
sql经典实例_读书笔记 温故SQL以及数据库相关知识 1.检索记录 select * from emp //检索所有列 where dep = 10 //选择出指定行 or comm is not ...
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- Effective Java 读书笔记----第三章
第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...
- JavaScript Dom编程艺术(第二版)读书笔记 第三章DOM
第三章DOM 3.1文档中的DOM的"D" 如果没有document(文档),DOM也就无从谈起.当创建了一个网页并把它加载到Web浏览器中时,Dom就在幕后悄然而生.它把你编写的 ...
最新文章
- spring与springBoot不同之处
- Vue中使用a标签实现点击在新标签页中打开实现照片预览
- C语言入门之指针用法教程
- 为什么你需要考虑选择SaaS化持续交付产品?
- emif接口速率问题_OMAPL138 EMIF读取速率问题
- 中英文混合字符串长度的获取
- RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码
- Security+ 学习笔记28 云计算
- APP开发难吗?澳大利亚10岁儿童已开发5个手机App
- lcd12864历程C语言程序,基于51单片机的LCD12864程序设计
- matlab比较判断简写,MATLAB一词来自( )的缩写。
- 八大排序算法原理及实现
- java学习-狼人杀
- PDF电子发票解析免费版
- mysql5.7.26搭建MGR单主及多主模式
- 各种电信安卓手机玩机宝典!——转自天翼圈in189
- java 根据list中 | 中、英文名称进行排序
- jena 查询 java_Java调用Jena写SPARQL查询
- VPP GTP-U隧道性能测试3---GTP-U封包性能测试
- 一个资源丰富的在线小程序社区推荐
热门文章
- 有观赏性的c语言程序,设计一个C语言程序,对以孩子链表表示的树计算该树的深度- 一起装修网...
- jQuery EasyUI 数据网格
- 06 外键的三种分类
- forEach、for...in、for...of
- 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
- Uva 10557 XYZZY
- 8位深, 16位深,24位深,32位深图片显示原理及对比
- 检查压缩包是否损坏_工业脉冲布袋除尘器安装前的检查工作
- 如何查看 Windows10 版本号
- 2021年最后一个月