考研系列-计算机组成原理第四章、指令系统
一、指令系统基本概念
1.1一些概念
(1)一条指令通常包括操作码字段和地址码字段两部分。
(2)指令字长取决于操作码长度、操作数地址码的长度和操作数地址的个数。通常,把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。
(3)因为主存一般是按照字节编址的,所以指令字长多为字节的整数倍。
(4)定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。
这里区别于指令格式:零地址、一地址、二地址…
上面这些指令格式可以使用定长的,也可以使用不定长的。所以相同的指令格式并不一定由相同的定长操作码。
1.2.按照操作类型分类的指令
1.3.扩展操作码指令格式
1.4.习题总结
1.4.1选择题
2.在CPU执行指令过程中,指令的地址由 程序计数器PC 给出
题目也就是问的当前执行的指令地址由什么给出。
指令的地址码字段保存的是操作数的地址
4.程序控制类指令的功能是:改变程序的执行顺序,并使程序具有测试、分析、判断和循环执行的能力。
5.下列指令中不属于程序控制指令的是:中断隐指令
程序控制类指令主要包括无条件转移、有条件转移、子程序调用和返回指令、循环执行等。中断隐指令是由硬件实现的,并不是指令系统中存在的指令,更不可能属于程序控制类指令。
6.下列指令中应用程序不准使用的指令是:特权指令
特权指令是指仅用于操作系统或其他系统软件的指令。为确保系统与数据安全起见,这类指令不提供给用户使用。
7.堆栈计算机中,有些堆栈零地址的运算类指令在指令格式中不给出操作数的地址,参加的两个操作数来自?
零地址的运算类指令又称堆栈运算指令,参与的两个操作数来自栈顶和次栈顶单元。
8.按照指令的操作数地址个数分为:零地址、一地址、二地址、三地址、四地址指令。
单字长指令是说的指令长度,这个要和上面的地址区分开,两者之间并没有什么联系。
指令长度可以分为:半字长、单字长、双字长指令(这里不是说的字节,一定要注意机器字长是多少!!!!!)
B.单地址指令可能会因为寻址方式的不同可能导致指令长度不同。
9.能够完成两个数的算术运算的单地址指令,地址码指明一个操作数,另一个操作数来自隐含寻址方式
单地址指令中只有一个地址码,在完成两个操作数的算术运算时,一个操作数由地址码指出,另一个操作数通常存放在累加寄存器(ACC)中,属于隐含寻址。
10.设机器字长为32位,一个容量为16MB的存储器,CPU按照半字寻址,其寻址单元数为:8M
这里注意,半字寻址是16位,而不是半个字节!!!
12.在指令格式中,采用扩展操作码设计方案的目的是:保持指令字长度不变而增加指令数量。
也就是扩展操作码并未改变指令长度,而是使操作码长度随地址码的减少而增加。
1.4.2简答题
定长编址指令部分是统一编址的,所以长度不变,用8位统一标识。
(2)与使用定长指令集编码相比,当采用边长指令集编码时,该程序能够占用多少存储空间?
注意不同类型的指令占比和位数。
2.扩展码技术中,注意要去掉一种编码(比如1111)用于一地址指令扩展,所以二地址指令最多可以有15种操作指令。
计算各指令数量的方法:
第三问中还存在着零地址指令占用一地址指令的情况!!!所以需要考虑零地址的条数。
3.在设计扩展操作码时,不需要刻意的统一前缀,直接按着编码顺序从前往后写就行,不需要考虑怎么进行匹配。
这个题目再注意一下!!!
这里注意寻址方式还要占位,注意指令设计中寄存器、存储器、寻址方式的位。
要看一下寻址方式:
立即、隐含、间接寻址、基址寻址
二、指令的寻址方式
寻址方式分为指令寻址和数据寻址两大类
2.1.指令寻址
寻找下一条要执行的指令地址
2.2.数据寻址
多种数据寻址方式
(1)直接寻址
(2)间接寻址
(3)寄存器寻址
(4)寄存器间接寻址
(5)隐含寻址
(6)立即寻址
右边的访存次数是排除了存储结果的
三种偏移寻址
(7)基址寻址
(8)变址寻址
(9)相对寻址
(10)堆栈寻址
2.3.习题总结
(一)、选择题
1.指令系统中采用不同的寻址方式的目的是:可缩短指令字长,扩大寻址空间,提高编程的灵活性。
提供扩展操作码的可能并降低指令译码难度。
可以通过转移指令来实现程序控制。
2.直接寻址的无条件转移指令的功能是将指令中的地址码送入程序计数器(PC)。
4.简化地址结构的基本方法是尽量采用隐地址(如零地址指令,无操作数)。
7.设指令中的地址码为A,变址寄存器为X,程序计数器位PC,则变址间址寻址方式的操作数的有效地址EA是:((X)+A)
这里一定要注意寻址方式是变址+间址寻址方式。
12.指令寻址方式有顺序和跳跃两种,采用跳跃寻址方式可以实现:程序的无条件转移和条件转移。
14.对按字寻址的机器程序计数器和指令寄存器的位数取决于:存储器的字数,指令字长。
这里注意:机器是按照字节编址的,每当CPU从存储器取出指令时,PC都会发生相应的变化。
在这个题目中,取指以后PC=PC+3
(1)则240转移到290,在取指令以后PC=243,相对位移量应该为47,对应补码的二进制表示为:0000 0000 0010 1111,用十六进制表示:00H 2FH,题目中采用低字节存放方式,则在指令中存放方式为:2FH 00H
(2)从240转移到200,取指后PC=243,相对位移量-43,补码的二进制表示:1111 1111 1101 0101,十六进制表示:FF D5,采用低字节存放方式,指令中存放方式为:D5H FFH
8位+4位+4位|16位
目的操作数采用基址寻址方式,采用通用寄存器R0作为基址寄存器,16位表示形式地址A
注意:题目中没有明确说采用专用的BR作为基址寄存器就默认使用通用寄存器R0当做基址寄存器!!在地址中要留给通用寄存器的位置。
形式地址用补码表示,表示范围为-215~215-1,选择A
(二)、简答题
获取操作数速度参考:
3.注意:寄存器寻址,读取寄存器获取的就是操作数,可不要和寄存器间接寻址搞混了,寄存器间接寻址是寄存器内存着操作数在内存中的地址。
注意:相对寻址时,一定要注意把取值后PC的变化也要算进去。
此题理解很重要,注意PC的变化,确定编址方式,因为指令字长为双字节,这里可以看出,如果是字编址,PC加1,如果是字节编址,PC+2
(2)用PC的范围加寄存器可表示的偏移范围、主存地址范围 综合考虑得到!!
(三)、关于不同寻址指令方式的优缺点
1.隐含寻址:优点是有利于缩短指令字长,缺点是需要增加存储操作数或隐含地址的硬件。
2.立即寻址:优点是指令在执行阶段不需要访问主存,指令执行时间短,缺点是A的位数限制了立即数的范围。
3.直接寻址的优点是简单,指令在执行阶段仅访问一次主存,不需要专门的计算操作数的地址,缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易改变。
4.间接寻址:
5.寄存器寻址:
6.寄存器间接寻址:
执行速度和直接寻址差不多
7.相对寻址:
8.基址寻址:
9.变址寻址:适合编制循环程序,和数组有关的程序
三、程序的机器级代码表示
3.1.常见的汇编指令
3.2.AT&T格式和Intel格式
3.3.选择语句的机器级表示
写汇编语言代码时,一般会以函数名作为“标号”,标注该函数指令的起始位置。
注意:jg和jle在判断方式上是互斥的;jge和jl在判断方式上是互斥的,可以结合记忆。
3.4.循环语句的机器级表示
3.5.函数调用的机器级表示
(1)call、ret指令
add函数执行完成后接着调用的IP值,回到调用函数的下一条指令
(2)如何访问栈帧内的数据
(3)如何切换栈帧
这里的enter过程中esp栈顶寄存器没有手动改过,都是通过push指令自增修改的。
在leave指令中,直接把ebp传值给esp,pop以后esp又指向了caller的栈顶部分
栈顶往低地址走,栈底元素在高位地址!!!
在一个栈帧内,ebp指向是不变的(其值为上一个栈帧的基址),esp始终指向栈帧的顶部
(4)如何传递参数和返回值
对于一个完整的栈帧(非当前函数):
栈帧的最底部一定是上一层栈帧基址
栈帧的最底部一定是返回地址
分析汇编语言的框架:
对于有些寄存器可能在调用程序中被使用,所以做以下补充,在调用之前先把需要保存的寄存器数据压栈保存,调用完成后弹出使用