首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

体系结构-指令集结构(2)

体系结构-指令集结构(2)

现代编译技术与计算机体系结构设计
  • ISA设计需要了解的有挂compiler的问题
    • 如何分配变量
      • 高级语言分配数据的区域
        • stack
          • 用来分配局部变量;用来存储活动记录(call和return),工作堆栈指针访问其中的内容
        • global data area
          • 用来分配被静态说明的对象,如常亮和全局变量、其中数组和其他聚集类型的数据结构比例大。
        • heap
          • 分配动态对象,用指针访问,通常不是标量。全局变量和堆变量因为存在别名问题而无法分配寄存器
    • 如何寻址变量
    • 需要多少寄存器
    • 优化技术对指令使用频率的影响
    • 使用哪些控制结构
  • MIPS指令集结构
    • MIPS的寄存器
      • 32个64bit通用寄存器(GPRS)
        • r0,r1,...,r31
        • 整数寄存器
        • r0 = 0
      • 32个64bit浮点寄存器(FPRS)
        • f0,f1,...,f31
        • 用来存放32个单精度浮点数(32bit),也可以用来存放32个双精度浮点数(64bit)
        • 存放单精度数时,只用了FPR的一半;
      • 一些特殊寄存器
        • 可以与通用寄存器交换数据
        • 浮点状态寄存器保存浮点操作的结果
    • MIPS的数据表示
      • 整数
        • 字节8bit ;半字16bit;字32bit;双字64bit
        • 浮点数 单精度(32bit),双精度(64bit)
        • 字节、半字、字被装入64位寄存器时,零扩展或符号扩展。
    • 寻址方式
      • 立即数寻址和偏移量寻址,其立即数、偏移量字段都是16bit
      • 寄存器间接寻址是通过把0作为偏移量来实现的
      • 16bit绝对寻址是通过把R0作为基址寄存器来实现
      • mips的存储器按字节寻址,地址为64bit
      • 所有的存储器访问都是边界对齐
    • 指令格式
      • 寻址方式编码到操作码中
      • 所有指令都是32bit
      • 操作码占6bit
      • 3中指令格式
        • I类指令
          • ,立即数字段为16bit,用于提供立即数和偏移量
          • load指令访存有效地址:Regs[rs]+immediate
            从存储器取来的数据放入寄存器rt中
            store指令访存有效地址:Regs[rs]+immediate从存储器取来的数据放入寄存器rt中
            立即数指令Regs[rt]<---Regs[rs] op immediate
            分支指令目标转移地址:Regs[rs]+immediatert无用
            寄存器跳转、寄存器跳转并连接转移目标地址为Regs[rs]
        • R类指令
          • 包括ALU指令,专用寄存器读/写指令,move指令
          • ALU指令     Regs[rd]<---Regs[rs] func Regs[rt],func为具体的运算操作编码
        • J类指令
          • 包括跳转指令、跳转并连接指令、自陷指令、异常返回指令;
          • 指令字的低26位是偏移量,左移两位,与pc值相加,形成跳转的地址。
    • 指令的分类(load/store,ALU操作,分支与跳转,浮点操作)
      • 符号的意义
        • x<---ny:从y传送n位到x
        • x,y<---z:把z传送到x和y
        • 下标:表示字段中具体的位;对于指令和数字,按从最高位到最低位(左--》右)顺序依次编号,最高位为第0位,次高位为第1位。
          • 下表可以是数字或者一个范围;Regs[R4]0,即R4的符号位;Regs[R4]56...63的最低位
        • Mem:表示主存,按字节寻址
        • 上标:用于表示对字段进行复制的次数;032一个32位全0的字段
        • 符号##,用于连个字段的拼接,并且可以出现在数据传送的任何一边。eg,R8、R10为64位的寄存器,则Regs[R8]32..63<---32(Mem[Regs[R6]]0)24##Mem[Regs[R6]];表示的是,以R6的内容作为地址访问内存,得到的字节按符号位扩展的32位后存入R8的低32位,R8的高32位(即Regs[R8]0..31)不变。
      • LD R2,20(R3)装入双字Regs[R2]<---64(Mem[20+Regs[R3]])
        LW R2,40(R3)装入字Regs[R2]<---64(Mem[40+Regs[R3]]0)32 ## Mem[40+Regs[R3]]
        LB R2,30(R3)装入字节Regs[R2]<---64(Mem[30+Regs[R3]]0)56 ## Mem[40+Regs[R3]]
        LBU R2,40(R3)装入无符号字节Regs[R2]<---64056 ## Mem[40+Regs[R3]]
        LH R2,30(R3)装入半字Regs[R2]<---64(Mem[30+Regs[R3]]0)48 ## Mem[30+Regs[R3]]##Mem[31+Regs[R3]]
        L.S F2,60(R4)装入半字Regs[F2]<---64Mem[60+Regs[R4]] ## 032
        L.D F2,40(R3)装入双精度浮点数Regs[F2]<---64Mem[40+Regs[R3]]
        SD R4,300(R5)保存双字Mem[300+Regs[R5]]<---64Regs[R4]
        SW R4,300(R5)保存字Mem[300+Regs[R5]]<---32Regs[R4]
        S.S F2,40(R2)保存单精度浮点数Mem[40+Regs[R2]]<---32Regs[F2]0..31
        SH R5,502(R4)保存半字Mem[502+Regs[R4]]<---16Regs[R5]48..63
      • ALU指令
      • DADDU R1,R2,R3无符号加
        DADDIU R4,R5,R6加无符号立即数
        LUI R1,#4把一个立即数装入到一个字的高16位Regs[R1]<---032 ## 4 ## 016
        DSLL R1,R2,#5逻辑左移Regs[R1]<---Regs[R2]<<5
        DSLT R1,R2,R3置小于if(Regs[R2]<Regs[R3]) then Regs[R1]<---1 else Regs[R1]<---0
      • 控制类指令
      • J name跳转PC36..63<---  name<<2
        JAL name跳转并连接Regs[R31]<-- PC+4C36..63<---name<<2;((PC+4)-227)<=neme<((PC+4)+227)
        JALR R3寄存器跳转并连接Regs[R31]<--- PC+4C<--Regs[R3]
        JR R5寄存器跳转PC<-- Regs[R5]
        BEQZ R4,name等于零时分支if(Regs[R4]==0) then PC<-- name;((PC+4)-217)<=name<((PC+4)+217)
        BNE R3,R4,name不相等时分支((PC+4)-217)<= name < ((PC+4)+217)
        MOVZ R1,R2,R3等于零时移动if(Regs[R3]==0) then Regs[R1]<--Regs[R2]
      • 跳转指令(根据目标指令确定目标指令的方式不同以及是否跳转时连接,可以将跳转指令分为4类)
        • 目标地址的确定方式:把指令中的26位偏移量左移2位后,替换pc中的低28位;由指令中指定的一个寄存器来给出目标转移地址
        • 跳转的两种类型:简单跳转(把目标地址送入程序计数器);跳转并连接,将目标指令送入程序计数器,把返回地址(下一条)放入寄存器R31
      • 分支指令(跳转转移)
        • 分支指令指令的目标地址,由16位带符号偏移量左移两位后和pc相加决定。
        • 浮点条件分支指令:通过测试浮点状态寄存器来决定是否进行分支。
继承事业,薪火相传
返回列表