第一节 指令格式
指令概念:又称机器指令,是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
一条指令就是机器语言的一个语句,一条指令通常要包括操作码和地址码两部分:操作码主要指明用户干什么,地址码主要指明对谁操作。
一、指令分类
按操作数个数分:
Ⅰ、零地址指令:不需要操作数,如空操作、停机、关中断等指令
Ⅱ、一地址指令:只需要单个操作数,如自增,自减,取反,求补,需要两个操作数,但其中一个隐含在某个寄存器中
Ⅲ、二地址指令:常用于两个操作数的算术运算、逻辑运算相关指令。
完成一条指令需要访存四次,分别为取值,读第一个操作数,读第二个操作数,写回第一个操作数。
Ⅳ、三地址指令:常用于两个操作数的计算,结果放在第三个地址中。
完成一条指令需要访存四次,分别为取值,读读一个操作数,读第二个操作数,写到第三个操作数。
※若指令长度不变,地址码数量越多,寻址能力就越差
按指令长度是机器指令的多少倍分:
Ⅰ、半长指令:是机器指令长度一半
Ⅱ、单字长指令:与机器指令长度一样
Ⅲ、双字长指令:是机器指令长度两倍
二、扩展操作码指令格式(考点:会设计指令系统)
概念:指令是定长的,但是操作码的长度可变。
通常情况下,使用频率高的指令使用短的操作码,减少指令译码和分析的时间。而使用频率低的指令使用长的操作码
定长指令和扩展操作码的比较
定长操作码 | 扩展操作码 | |
---|---|---|
优点 | 硬件设计简单,识别速度快 | 在指令长度限制下仍有丰富指令 |
缺点 | 指令难以增加,不灵活 | 增加指令译码和分析难度,速度慢 |
【2017统考真题】某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令29条、二地址指令107条,每个地址字段为6位,则指令字长至少应该是()。
解答:三地址29条需要的位数是5位,多出3位,而107条需要6位。故总共5+6+12=23,因为按照字节编址,所以最少需要24位。
第二节 寻址方式(重点)
一、指令寻址(由PC指出)
Ⅰ、顺序寻址
PC+”1“,这里的1指指令字长,每次取值结束后PC会+1
Ⅱ、跳跃寻址
执行转移类指令导致的PC值改变
二、数据寻址(由本条指令的地址码指明真实地址)
非偏移指令
寻址方式 | 有效地址 | 优点 | 缺点 | 访存次数(指令执行期间) |
---|---|---|---|---|
直接寻址 | 操作数的真实地址 | 简单 | 限制寻址范围 | 1 |
间接寻址 | 操作数地址的地址 | 可扩大寻址范围 | 指令在执行阶段要多次访存 | 最少2次 |
寄存器寻址 | 寄存器的地址 | 不访问主存,速度快 | 寄存器昂贵 | 0 |
寄存器间接寻址 | 寄存器地址,内部是操作数主存地址 | 与一般的间址快 | 但执行仍然会访存 | 1 |
隐含寻址 | 指令中隐含操作数地址 | 有利于缩短指令字长 | 需要增加存储操作数的硬件 | 0 |
立即寻址 | 就是操作数本身 | 最快 | 限制操作数范围 | 0 |
偏移寻址(重中之重)
指令执行过程中,都会在将运算结果放入主存中,涉及一次访存。
Ⅰ、基址寻址
将CPU中基址寄存器(BR)/通用寄存器的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A
※采用通用寄存器作为基址寄存器 �0 的位数,根据通用寄存器的总数判断,程序运行前,CPU将BR的值修改为该程序的起始地址。
- 基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。用户无法修改,在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
- 当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
- 优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
Ⅱ、变址寻址
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器 。
- 变址寄存器是面向用户的,在执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)。刚好与基址寻址相反。
- 在针对数组处理过程中,不断改变IX的值,便很容易形成数组中任一数据的地址,特别适合编制循环程序。
- 基址变址复合执行。EA=(IX)+(BR)+A。
Ⅲ、相对寻址
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示 。
- 优点:这段代码在程序内浮动时不用更改跳转指令的地址码
- 相对寻址广泛应用于转移指令
- 注意:对于JMP A转移指令,当从CPU中取出一字节时,会自动执行PC+1。若指令的地址为X,且占2B,在取出该指令后,会自定跳转到X+2+A。
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针作为操作数地址。
- 硬堆栈是将寄存器作为栈,成本很高;软堆栈是将主存作为栈,成本低。
- 硬堆栈不访存,软堆栈访存一次
第三节 高级语言程序与机器级代码之间的对应
一、基本概念
- 对操作数的操作地址只涉及三种:寄存器到寄存器,主存到寄存器,立即数到寄存器。
- dword 32bit ;word 16bit ;byte 8bit
- 通用寄存器 eax ebx ecx edx 变址寄存器 esi edi 堆栈寄存器 ebp esp。
二、选择结构语句的机器级表示
je | jump when equal, |
---|---|
jne | jump when not equal, |
jg | jump when greater, |
jge | jump when greater or equal |
jl | jump when less |
jle | jump when less or equal |
例如
cmp eax ,ebx #比较寄存器eax和ebx里的值 jg NEXT #若eax>ebx,则跳转到NEXT
三、循环结构语句的机器级表示
用条件指令实现循环
用loop指令实现循环
就是将”某些处理“封装到了Looptop内,使得代码更加简洁。
四、CISC和RISC
对比项目 | CISC | RISC |
---|---|---|
指令系统 | 复杂,庞大 | 简单,精简 |
指令数目 | 一般大于200条 | 一般小于100条 |
指令字长 | 不固定 | 定长 |
可访存指令 | 没有限制 | 只有Load/Store指令 |
各种指令执行时间 | 相差较大 | 绝大多数在一个周期内完成 |
各指令使用频率 | 有的常用,有点不常用 | 一般都常用 |
通用寄存器的数量 | 较少 | 多 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |