指令集模型计算机,CSAPP 第四章 Y86-64指令集

7月

24

2019

简化的计算机模型和指令集

为了研究处理器的架构, CSAPP设计了一套简化的计算机模型和对应的指令集叫做Y86-64. 主要特点如下:

15个寄存器, 不包括%r15. 这样内部寻址可以用0-15来选择寄存器. %rsp依然用作栈指针

每个寄存器都报保存64位=8字节值, 机器里操作的所有值也都是8字节长

三个一位的条件码: ZF SF 和 OF

程序计数器 PC

有一个状态码 Stat 用于表示程序状态

DMEM 内存, 这里把内存当成一个连续的虚拟内存, 内存使用基址+偏移量方式寻找, 不支持复杂的寻址运算, 其实就相当于直接用固定基础地址寻址.

同时也对指令集进行了简化:

movq被分成了四个详细指令, 用于更好的跟踪程序. irmovq, rrmovq, mrmovq, rmmovq. 第一个字母表示源, 第二个字母表示目标. i = 立即数, r = 寄存器, m = 内存

运算指令有四个, addq, subq, andq, xorq, 只能对寄存器进行操作. 这些指令会同时设置条件码.

7个跳转指令, jmp, jle, jl, je, jne, jge, jg.

6个条件传送指令, cmovle, cmovl, cmove, cmovne, cmovge, cmovg. 这些指令与寄存器传送指令rrmovq一样, 只能在寄存器之间传送.

call 和 ret 与 原来的一样, 将地址入栈和出栈

pushq 和 popq 实现入栈和出栈

halt 停止指令执行, 状态码会设置成HLT

指令集的编码采用一字节长的指令, 对于有多个同类指令, 字节的低四位指示是哪个具体指令. 之后的第二字节高四位是第一个操作数寄存器, 第四位是第二个操作数寄存器, 如果没有, 就用0xF来表示, 之后根据指令不同, 可以跟8字节的操作数, 用来表示常数, 地址等:

halt 0000 0000, 这条是前边说的halt指令

nop 0001 0000, 这个是nop指令, 即什么也不做, 继续取下一条指令

rrmovq rA, rB 0010 0000 rA rB, 这是寄存器传送, 字节编码是20, rA和rB是寄存器地址, 比如从%rbx传送到%rax, 指令就是 20 03 01

irmovq V, rB 0011 0000 0xF rB V, 这条指令是将立即数传入指定寄存器, 很显然源寄存器没有, 用0xF表示, 立即数放在第三个字节开始的8个字节中, 这样这条指令长10个字节

rmmovq rA, D(rB) 0100 0000 rA rB D, 这条指令是将寄存器传入内存, 很显然要取地址, 地址会在最后加上8位的立即数D来表示

mrmovq rA, D(rB) 0101 0000 D(rA) rB D, 这条指令的数据结构和上边一条一样, 但是指令从40 变成了 50

OPq rA, rB 0110 ???? rA rB, 这个表示操作类的四条指令, 指令字节低位使用0-3表示四条不同的指令.

jxx Dest 0110 ???? Dest, 跳转类之类, 指令字节低位使用0-6表示7条不同的指令. 后边跟上8字节的地址

cmovxx rA rB 0010 ???? rA rB, 条件传送, 这里注意, ????是0-6共7个, 不是只有6个条件传送吗, 是因为 0010 0000 表示 rrmovq, 也就是不去判断标志位的无条件

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值