• 约 4 分钟

计算机组成原理·指令系统

指令系统

指令的基本格式

  • 操作码和地址码
  • 指令长度
  • 按地址码数目不同分为
    • 零地址指令
      • 不需要操作数的指令
      • 隐含
    • 一地址指令
      • 原操作数和目的操作数一样的
      • 隐含目的操作数的
    • 二地址指令
      • 前一个操作数保存结果
    • 三地址指令
      • 第三个操作数保存结果
    • 四地址指令
      • 外加下一条指令地址(下址)

定长操作码指令格式

扩展操作码指令格式

指令的操作类型

  • 数据传送
  • 算术和逻辑运算
  • 移位操作
  • 转移操作
  • 输入输出操作

指令的寻址方式

指令寻址和数据寻址

  • 指令寻址
    • 顺序寻址
    • 跳跃寻址
  • 数据寻址

常见的数据寻址方式

  • 隐含寻址
  • 立即(数)寻址
  • 直接寻址
  • 间接寻址
  • 寄存器寻址
  • 寄存器间接寻址
  • 相对寻址
  • 基址寻址
  • 变址寻址
  • 堆栈寻址

指令执行过程

指令周期

  • 指令周期
    • 取指
      • 访存取指令
      • 对应CPU内标志触发器FE
    • 间址
      • 访存取有效地址
      • 对应IND
    • 执行
      • 访存取操作数
      • 对应EX
    • 中断
      • 访存保存断点对应INT
  • 机器周期
  • 时钟周期

指令周期的数据流

  • 取指周期
    • 任务
    • 数据流
      • PC->MAR->data bus->main mem
      • CU->control bus->main mem
      • main mem->data bus->MDR->IR
      • CU->PC
  • 间址周期
    • 任务
    • 数据流
  • 执行周期
  • 中断周期

指令执行方案

  • 单指令周期
  • 多指令周期
  • 流水线方案

程序的机器级代码表示

常用汇编指令介绍

  • 相关寄存器
    • EAX
      • AX
        • AH
        • AL
    • EBX
      • …
    • ECX
      • …
    • EDX
      • …
    • 除EBP和ESP之外的寄存器用途比较任意
  • 汇编指令格式
  • 常用指令
    • 数据传送指令
      • mov(不能内存到内存!)
      • push(栈中元素固定32位)
      • pop
    • 算术和逻辑运算指令
      • add/sub
      • inc/dec
      • imul
        • 两个操作数版
          • 结果放在第一个
        • 三个操作数版
          • 第二个和第三个相乘,结果放在第一个
        • 第一个操作数都必须是寄存器
      • idiv
        • 只有除数
        • 被除数为edx:eax(64位)
      • and/or/xor
        • 逐位
        • 结果放在第一个
      • not
      • neg
        • 取负
      • shl/shr
        • 逻辑移位
        • 操作数1表示目标数
        • 操作数2表示移动位数
    • 控制流指令
      • jmp <label>
      • jcontition
      • cmp/test
        • cmp 比较两个操作数,前者是否怎样怎样
        • test逐位相与
        • 都不保存结果,只置状态字
        • 与jcondition搭配使用
        • 举例
      • call/ret
        • call <label> 首先需要将下一条指令地址入栈
        • ret

过程调用的机器级表示

选择语句的机器级表示

循环语句的机器级表示

边界对齐、大小端存储

边界对齐

对于一个结构体内的元素,按元素自身大小的整数倍确定偏移量。例如,int大小为4B,则只能从0,4,8,⋯\cdots处开始存放一个元素。

对于结构体整体,需按照最大元素对齐。(事实上更为复杂)

大小端存储

大端存储,就是一个元素的各个字节按照从前往后的顺序存储。小端存储,就是一个元素的各个字节按照从后往前的顺序存储。例如,int型变量x=-192 (FFFFFFC0H),按照小端存储,示意图如下

小端存储示意图asadfsad

一道例题(2012)

答案 D(好像是)

cmp、test指令与jmp指令的一个简单例子

cmp eax, ebx
jle done #如果eax的值小于或等于ebx值,跳转到done,否则执行下一条指令
cmp dword ptr [var], 10 #将var指示的主存地址的4字节内容,与10比较
jne loop                #如果相等则继续顺序执行;否则跳转到loop
test eax, eax           #测试eax是否为零
jz xxxx                 #为零则跳转到xxxx
林威
林威 咖味十足的软件工程师