1.机器级代码

系列文章目录

程序的机器级表示:
CSAPP第三章的目录

  1. 历史观点
  2. 程序编码
  3. 数据格式
  4. 访问信息
  5. 算数和逻辑操作
  6. 控制
  7. 过程
  8. 数组分配和访问
  9. 异质的数据结构
  10. 在机器级程序中奖控制与数据结合起来
  11. 浮点代码

九曲阑干的课程目录:

  1. 机器级代码(至书的3.4.1)
  2. 数据传送指令
  3. 条件码寄存器
  4. 跳转指令以及bomblab_ev
  5. 过程
  6. 多维数组与结构体
  7. 缓冲区溢出


参考

这里将参考列出来:

  1. CSAPP重点解读
  2. 九曲阑干
  3. 2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频

这一章和上一章有所不同,上一章主要是一些数学公式,概念理解记忆。而这一章的实操性要求极高也是课程的核心部分。也对应了bomb lab。我决定这一章的笔记的主体还是按照九曲阑干的来,加以辅助重点解读,如果二者有些许不同则以CMU的课程为准


一、导读

在这里插入图片描述基本概念:

  • Instructure Set Architecture: 指令集架构 (包括指令规格,寄存器等),简称ISA,它是软硬件之间的“合同”

  • Mircoarchitecture: 指令集架构的具体实现方式 (比如流水线级数,缓存大小等),它是可变的

  • Machine Code: 机器码,也就是机器可以直接执行的二进制指令

  • Assembly Code: 汇编码,也就是机器码的文本形式 (主要是给人类阅读)

在这里插入图片描述
编译过程:
在这里插入图片描述

重要思想: 程序就是一系列(被编码了的)字节序列 (看上去和数据一模一样),这就是所谓的冯诺依曼结构计算机,即程序存储型计算机

二、寄存器

2.1 理解寄存器

理解机器码就必须理解寄存器!!!

在这里插入图片描述在这里插入图片描述
总共有16个整数寄存器
在这里插入图片描述

对于机器级编程来说,其中有两个抽象尤为重要:

  1. ISA来定义机器级程序的格式和行为
  2. 机器级程序使用的内存地址是虚拟内存地址,提供了一个看上去是一个非常大的字节数组。

在这里插入图片描述在这里插入图片描述

在本书中用得是ATT(AT&T)的汇编代码格式,区别于Intel的汇编代码格式。这里做一个说明:
在这里插入图片描述

寄存器大小在历史上的演化,逐渐由16位走向到了64位;寄存器的数量也由原来的8个增加到了16个:

在这里插入图片描述

2.2 不同寄存器所扮演的角色

在这里插入图片描述

有一组标准的编程规范控制着如何使用寄存器来管理栈、传递函数参数、从函数的返回值、以及存储局部和临时数据。

这里先解释一下什么是调用者(caller)和被调用者(callee):
在这里插入图片描述
再来解释一下调用者保存和被调用者保存

  1. 调用者保存
    在这里插入图片描述

  2. 被调用者保存
    在这里插入图片描述

这里其实在程序中经常见到的是这样的汇编语句:
push %rbx这里就是将这里面的值压入栈中,作一个临时性的保存,不能将原来的值破坏。等要用到的时候再把它拿出来pop %rbx

三、数据格式

这里先明确一个概念值的大小,所占寄存器中的位数:

在这里插入图片描述

字节:byte,8位;字:word,16位;双字:double words,32位;四字:quad words,64位。
对应的指令后缀:movb, movw, movl, movq。
这里说的都是整数,浮点数使用一组完全不同的指令和寄存器。

四、操作数指示符(Operand Specifiers)

在这里插入图片描述指令的操作数有三种类型:立即数,寄存器,内存引用

  1. 立即数(immediate),用来表示常数值,例如$-577
  2. 寄存器,表示某个寄存器的内容,16个寄存器的低位1字节,2字节,4字节或8字节中的一个作为操作数。
  3. 内存引用,它会根据计算出来的地址(通常称为有效地址)访问某个内存位置

在这里插入图片描述

4.1 不同类型操作数的格式

上面图展示了各种不同类型操作数的格式,操作数可以直接表示立即数(即具体数值)、寄存器值或者内存地址中的值。下面是每种操作数格式的详细解释:

  1. 立即数 (Immediate)

    • 格式: $Imm
    • 含义: 这表示立即数(即常数值)本身。例如,$0x108 表示数字 0x108
  2. 寄存器 (Register)

    • 格式: r_a
    • 含义: 直接使用寄存器中的值。例如,%rax 用来访问寄存器 rax 中存储的值。
  3. 绝对内存地址 (Absolute)

    • 格式: Imm
    • 含义: 访问内存中给定绝对地址的内容。例如,0x104 指的是内存地址 0x104 中的内容。
  4. 间接寻址 (Indirect)

    • 格式: (r_a)
    • 含义: 使用寄存器 r_a 中的值作为地址,访问该地址处的内存内容。例如,(%rax) 表示访问 %rax 寄存器中存储的地址对应的内存内容。
  5. 基址加偏移 (Base + Displacement)

    • 格式: Imm(r_b)
    • 含义: 使用 r_b 寄存器的值加上一个立即数偏移量作为地址,访问内存中该地址的内容。例如,4(%rax) 访问从 %rax 中存储的地址开始,向上偏移4个单位的内存地址的内容。
  6. 索引寻址 (Indexed)

    • 格式: (r_b, r_i)
    • 含义: 使用基址寄存器 r_b 和索引寄存器 r_i 的值的和作为地址,访问内存中该地址的内容。例如,(%rax, %rdx) 使用 %rax%rdx 寄存器中的值的和作为地址。
  7. 比例索引寻址 (Scaled Indexed)

    • 格式: (, r_i, s)
    • 含义: 使用索引寄存器 r_i 的值乘以一个比例因子 s(可以是1、2、4或8)作为地址。例如,(, %rdx, 4) 使用 %rdx 寄存器的值乘以4作为地址。
  8. 比例基址加索引 (Scaled Indexed with Base)

    • 格式: Imm(r_b, r_i, s)
    • 含义: 使用基址 r_b、索引 r_i 和比例因子 s 的组合作为地址。例如,260(%rcx, %rdx) 使用 %rcx 加上 %rdx 乘以260作为地址。

通过这些不同的寻址方式,可以灵活地在程序中指定和访问内存或寄存器的数据。

4.2 练习题

说实话,我刚学这个有点懵逼,还是来看一道练习题吧:
在这里插入图片描述
最终填表如下:
在这里插入图片描述在这里插入图片描述
弄懂这幅图就行了,本质上就是去内存地址取数,告诉我内存地址在哪就行(寻址公式):
在这里插入图片描述为什么s要求1,2,4,8,因为在数组中去寻址,那几种数据类型的大小都是1,2,4,8。


总结

这章主要简单介绍了:

  1. 指令集和虚拟内存的概念
  2. 寄存器:
    • 历史演化,由此就会联想到数据格式(size of data type: b, w, l, q)体现在操作的后缀上
      在这里插入图片描述
    • 每个通用寄存器的作用,包括调用者和被调用者保存,等等
  3. 操作数:1. 立即数;2.寄存器;3.内存引用
  4. 掌握好寻址公式
  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值