课程主页:https://courses.cs.washington.edu/courses/cse351/16sp/

课程资料:

实验部分:https://github.com/vuquangtrong/HW-SW_Interface_Course

实验说明:https://courses.cs.washington.edu/courses/cse351/13sp/lab-0.html

课件:http://academictorrents.com/details/b63a566df824b39740eb9754e4fe4c0140306f4b

课程视频:https://www.bilibili.com/video/BV1Zt411s7Gg?from=search&seid=8781593976070799647

这次回顾第三部分,这部分介绍了ISA。

第3节:架构基础,机器编程

什么是ISA(指令集体系结构)?

ISA(指令集体系结构)
  • ISA定义:
    • 系统状态(例如寄存器,内存,程序计数器)
    • CPU可执行的指令
    • 每个指令中对系统状态产生的影响
ISA的一般设计决策
  • 指令
    • 有哪些指令可用? 它们在做什么?
    • 它们如何编码?
  • 寄存器
    • 有多少个寄存器?
    • 它们有多宽?
  • 存储器
    • 如何指定存储器的位置?

C,汇编,机器码

基本定义
  • 体系结构:(也是指令集体系结构或ISA),编写汇编代码需要理解的处理器设计部分。
    • “软件直接可见的内容”
  • 微体系结构:体系结构的实现
汇编/机器代码视图

程序员可见状态

  • PC:程序计数器
    • 下一条指令的地址
    • 称为“RIP”(x86-64)
  • 内存
    • 字节数组
    • 代码和用户数据
    • 堆叠起来以支持程序
  • 寄存器
    • 大量使用的程序数据
  • 条件码
    • 存储有关最新算术或逻辑运算的状态信息
    • 用于条件分支
将C转换为目标代码
  • 文件中的代码p1.c,p2.c
  • 使用命令编译:gcc -Og pl.c p2.c -o p
    • 使用基本优化(-Og)
    • 二进制结果在文件p中

三种基本指令
  • 对寄存器或存储器数据执行算术功能
  • 在存储器和寄存器之间传输数据
    • 将数据从内存加载到寄存器
    • 将寄存器数据存储到内存中
  • 转移控制
    • 程序无条件跳转
    • 条件分支
汇编码特征:数据类型
  • 1、2、4或8个字节的“整数”数据
    • 数据值
    • 地址(无类型的指针)
  • 4、8或10个字节的浮点数据
  • 代码:字节序列编码的一系列指令
  • 没有例如数组或者结构之类的聚合类型的结构
    • 只是在内存中连续分配字节
目标代码

sumstore的目标代码:

0x0400595:
    0x53
    0x48
    0x89
    0xd3
    0xe8
    0xf2
    0xff
    0xff
    0xff
    0x48
    0x89
    0x03
    0x5b
    0xc3
  • 汇编器
    • 将.s转换成.o
    • 将每个指令转换为二进制编码
    • 几乎是可执行代码
    • 不同文件中的代码之间缺少链接
  • 连接器
    • 解决文件之间的引用
    • 与静态运行库结合
      • 例如,malloc,printf的代码
    • 一些库是动态链接的
      • 程序开始执行时发生连接
机器指令例子
  • C代码

    • ```c
      *dest = t;

      
        - 将t存储到dest的位置
      
      - 汇编码
      
        - ```
          movq %rax, (%rbx)
    • 将8字节的值移到内存中

    • 操作数:

      • t:寄存器%rax
      • dest:寄存器%rbx
      • *dest:内存M[%rbx]
  • 目标码

    • ```assembly
      0x40059e: 48 89 03
      
        - 3字节指令
      
        - 存储在地址0x40059e
      
      
      
      ##### 反汇编目标代码
      
      目标码很难阅读,可以利用反汇编器生成方便阅读的内容:
      
      ```assembly
      0000000000400595 <sumstore>:
          400595: 53 			    push %rbx
          400596: 48 89 d3		mov %rdx,%rbx
          400599: e8 f2 ff ff ff	callq 400590 <plus>
          40059e: 48 89 03 		mov %rax,(%rbx)
          4005a1: 5b 			    pop %rbx
          4005a2: c3 			    retq
  • 反汇编器

    • ```shell
      objdump –d sum
      
        - 检查目标代码的有用工具
      
        - 分析一系列指令的位模式
      
        - 产生近似的汇编代码
      
        - 可以在a.out(完整的可执行文件)或.o文件上运行
      
      - 那些文件可以被反汇编
      
        - 任何可以解释为可执行代码的文件
      
        - 反汇编程序检查字节并重建汇编源
      
        - 例如反汇编word
      
          ```assembly
          objdump -d WINWORD.EXE

还可以使用gdb工具来反汇编:

gdb p
disassemble sum
(disassemble function)
x/13b sum
(examine the 13 bytes starting at sum)

x86基础:寄存器

什么是寄存器
  • CPU中存储少量数据的位置,可以非常快速地(每个时钟周期一次)对其进行访问
  • 寄存器是汇编编程的核心
    • 它们是所有体系结构中的宝贵商品,尤其是x86
X86-64寄存器