计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)

第三章 程序的机器级表示

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

计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...相关推荐

  1. java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略

    java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...

  2. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

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

    本章主要介绍了计算机中的机器代码--汇编语言.当我们使用高级语言(C.Java等)编程时,代码会屏蔽机器级的细节,我们无法了解到机器级的代码实现.既然有了高级语言,我们为什么还需要学习汇编语言呢?学习 ...

  4. python第三章上机实践_《机器学习Python实践》读书笔记-第三章

    <机器学习Python实践>,第三章,第一个机器学习项目 以往目录:橘猫吃不胖:<机器学习Python实践>读书笔记-第一章​zhuanlan.zhihu.com 书中介绍了一 ...

  5. 《php开发典型模块大全》读书笔记 第三章 mysql数据库基础

    第三章  mysql基础 show columns  from table describe table alter table 修改表 rename   table   t1  to   t2 整型 ...

  6. sql经典实例_读书笔记 前三章

    sql经典实例_读书笔记 温故SQL以及数据库相关知识 1.检索记录 select * from emp //检索所有列 where dep = 10 //选择出指定行 or comm is not ...

  7. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  8. Effective Java 读书笔记----第三章

    第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...

  9. JavaScript Dom编程艺术(第二版)读书笔记 第三章DOM

    第三章DOM 3.1文档中的DOM的"D" 如果没有document(文档),DOM也就无从谈起.当创建了一个网页并把它加载到Web浏览器中时,Dom就在幕后悄然而生.它把你编写的 ...

最新文章

  1. spring与springBoot不同之处
  2. Vue中使用a标签实现点击在新标签页中打开实现照片预览
  3. C语言入门之指针用法教程
  4. 为什么你需要考虑选择SaaS化持续交付产品?
  5. emif接口速率问题_OMAPL138 EMIF读取速率问题
  6. 中英文混合字符串长度的获取
  7. RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码
  8. Security+ 学习笔记28 云计算
  9. APP开发难吗?澳大利亚10岁儿童已开发5个手机App
  10. lcd12864历程C语言程序,基于51单片机的LCD12864程序设计
  11. matlab比较判断简写,MATLAB一词来自( )的缩写。
  12. 八大排序算法原理及实现
  13. java学习-狼人杀
  14. PDF电子发票解析免费版
  15. mysql5.7.26搭建MGR单主及多主模式
  16. 各种电信安卓手机玩机宝典!——转自天翼圈in189
  17. java 根据list中 | 中、英文名称进行排序
  18. jena 查询 java_Java调用Jena写SPARQL查询
  19. VPP GTP-U隧道性能测试3---GTP-U封包性能测试
  20. 一个资源丰富的在线小程序社区推荐

热门文章

  1. 有观赏性的c语言程序,设计一个C语言程序,对以孩子链表表示的树计算该树的深度- 一起装修网...
  2. jQuery EasyUI 数据网格
  3. 06 外键的三种分类
  4. forEach、for...in、for...of
  5. 2016.09.03【初中部 NOIP提高组 】模拟赛A总结
  6. Uva 10557 XYZZY
  7. 8位深, 16位深,24位深,32位深图片显示原理及对比
  8. 检查压缩包是否损坏_工业脉冲布袋除尘器安装前的检查工作
  9. 如何查看 Windows10 版本号
  10. 2021年最后一个月