1、第5章,指令、指令系统和汇编 语言程序设计,本章主要内容,指令格式与指令系统概述寻址方式概述与应用举例汇编语言程序设计,计算机系统由硬件和软件两大部分组成。硬件指由中央处理器、存储器以及外围设备等组成的实际装置。软件是为了使用计算机而编写的各种系统的和用户的程序,程序由一个序列的计算机指令组成。指令是计算机运行的最小的功能单元,是指挥计算机硬件运行的命令,是由多个二进制位组成的位串,是计算机硬件可以直接识别和执行的一个信息体。一台计算机提供的全部指令构成该计算机的指令系统。指令用于程序设计人员告知计算机执行一个最基本运算、处理功能,多条指令可以组成一个程序,完成一项预期的任务。,1、指令概述、
2、功能和设计要求,具体一点说,可以把设计要求归纳为如下4 点: 完备性:指令齐全,编程方便 规整性:格式与运算规则统一 高效性:占内存少,运行省时 兼容性:同一系列机软件兼容,既要支持程序设计人员用它设计各种程序,越简单、方便越好,又要容易在计算机中用硬件实现这些指令的处理功能,越节省、高效越好,但这两个方面的要求经常是有矛盾的。,对设计指令系统的要求,确定指令系统的两种思路,从降低硬件系统构成的复杂度、提高指令执行速度和并行性考虑,确定指令系统的两种思路:,RISC Reduced Instruction Set Computer,CISC Complex Instruction Set Co
3、mputer,输入设备,输出设备,入出接口和总线,外存设备,主存储器,高速缓存,控 制 器,运 算 器,ADD SUB AND OR MVRR SHR RCL,OUT,STORE PUSH,JUMP JRC CALL RET,LOAD POP,IN,使用硬件系统用到的基本指令,指令格式,指令格式:操作码:指明本条指令的操作功能,每条指令有一个确定的操作码 操作数地址:说明操作数存放的地址,有时是操作数本身指令字:完整的一条指令的二进制表示 指令字长:指令字中二进制代码的位数 机器字长:计算机能直接处理的二进制数据的位数 指令字长(字节倍数)0.5、1、2个机器字长 定长指令字结构 vs. 变长
4、指令字结构,操作码组织与编码(1),定长操作码在指令字最高位部分分配固定若干位用于表示操作码,有利于简化计算机硬件设计,提高指令译码和识别速度。例如:IBM360机、 TEC-2000的16位机,指令操作码的位数限制指令系统中的指令条数!,操作码组织与编码(2),变长操作码在指令字最高位部分用一固定长度的字段来表示基本操作码,而对于部分操作数地址位数可以少的指令,则把另外多位辅助操作码扩充到该操作数地址字段,即操作码位数可变。这种方法在不增加指令字长的情况下,可表示更多的指令,但增加了译码和分析难度,要求更多的硬件支持。例如:PDP-11计算机、TEC-2000的 8位机,操作码组织与编码(3
5、),操作码字段与操作数地址字段有所交叉不同指令的操作码长度可以不同,表示操作码所用到的一些二进制位不再集中在指令字的最高位部分,而是与用于表示操作数地址的一些字段有所交叉,操作码还被区分为主操作码和辅助操作码这样不同的两部分,这是一种比较特殊、不很常用的方案。 例如:NOVA (DJS-130) 计算机就采用这种方案,指令操作数个数无操作数指令(零地址指令)单操作数指令(一地址指令)双操作数指令(二地址指令)三操作数指令(二地址指令)多操作数指令(多地址指令) 指令操作数来源和去向CPU内部的通用寄存器输入输出设备(接口)的一个寄存器 主存储器的一个存储单元,操作数个数与来源,假设某机器的指令
6、长度为16位,包括 4位基本操作码和三个 4位地址码段。15 12 118 7 4 30,4 位基本操作码可表示 16个状态, 如用 4 位操作码,则能表示 16 条三地址指令, 若用 8 位操作码,则可表示 256 条二地址指令, 而用12位操作码,则可表示 4096条一地址指令, 若16位全用作操作码,则可表示 65536条零地址指令,操作码的扩展技术,若需要在16位字长的指令中能够同时支持三地址、二地址、一地址指令各15条,零地址指令16条,则可以选用如下方案的变长操作码实现:,16条零地址指令的操作码的高 12位每位均用1, 低 4 位随意, 即: 111111111111000011
7、11111111111111,15条三地址指令的操作码为:0000 1110,15条二地址指令的操作码的高 4 位选用 1111, 低 4 位用 0000 1110, 即得到: 11110000 11111110,15条一地址指令的操作码的高 8位选用11111111, 低 4 位用 0000 1110, 即: 111111110000 111111111110,操作码的扩展技术,前面介绍的操作码扩展方案中,每次扩展4位并仅保留了一个编码用于接下来的扩展过程,当每次扩展的位数和保留的位数变化时,后面可扩展的指令条数就可以变化。例如在16位字中的指令字中,也可以选用如下方案支持三地址指令、二地址
8、指令、一地址指令和零地址指令14、30、31、16条:,16条零地址为:11111111111100001111111111111111,14条三地址为:0000 1101 (保留1110、1111 两个码),30条二地址为:11100000 11111101 (保留 2个码),31条一地址为:111111100000 111111111110 (保留 1个码),操作码的扩展技术,寻址方式(又称编址方式)指的是确定本条指令的数据地址及下一条要执行的指令地址的方法。需要在指令中为每一个操作数专设一个地址字段,用来表示数据的来源或去向的地址。在指令中给出的操作数(或指令)的地址被称为形式地址,使用
9、形式地址信息并按一定的规则计算出来的一个数值才是数据(或指令)的实际地址。在指令的操作数地址字段,可能要指出: 运算器中的累加器的编号或专用寄存器名称(编号) 输入/输出指令中用到的 I/O 设备的入出端口地址 内存储器的一个存储单元(或一 I/O设备 )的地址,寻址方式,所需的一个操作数在指令的地址字段部分直接给出。,Num 即为操作数的值,适用于操作数固定的情况,取指同时取得操作数,指令执行阶段不必到存储器中取操作数,提高了指令执行速度;当该立即数的值较小(占用位数少)时,可在指令字第一个字中直接给出,否则需要用指令的第二个字提供。,例:Num 1234H,指令的一个操作数就是 1234H
10、,指令的第2个字,(1) 立即数寻址,在指令的地址码字段,直接给出所需的操作数(或指令) 在存储器中的地址。,Addr 为操作数在存储器中的地址,或转移指令等用到的指令地址。,例:Addr = 5718H ,可能是下一条指令的地址或一个操作数的地址,若 5718H = 3,则用 5718H 作地址,从内存储器单元中读出的操作数就是 3。,(2) 直接寻址,指令地址码字段给出CPU中某一通用寄存器的编号(地址),且所需的操作数就在这一寄存器中,这就是寄存器寻址方式;若该寄存器中存放的是操作数在内存储器中所在单元的地址,这就是寄存器间接寻址方式。可通过指令的操作码或另设一个字段,来区分这两种不同的
11、寻址方式。,例:RegNo.=5,使用 5# 累加器,此时若 5# 累加器中的内容为 7,可记为 (R5)=7,,对寄存器寻址,操作数就是寄存器中的数值7,对寄存器间接寻址,从内存 7#单元读出来的数才是操作数,(3) 寄存器寻址、寄存器间接寻址,操作数的地址由指定的变址寄存器(由Reg指定)的内容和指令中的变址偏移量(Disp)相加得到。,例:Disp=18H,Reg=5,(R5)=5700H则操作数地址 = 5718H,变址寄存器内容变化,变址偏移量不变,便于读写数组中的元素,是计算机中常用的一种寻址方式。,(4) 变址寻址,指令的地址由程序计数器 PC 的内容(即当前执行指令的地址)和指
12、令的相对寻址偏移量相加得到。,例:Disp = 48H (PC) = 5600H则实际地址 = 5648H,(1)主要用于转移指令,对浮动程序很有用。 (2)偏移量可正可负,通常用补码表示。,PC,(5) 相对寻址,指令的地址码字段给出的内容既不是操作数,也不是操作数的地址,而是操作数(或指令)地址的地址,这被称为间接寻址方式,多一次读内存储器的操作。,存储器,操作数,Addr1,指令中的 Addr 可以用其他寻址方式给出,例如变址寻址,这就成为变址寻址与间接寻址的复合寻址方式,(6) 间接寻址,在计算机中设置一个专用的基址寄存器,操作数(或指令)的地址通过基址寄存器的内容和指令中的地址码相加
13、得到。,基址寄存器,加法器,存储器,操作数,例:Disp= 18H,BS= 5700H则操作数地址=5718H,主要用于为程序或数据分配存储区,对多道程序或浮动程序很有用,解决了程序在存储器中的定位和扩大寻址空间等问题。,(7) 基址寻址,堆栈:内存储器、后进先出 专用的寄存器 (称为堆栈指针 SP ) 给出堆栈的栈顶地址,读写通常总在栈顶进行,故不必在指令中给出堆栈地址,读写前后伴随自动修改SP,确保SP指向栈顶。 入栈: SP -1 SP 和 AR,即 SP 的内容减 1 存回 SP,并送入内存地址寄存器AR,接下来才可以把数据写到堆栈中,这是因为需要把数据写到新开辟出来的栈顶单元中。 出栈: SP AR,完成一次读堆栈操作后,还要执行一次 SP +1 SP 的操作,用于修改 SP 内容,这是因为数据读出后原来它的下一个相邻单元变成为栈顶。,(8) 堆栈寻址,PUSH A 前,PUSH A 后,POP A 前,POP A 后,堆栈寻址举例,