计算机原理及系统结构 第十八讲 主讲教师:赵宏伟 学时:64
第5章 指令、指令系统和汇编 语言程序设计
本章主要内容 指令格式与寻址方式概述 汇编语言程序设计
指令与指令系统概述 计算机系统由硬件和软件两部分组成。硬件指由中央处理机、存储器以及外部设备等组成的实际装置。软件是为便于用户使用计算机而编写的各种程序,是由一系列机器指令组成的。 指令是用户使用计算机和计算机运行的最小的功能单位,一台计算机支持(或称使用)的全部指令构成该计算机的指令系统,它对计算机本身的硬件结构的复杂程度和运行性能,对用户完成程序设计的难易程度和工作效率,有非常重要的影响,必须对设计指令系统的工作给以足够的重视,慎重确定。 P127
当前的计算机指令系统,从其构成的复杂和完备程度,或者说设计中追求的不同的目标区分,可分为 CISC 和RISC 两类: 完备性: 指令齐全,编程方便 高效性:占内存少,运行省时 规整性:指令与运算规则统一 兼容性:新旧机指令软件兼容 对指令系统的要求 当前的计算机指令系统,从其构成的复杂和完备程度,或者说设计中追求的不同的目标区分,可分为 CISC 和RISC 两类: RISC(Reduced Instruction Set Computer),通常称为精简指令系统的计算机,提供数目较少、格式与功能简单、运行高效的指令,追求的是计算机控制器实现简单,运行高速,更容易在单块超大规模集成电路的芯片内制做出来。 CISC (Complex Instruction Set Computer),通常称为复杂指令系统的计算机,是相对于 RISC 一词而提出来的一种说法。其特点是:指令条数多,格式多样,寻址方式复杂,每条指令的功能强,优点是汇编程序设计容易些,但计算机控制器的实现困难多,很多指令被使用的机会并不多。 P127
指令格式与寻址方式 1. 指令与指令格式 2. 寻址方式 寄存器寻址 外设寻址 间接寻址 立即数寻址 直接寻址 基地址寻址 变址寻址 指令 : 功能 定义 用法 指令格式: 操作码 操作数地址 无地址 一地址 二地址 多地址 固定长度 可变长度 交叉安排 2. 寻址方式 寄存器寻址 入 / 出端口地址方式 外设寻址 统一映象方式 间接寻址 立即数寻址 直接寻址 基地址寻址 变址寻址 相对寻址 主存寻址 堆栈寻址 寄存器间址 P128
计算机原理及系统结构 第十九讲 主讲教师:赵宏伟 学时:64
寻址方式 寻址方式(又称编址方式)指的是确定本条指令的数据地址及下一条要执行的指令地址的方法。 不同的计算机系统,使用数目和功能不同的寻址方式,其实现的复杂程度和运行性能各不相同。有的计算机寻址方式较少,而有些计算机采用多种寻址方式。通常需要在指令中为每一个操作数专设一个地址字段,用来表示数据的来源或去向的地址。在指令中给出的操作数(或指令)的地址被称为形式地址,使用形式地址信息并按一定的规则计算出来的一个数值才是数据(或指令)的实际地址。在指令的操作数地址字段,可能要指出: ① 运算器中的累加器的编号或专用寄存器名称(编号) ② 输入/输出指令中用到的 I/O 设备的入出端口地址 ③ 内存储器的一个存储单元(或一 I/O设备 )的地址 有多种 基本寻址方式 和某些 符合寻址方式 ,简介如下:
所需的一个操作数在指令的地址字段部分直接给出。 1、立即数寻址 所需的一个操作数在指令的地址字段部分直接给出。 则 Num 即为操作数的值。 适用于操作数固定的情况,提高了指令的执行速度, 当该立即数的值限定为较小值(占用位数少)时,可在第一个指令字中直接给出,否则可在第二个指令字中给出。 P132
在指令的地址码字段直接给出所需的操作数(或指令) 在存储器中的地址。 2、直接寻址 在指令的地址码字段直接给出所需的操作数(或指令) 在存储器中的地址。 内存储器 操作数 则 Addr 为操作数在存储器中的地址。 或转移指令等用到的指令地址。 例:Addr = 5718H ,这里的 H 表示 5718 是 16 进制的值, 可能用作下一条指令的地址; 也可能用作操作数的地址,若 [ 5718H ]= 3,即内存储器 5718 单元中的内容为 3, 则操作数就是这里的 3 。 P132
对寄存器间接寻址,从内存 7# 单元读出来的数才是操作数 3、寄存器寻址、寄存器间接寻址 计算机的CPU中一般设置有一定数量的通用寄存器,用于存放操作数、操作数地址或中间结果。假如指令地址码字段给出某一通用寄存器的编号(地址),且所需的操作数就在这一寄存器中,这就是寄存器寻址方式;若该寄存器中存放的是操作数在内存储器中所在单元的地址,这就是寄存器间接寻址方式。可通过指令的操作码或另设一个字段,来区分这两种不同的寻址方式。 例:RegNo.=5, 使用 5# 累加器 , 此时 5# 累加器中的内容为 7, 可记为 (R5)=7, 对寄存器寻址方式,操作数就是这里的数值 7 对寄存器间接寻址,从内存 7# 单元读出来的数才是操作数 P133
操作数的地址由指定的变址寄存器(由Reg指定)的内容和指令中的地址码(Disp)相加得到。 4、变址寻址 操作数的地址由指定的变址寄存器(由Reg指定)的内容和指令中的地址码(Disp)相加得到。 存储器 通用寄存器 加法器 例:Disp=18H,Reg=5,(R5)=5700H 则操作数地址 = 5718H 操作数 便于对数组元素进行处理, 是计算机中常用的一种寻址方式。 P133
操作数(或指令)的地址由程序计数器 PC 的内容(即当前执行指令的地址)和指令的地址码相加得到。 5、相对寻址 操作数(或指令)的地址由程序计数器 PC 的内容(即当前执行指令的地址)和指令的地址码相加得到。 例:Disp = 48H (PC) = 5600H 则实际地址 = 5648H 1).主要用于转移指令,对浮动程序很有用。 2).位移量可正可负,通常用补码表示。 P133
在计算机中设置一个专用的基址寄存器,操作数(或指令)的地址通过基址寄存器的内容和指令中的地址码相加得到。 6、基址寻址 在计算机中设置一个专用的基址寄存器,操作数(或指令)的地址通过基址寄存器的内容和指令中的地址码相加得到。 存储器 基址寄存器 加法器 例:Disp= 18H,[BS]= 5700H 则操作数地址=5718H 操作数 主要用于为程序或数据分配存储区,对多道程序或浮动程序很有用,解决了程序在存储器中的定位和扩大寻址空间等问题。 P134
指令的地址码字段给出的内容既不是操作数,也不是操作数的地址,而是操作数(或指令)地址的地址,这被称为间接寻址方式,多一次读内存储器的操作。 7、间接寻址 指令的地址码字段给出的内容既不是操作数,也不是操作数的地址,而是操作数(或指令)地址的地址,这被称为间接寻址方式,多一次读内存储器的操作。 Addr1 指令中的 Addr 可以用其他寻址方式给出,例如变址寻址,这就成为变址寻址与间接寻址的复合寻址方式。 存储器 操作数 P134
需要注意的是,指令长度可能是一个字,也可能是两个字或多个字,要看操作数地址字段的位数要求,由具体的情况决定。 8、堆栈寻址 堆栈是内存储器中一块按 “后进先出” 原则进行读写的存储区,并通过一个专用的寄存器(称为堆栈指针SP)给出堆栈的栈顶(和次栈顶)地址完成数据的读写操作,故不必在指令中用操作数地址字段给堆栈地址。通常在读写操作的前后伴随有计算机自动(不是用户通过指令)修改 SP 内容的动作,以确保按正确的 “后进先出” 原则读写堆栈区。 例如:(SP)- 1 SP和 AR,即SP的内容减 1 存回 SP,并送内存地址寄存器,接下来才可以把数据写到堆栈中。完成一次读堆栈操作后,要接着执行(SP)+ 1 SP 的一次自动修改 SP 内容的操作。 需要注意的是,指令长度可能是一个字,也可能是两个字或多个字,要看操作数地址字段的位数要求,由具体的情况决定。 P134
计算机原理及系统结构 第二十讲 主讲教师:赵宏伟 学时:64
教学机基本指令 数据移动指令 算术逻辑指令 控制转移指令 MVRR、MVRD、LDRR、STRR、PUSH、POP、PSHF、POPF、IN、OUT 算术逻辑指令 ADD、SUB、AND、XOR、TEST、CMP、OR、DEC、INC、SHL、SHR 控制转移指令 CALA、RET、JMPA、JR、JRC、JRNC、JRZ、JRNZ P138
TEC-2000 16位机基本指令系统 00000000 DRSR ADD DR,SR 2 **** A DR←DR+SR 指令格式 汇编语句 操作数个数 CZVS 指令分组 功能说明 00000000 DRSR ADD DR,SR 2 **** A DR←DR+SR 00000001 DRSR SUB DR,SR 2 **** A DR←DR-SR 00000010 DRSR AND DR,SR 2 **** A DR←DR and SR 00000011 DRSR CMP DR,SR 2 **** A DR-SR 00000100 DRSR XOR DR,SR 2 * * • • A DR←DR xor SR 00000101 DRSR TEST DR,SR 2 * * • • A DR and SR 00000110 DRSR OR DR,SR 2 * * • • A DR←DR or SR 00000111 DRSR MVRR DR, SR 2 • • • • A DR←SR 00001000 DR0000 DEC DR 1 **** A DR←DR-1 00001001 DR0000 INC DR 1 **** A DR←DR+1 00001010 DR0000 SHL DR 1 * • • • A DR,C←DR*2 00001011 DR0000 SHR DR 1 * • • • A DR,C←DR /2 01000001 OFFSET JR ADR 1 • • • • A 无条件跳转 01000100 OFFSET JRC ADR 1 • • • • A C=1 时跳转 01000101 OFFSET JRNC ADR 1 • • • • A C=0 时跳转 01000110 OFFSET JRZ ADR 1 • • • • A Z=1 时跳转 01000111 OFFSET JRNZ ADR 1 • • • • A Z=0 时跳转
TEC-2000 16位机基本指令系统 指令格式 汇编语句 操作数个数 CZVS 指令分组 功能说明 10000000 0000000 JMPA ADR 1 • • • • B 无条件跳到ADR ADR(16位) 10000001 DRSR LDRR DR,[SR] 2 • • • • B DR←[SR] 10000010 I/O PORT IN I/O PORT 1 • • • • B R0←[I/O PORT] 10000011 DRSR STRR [DR],SR 2 • • • • B [DR]←SR 10000100 00000000 PSHF 0 • • • • B FLAG 入栈 10000101 0000SR PUSH SR 1 • • • • B SR 入栈 10000110 I/O PORT OUT I/O PORT 1 • • • • B [I/O PORT]←R0 10000111 DR POP DR 1 • • • • B 出栈到 DR 10001000 DR0000 MVRD DR, DATA 2 • • • • B DR←DATA DATA(16位) 10001100 00000000 POPF 1 * *** B FLAG←出栈 10001111 00000000 RET 1 • • • • B 子程序返回 11001110 00000000 CALA ADR 1 • • • • D 调用子程序 P141
计算机原理及系统结构 第二十一讲 主讲教师:赵宏伟 学时:64
TEC-2000 教学机的指令格式 8位 4位 4位 操 作 码 目的寄存器 源寄存器 I/O 端 口 地 址 相对转移指令的偏移量 8位 4位 4位 操 作 码 目的寄存器 源寄存器 I/O 端 口 地 址 相对转移指令的偏移量 直接数 / 内存地址 / 指令中变址偏移量 单字指令仅用一个指令字。 双字指令要用两个指令字, 此时第二个指令字的内容可能是立即数、一个直接地址或一个变址位移量。 第一个指令字分为三个主要部分。 最高 8 位是操作码。从这个意义上讲, 教学机的基本指令是固定长度的操作码结构, 最多支持 256 条基本指令。 最低的 8 位有多种用法:给出 1 或 2 个寄存器的编号,或入/出端口的地址,或用于给出相对转移指令的偏移量。
教学机寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 直接寻址 变址寻址 MVRD DR, DATA MVRR R1,R2 LDRR DR,[SR] 直接寻址 CALA ADR 变址寻址 JRC ADR P142
计算机原理及系统结构 第二十二讲 主讲教师:赵宏伟 学时:64
教学机指令功能及其在程序中的作用 指令功能及其在程序中的作用 例5.1:在显示器屏幕上循环显示95个可打印字符。 例5.2:把字符A~F写到内存2040~2045单元中,然后读出并在屏幕上显示。 例5.3:从键盘输入字符并送到显示器显示。 P144
本章主要内容 指令格式与寻址方式概述 汇编语言程序设计
汇编语言程序设计 机器语言是计算机硬件能够直接识别和运行的指令的集合,是二进制码组成的指令,对程序设计人员来说很难以接受,直接用机器指令设计程序实在是太困难了。 汇编语言大体上是对计算机机器语言的符号化处理的结果,再增加一些为方便程序设计而实现的扩展功能。汇编语言至少有2大优点。首先实现用英文单词或其缩写形式替代二进制的指令代码,更容易记忆和理解;其次可以选用英文单词来表示程序中用到的数据(常量和变量),并且避免程序设计人员亲自为这些数据分配存储单元,而是留给汇编程序自己去安排,这样的语言就达到了实用的最基本的标准。如果在此基础上,再在支持程序的不同结构特性(如循环和重复执行等结构),子程序所用哑变元替换为真实参数等方面提供必要的支持,使用这个语言设计程序就更为方便了。汇编语言程序经汇编器程序翻译为机器语言程序后方可运行。
高级语言又称算法语言,它的实现思路,不再是过分地“靠拢”计算机硬件的指令系统,而是着重面向解决实际问题所用的算法,更多的是是为方便程序设计人员写出自己解决问题的处理方案和解题过程的程序。目前常用的高级语言有BASIC、C、C++、,PASCAL、JAVA、PROLOG、VHDL等几百种。用这些语言设计出来的程序,通常需要经过一个叫做编译程序的软件先编译成机器语言程序,或者首先编译成汇编程序后,再经过汇编操作后得到机器语言程序,才能在计算机的硬件系统上予以执行;也可以由一个叫做解释执行程序的软件,逐条取来相应高级语言程序的每个语句并直接控制其完成执行过程,而不是把整个程序编译为机器语言程序之后再一起交给硬件系统加以执行。
教学计算机中的汇编程序的例子 例5.4:设计一个程序,在屏幕上输出显示一个字符‘6’。 A 2000 ;地址从16进制的2000(内存RAM区的起始地址)开始 2000: MVRD R0,0036 ;把字符‘6’的ASCII码送入R0 2002: OUT 80 ;在屏幕上输出显示字符‘6’,80为串行接口地址 2003: RET ;每个用户程序都必须用RET指令结束 2004: (按回车键即结束源程序的输入过程) P147
教学计算机中的汇编程序的例子 例5.5:设计一个程序,用次数控制在终端屏幕上输出‘0’到‘9’十个数字符。 A 2020 MVRD R2,000A ;送入输出字符的个数 MVRD R0,0030 ;‘0’字符的ASCII码 OUT 80 ;输出保存在R0低位字节的字符 DEC R2 ;输出字符个数减1 JRZ 202E ;判全部字符输出完否,已完,则转移到程序结束处 PUSH R0 ;未完,保存R0的值到堆栈中 (2028) IN 81 ;查询接口状态,判字符的串行输出过程结束否 SHR R0 ; JRNC 2028 ;未完成,则循环等待 POP R0 ;已完成,准备继续输出下一字符,从堆栈恢复 ; R0 的值 INC R0 ;得到下一个要输出的字符 JR 2024 ;转去输出字符 (202E) RET P147
教学计算机中的汇编程序的例子 例5.6:从键盘上连续键入多个属于‘0’到‘9’的数字符并在屏幕上显示,遇非数字符结束程序。从地址2040开始输入下列程序: A 2040 MVRD R2,0030 ;用于判数字符的下界值 MVRD R3,0039 ;用于判数字符的上界值 (2044) IN 81 ;判键盘上是否按了一个键 SHR R0 ;即串行口是否有了输入的字符 SHR R0 JRNC 2044 ;尚没有输入则循环测试 IN 80 ;把输入字符读到R0低位字节 MVRD R1, 00FF AND R0, R1 ;将R0的高位字节清0 CMP R0, R2 ;判输入的字符 < 字符‘0’否 JRNC 2053 ;是,则转到程序结束处 CMP R3, R0 ;判输入的字符 > 字符‘9’否 OUT 80 ;输出刚输入的数字符 JMPA 2044 ;转去程序前边2044处等待输入下一个字符 (2053) RET P148
教学计算机中的汇编程序的例子 例5.7:计算1到10的累加和。 A 2060 MVRD R1,0000 ;置累加和的初值为0 MVRD R2,000A ;最大的加数 SUB R3,R3 ;预置参加累加的数为0 (2064) INC R3 ;得到下一个参加累加的数 ADD R1, R3 ;累加计算 CMP R3, R2 ;判断是否累加完 JRNZ 2065 ;未完,开始下一轮累加 RET 运行过后,可以用R命令看R1中的累加结果。 P149
教学计算机中的汇编程序的例子 例5.8:设计一个有读写内存和子程序调用指令的程序,功能是读出指定内存中的大写字母字符,将其显示到屏幕上,转换为小写字母后再写回存储器的原存储单元。 E 20F0 (送入将被显示的6个字符‘A’~‘F’到内存20F0开始的存储区域中) 41 42 43 44 45 46 A 2080 MVRD R3, 0006 ;指定被读数据的个数 MVRD R2, 20F0 ;指定被读、写数据内存区首地址 (2084) LDRR R0, [R2] ;读内存中的一个字符到R0寄存器 CALA 2100 ;调用子程序,入口地址为2100, ;完成显示、字符转换和写回内存的功能 DEC R3 ;检查输出的字符个数 JRZ 208C ;完成输出则结束程序的执行过程 INC R2 ;未完成,修改内存地址 JR 2084 ;转移到程序的2084处,循环执行规定的处理 RET A 2100 ;输入用到的子程序到内存2100开始的存储区 OUT 80 ;输出保存在R0寄存器中的字符 MVRD R1, 0020 ;转换保存在R0中的大写字母为小写字母 ADD R0, R1 STRR [R2], R0 ;写R0中的字符到内存,地址同LDRR所用的地址 (2105) IN 81 ;测试串行接口是否完成输出过程 SHR R0 JRNC 2105 ;未完成输出过程则循环测试 RET ;结束子程序执行过程,返回主程序 运行过程中,可以直接看到屏幕上显示的内容,运行过后,再用D 20F0命令看内存的20F0区域中保存的运行结果, 6个大写的英文字母已经被修改为小写字母: 0061 0062 0063 0064 0065 0066 P149
教学计算机中的伪指令 写在程序中的、指示汇编程序如何对该程序执行汇编操作的命令叫做伪指令。例如: ORG : ORG exp 指定程序执行的开始地址 END : 指定程序执行的结束地址 EQU : var EQU exp 定义变量的值 var = exp DW : adr DW exp 以为首地址在存储器中 写入指定的值 BLK : BLK n 保留 n 个存储单元