首页 > 编程知识 正文

指令集架构的作用,指令集 汇编语言

时间:2023-05-03 08:03:42 阅读:215366 作者:3192



转载自 http://www.cnblogs.com/li-daphne/p/4067241.html


一个完整的指令集结构包括

Instuction Fetch Instuction DecodeOperand FetchExcuteResult StoreNext Instruction

 我们必须解决的问题包括:

指令的编码方式(即如何编码)操作数和操作结构的存放位置 存放位置多少个现实操作数存储器操作数如何定位那些操作数可以或不可以放到存储器中 数据的类型和大小支持哪些操作下一条指令的地址 jumps,conditions,branchesfetch-decode-execute is implicit 有关ISA的若干问题 分类 stack  0 addressADDtos<---tos+nextAccumulator1 addressADD A acc<---acc+mem[A]1+x addressADDX Aacc<---acc+mem[A+x]Register-memory2 addressADD A BEA[A]<---EA[A]3 addressadd A B CEA[A]<---EA[B]+EA[C]Load-Store3 addressadd  A B CA<---B+Cload A BA<---mem[B] 通用寄存器型(R-M   R-R)占主导地位 寄存器比存储器更快对便一起来说寄存器更容易使用 尾端问题 little endian,big endian,在一个字内部的字节顺序问题,例如在地址xxx00指定了一个字(int),存储器中从xxx00连续存放ffff0000,有两种表示方式: 小端方式:xxx00位置是字的最低字节,数值为0000ffff。x86,dec vax,windows NT大端方式:xxx00位置是字的最高字节,数值为ffff0000。IBM 360/370,Motorola,MIPS 对齐问题 对一个s字节的对象访问,地址为A,如果A mod s ==0,则是边界对齐这是由于存储器本身的读写要求的。没有对其的对象可能会导致存储器两次读写。  基准测试结果: 偏移寻址、立即数寻址、寄存器寻址方式,其使用频度为75%~99%偏移字段大小为12~16bits,可满足75%~99%的需求立即数字段大小为8~16bits,可满足50%~80%的需求

 

操作数类型和操作数表示

类型:是面向应用、面向软件系统处理的各种操作数据类型。整型、浮点型、字符、字符串、向量类型;类型由操作码确定。

表示:操作数在机器中的表示,硬件结构能够识别,指令系统可以直接使用的表示格式。整型(原码、补码、反码),浮点(IEE 754标准),十进制(BCD码,二进制十进制表示)

ISA研究的问题 ISA的分类操作数部分 理解存储器地址(尾端+对齐问题)寻址方式操作数的类型、表示和大小问题 操作码部分 支持哪些类型的操作 指令格式 研究的方法:基于统计的方法结论: 常用的寻址方式:立即数、偏移寻址、寄存器寻址偏移字段的大小:12~16bits立即数字段的大小8~16bits操作数大小:单字、双字的数据访问频率高;64字长更具一般性 ISA的功能设计 任务:确定硬件支持哪些操作方法:统计类型:CICS和RISC 控制类指令 条件分支最常见寻址方式:pc-relative和偏移地址至少8位;即动态的转移地址方式 CISC 强化指令功能,减少程序中指令条数

RISC计算机指令集结构的功能设计

特点: 大多数指令在单周期内完成采用load、store结构硬布线控制逻辑减少指令和寻址方式种类固定的指令格式注重代码的优化面向寄存器结构重视流水线的执行效率--》尽量减少断流重视优化编译技术 RISC为了使流水线高效执行 简单而统一的指令译码大部分指令可以单周期完成只有load/store指令访存简单寻址技术采用load延迟技术 为了便于优化编译产生优化代码 三地址指令格式较多适量的寄存器对称的指令格式 RISC的关键技术 延迟转移技术指令取消技术重叠寄存器窗口技术 处理器中设置多个寄存器堆,并划分多个窗口每个过程使用其中相邻的三个窗口和一个公共的窗口一个与前一个过程公用;一个与下一个过程公用;一个作为局部寄存器 指令调整技术硬件为主,固件为辅 频率较高的指令:load,store,add,subtract,move register-register,and,shift,compare equal,compare not equal,branch,jump,call,return控制类指令:conditional branch,jump,procedure calls,procedure returns控制类指令的寻址方式:pc-relative 编译时不知道转移地址,程序执行时动态确定转移地址放到某一寄存器中

 

指令编码方式 长度可变长度固定混合 MIPS寻址方式/指令格式(所有指令都是32bit) 寄存器直接寻址 立即数寻址 基址寻址 pc相对寻址 寄存器间接寻址

 

现代编译技术与计算机体系结构设计

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操作码占6bit3中指令格式 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]] ## 032L.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..31SH 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 ## 016DSLL R1,R2,#5逻辑左移Regs[R1]<---Regs[R2]<<5DSLT R1,R2,R3置小于

if(Regs[R2]<Regs[R3]) then Regs[R1]<---1 else Regs[R1]<---0

控制类指令 J name跳转PC36..63<---  name<<2JAL name跳转并连接Regs[R31]<-- PC+4;PC36..63<---name<<2;((PC+4)-227)<=neme<((PC+4)+227)JALR R3寄存器跳转并连接Regs[R31]<--- PC+4;PC<--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相加决定。浮点条件分支指令:通过测试浮点状态寄存器来决定是否进行分支。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。