1、2.1 指令格式,机器指令的要素 操作码(Operation Code):指明进行的何种操作(如 ADD, I/O) 源操作数地址(Source Operand Reference):参加操作的操作数的地址,可能有多个。 目的操作数地址(Destination Operand Reference):保存操作结果的地址。 下一条指令的地址(Next Instruction Reference):指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显示的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。,操作数的来源
2、 存储器(存储器地址) 寄存器(寄存器地址) 输入输出端口(输入输出端口地址),2.1 指令格式,操作数的类型 地址(操作数地址,指令地址) 数值(整型数或定点数,浮点数,十进制数) 字符 逻辑型数,2.1 指令格式,地址的数目 三地址:Des (Sur1) OP (Sur2),双地址:Des (Sur) OP (Des),单地址:累加器作为其中一个操作数的双操作数型,或单操作数型,无地址:隐含操作数型,或无操作数型,OP,2.1 指令格式,操作码结构 固定长度操作码:操作码长度(占二进制位数)固定不变。 硬件设计简单 指令译码时间开销较小 指令空间效率较低 可变长度操作码:操作码长度随指令地
3、址数目的不同而不同。 硬件设计相对复杂 指令译码时间开销教大 指令空间利用率较高 指令长度 定长指令系统 变长指令系统:一般为字节的整数倍,2.1 指令格式,关于指令扩展操作码的举例 1. 设某机器采用固定长度指令系统,指令长度为16位,包括 3 地址指令15条、双地址指令10条和若干单地址指令,假定每个地址占4位,请问,该指令系统最多可以容纳多少单地址指令,并设计该指令系统的操作码编码方案。,基本思路 1. 每一条指令需要一个唯一的操作码编码。 2. 不同类型的指令应该具有不同的标识。 3. 采用扩展操作码方案。,2.2 寻址方式,寻址:根据形式地址查找到操作数的过程。,形式地址与有效地址
4、形式地址:指令中直接给出的地址编码。 有效地址:根据形式地址和寻址方式计算出来的操作数在内存单元中的地址。,有效地址:操作数Data的内存单元地址Add,2.2 寻址方式,寻址方式 定义:指令代码中地址字段的一部分,指明操作数的获取方式或操作数地址的计算方式。 指令中每一个地址字段均有其寻址方式编码(或隐含寻址方式),目的地址,源地址,2.2 寻址方式,指令代码和寻址描述中有关缩写的约定 OP:操作码 Des:目的操作数地址 Sur:源操作数地址 A或Add: 形式地址(内存地址) Mod:寻址方式 Rn : 通用寄存器 Rx :变址寄存器 Rb : 基址寄存器 SP:堆栈指针(寄存器) EA
5、 :有效地址 Data :操作数 Operand :操作数 (X):表示对象X的内容(值),如(Rn)表示寄存器Rn的内容(值),(A):内存中地址为A的单元的内容。 Imme. Data : 立即数 XXH:16进制数XX,2.2 寻址方式,立即寻址 操作数直接在指令代码中给出。,说明 立即寻址只能作为双操作数指令的源操作数。 Operand = Imme. Data 例:MOV AX,1000H,思考 立即寻址的操作数在什么地方,存储器 or 寄存器? 立即数的地址?,2.2 寻址方式,寄存器直接寻址 操作数在寄存器中,指令地址字段给出寄存器的地址(编码) EA = Rn, Operand
6、 = (Rn) 例:MOV BX, AX,Data,2.2 寻址方式,存储器直接寻址 操作数在存储器中,指令地址字段直接给出操作数在存储器中的地址 EA = A, Operand = (A) 例:MOV AX, 1000H,Data,2.2 寻址方式,寄存器间接寻址 操作数在存储器中,指令地址字段中给出的寄存器的内容是操作数在存储器中的地址。 EA = (Rn), Operand = (Rn) 例:MOV AX, BX,Data,2.2 寻址方式,存储器间接寻址 操作数在存储器中,指令地址字段中给出的存储器地址的单元内容是操作数在存储器中的地址。 EA = (A1), Operand = (A
7、1) 例:MOV R1, (1000H) PDP-11的指令,Data,2.2 寻址方式,基址寻址 操作数在存储器中,指令地址字段给出一基址寄存器和一形式地址,基变址寄存器的内容与形式地址之和是操作数的内存地址。 EA = (Rb)+A, Operand = (Rb)+A) 例:MOV AX, 1000HBX,Data,基址寻址的作用:较短的形式地址长度可以实现较大的存储空间的寻址。,2.2 寻址方式,变址寻址 操作数在存储器中,指令地址字段给出一变址寄存器和一形式地址,变址寄存器的内容与形式地址之和是操作数的内存地址。 EA = (Rx)+A, Operand = (Rx)+A) 有的系统中
8、,变址寻址完成后,变址寄存器的内容将自动进行调整。Rx (Rx) + (操作数Data的字节数) 例:MOV AX, 1000HDI,Data,变址寻址的作用:数组操作,串操作,2.2 寻址方式,相对寻址 基址寻址的特例,由程序计数器PC作为基址寄存器,指令中给出的形式地址作为位移量,二者之和是操作数的内存地址。 EA = (PC)+A, Operand = (PC)+A) 例:JNE A,Data,2.2 寻址方式,堆栈寻址 堆栈的结构:一段内存区域。 栈底,栈顶, 堆栈指针(SP):是一个特殊寄存器部件, 指向栈顶 堆栈操作:PUSH ( 从寄存器到堆栈),POP (从堆栈到寄存器),2.
9、2 寻址方式,堆栈寻址 出栈操作:POP Rn,假定寄存器Rn为16位寄存器SP (SP) + 2, Rn (SP),Data,2.2 寻址方式,页面寻址 将程序计算器PC的高位部分与形式地址拼接形成操作数的有效地址。 EA (PC)H, 拼接 A 内存分位若干页, (PC)H,指明页地址,形式地址A表明页内的位移量,Data,2.2 指令类型,数据传送指令:Move,Store,Load,Set,Clear,Exchange 算术运算指令:包括定点数、浮点数运算和十进制数运算 逻辑运算指令:And,Or,Not,Xor,Compare,Test 移位指令 算术移位,逻辑移位,循环移位 程序控
10、制类指令 几个重要的寄存器:程序计数器PC,程序状态字PSW(或标志寄存器),堆栈指针SP 转移指令:无条件转移指令,有条件转移指令 循环控制指令(LOOP) 子程序调用与返回指令(CALL,RET) 程序中断指令及返回(INT,IRET) 串操作指令(MOVSB,MOVSW) I/O指令:IN,OUT 堆栈指令:PUSH,POP,2.2 寻址方式,堆栈寻址 压栈操作:PUSH Rn,假定寄存器Rn为16位寄存器(SP) (Rn), SP (SP)-2,Data,8086/8088指令系统举例,3.1 80868088指令系统:CPU与存储器结构,80868088CPU寄存器结构,3.1 80
11、868088指令系统: CPU与存储器结构,存储器及其存储器地址结构 主存容量为1M(220),可直接访问的主存物理地址为20位。超过1M的存储空间通过其他方式访问。 80868088机器字长16位,所有寄存器长度位16位,数据总线16位。 主存采用分段的结构 主存存储单元的地址构成:段基址(16 bits): 段内偏移(16 bits) 可执行程序(.EXE)的存储结构:代码段(Code Segment),数据段(Data Segment),堆栈段(Stack Segment),扩展数据段(可选) 命令程序(.COM)的存储结构:代码段,数据段和堆栈段必须是同一个段。所以命令程序最大为64K
12、B存储空间。,3.1 80868088指令系统: CPU与存储器结构,存储器地址结构与计算,3.1 80868088指令系统: CPU与存储器结构,存储器单元结构 按字节单元编址,字节单元 (2000H)20H (2001H)10H,字单元 (2000H)1020H (2004H)5060H,双字单元 (2000H)30401020H,3.2 80868088指令系统:寄存器,通用寄存器:数据寄存器(Data Register) AX,BX,CX,DX(16位); AH,AL,BH,BL,CH,CL,DH,DL(8位) 各寄存器原则上没有固定的应用 AX:累加器 BX:基址寄存器 CX:计数器
13、 DX:数据寄存器,3.2 80868088指令系统:寄存器,通用寄存器:指针寄存器(Pointer Register) 堆栈指针:SP(16 位) 基址指针:BP(16位),默认指向堆栈段,通用寄存器:变址寄存器(Index Register) SI,DI:16位 一般情况下,二者使用上无差异,在串操作中,SI 对应源操作数,DI对应目的操作数,3.2 80868088指令系统:寄存器,通用寄存器:段寄存器(Segment Register) 代码段(Code Segment),数据段(Data Segment),堆栈段(Stack Segment),扩展数据段(Extend data Se
14、gment) 代码段寄存器:CS(16 bits) 数据段寄存器:DS (16 bits) 堆栈段寄存器:SS (16 bits) 扩展段寄存器:ES (16 bits),3.2 80868088指令系统:寄存器,指令指针IP(Instruction Pointer) IP(16 bits)指向代码段中下一条要执行的指令。 CS:IP 形成下一次要执行的指令的内存地址。,标志寄存器FLAGS(Flags Register) 16位,记录当前CPU运行程序的各种状态 进位标志位 CF(Carry Flag) 奇偶标志位 PF(Parity Flag) 辅助进位标志位 AF(Auxitiary F
15、lag) 零值标志位 ZF(Zero Flag) 符号标志位 SF(Sign Flag) 溢出标志位 OF(Overflow Flag) 单步跟踪标志位 TF(Trace Flag) 中断允许标志位 IF(Interrupt-enable Flag) 方向标志位 DF(Direction Flag),3.3 80868088指令系统:寻址方式,立即寻址 MOV AX,1234H (指令代码:B83412H),3.3 80868088指令系统:寻址方式,寄存器(直接)寻址 MOV AX, BX (指令代码:89D8H),3.3 80868088指令系统:寻址方式,(存储器)直接寻址 MOV AX
16、, 0100H (指令代码:A10001H) 等价于 MOV AX,DS:0100H EA = DS:0100H,3.3 80868088指令系统:寻址方式,寄存器间接寻址 MOV AX, BX (指令代码:8B07H) 等价于 MOV AX,DS:BX EA = DS: (BX),MOV BH,BP = MOV BH,SS:BP MOV CX,SI = MOV CX,DS:SI MOV DI,BX = MOV DS:DI,BX,3.3 80868088指令系统:寻址方式,基址(变址)寻址 MOV AX, 1000HBX (指令代码:8B870001H) 等价于 MOV AX, DS:BX10
17、00H EA = DS: (BX)+1000H,3.3 80868088指令系统:寻址方式,基址变址寻址 MOV AX, 1000HBXSI (指令代码:8B800001H) 等价于 MOV AX, DS:BX+SI+1000H EA = DS: (BX)+(SI)+1000H 基址寄存器只能选:BX,BP 变址寄存器只能选:SI,DI 基址寄存器BX:默认DS段 基址寄存器BP:默认SS段,MOV AX,10HBXDI = MOV AX,DS:BX+DI+10H MOV AL,20HBPSI = MOV AL,SS:BP+SI+20H,3.3 80868088指令系统:寻址方式,串操作寻址
18、串操作指令(MOVSBMOVSW)隐含的寻址方式 源操作数地址 DS: (SI) 目的操作数地址 ES: (DI) 寻址完成后SI,DI自动调整(根据方向标志位DF调整),MOV SI,1000H MOV DI,3000H MOV CX,0100H CLD REP MOVSB,3.3 80868088指令系统:寻址方式,I/O寻址 I/O指令特有的寻址方式 IN AL,DX OUT DX,AL I/O端口地址:12位端口地址 I/O端口:I/O接口部件中可访问的空间(寄存器),向COM1口发送字符A MOV DX, 3F8H MOV AL, 41H OUT DX, AL,3.4 8086808
19、8指令系统:指令格式与编码,一般双操作数指令格式与编码 RR型或RS型,必有一个操作数在寄存器中(寄存器直接寻址) 长度26个字节(前2个字节必须) Opcode:操作码(6位) d: 方向字段(1位)。在第二个字节中,REG确定一个操作数(寄存器直接寻址),MOD和R/M确定零一个操作数的寻址方式。方向字段d表明REG确定的是源操作数还是目的操作数。 d=1, REG确定目的操作数,MOD+R/M确定源操作数 d=0, REG确定源操作数,MOD+R/M确定目的操作数 W:字字节字段(1位):操作数是字节(8位)还是字(16位) W=1,字(16位) W=0,字节(8位),3.4 80868
20、088指令系统:指令格式与编码,一般双操作数指令格式与编码(续) REG:寄存器字段,指明两个操作数中寄存器直接寻址的那个操作数。与W字段配合使用。,3.4 80868088指令系统:指令格式与编码,一般双操作数指令格式与编码(续) MOD和R/M:确定另外一个操作数。,3.4 80868088指令系统:指令格式与编码,一般双操作数指令格式与编码(续) 位移量部分:8位或16位,或者无。 立即数:8位或16位,或者无。,3.4 80868088指令系统:指令格式与编码,与累加器(AX或AL)相关双操作数的指令 AX(AL):寄存器直接寻址 另一操作数:存储器直接立即数 指令代码中省略累加器编码
21、字段,采用特定的操作码以区别于其他双操作数指令。,Mem Acc Acc Mem,指令:MOV AX, 1000H 指令代码:10100001 00000000 00010000,3.4 80868088指令系统:指令格式与编码,指令编码举例 MOV AX,1000HBXSI MOV的操作码Opcdoe100010 d=1 W=1 REG=000 MOD=10, R/M=000 指令前两个字节1000101110000000(8B80H),3.4 80868088指令系统:指令格式与编码,其他指令格式 单操作数指令编码格式 与立即数相关的指令的特定格式,单操作数指令,3.5 80868088指
22、令系统:指令类型,指令类型 传送指令:MOV,XCHG,LDS,LEA 算术运算指令:ADD,INC,SUB,CMP等 逻辑运算指令:AND,OR,NOT,TEST等 处理器控制指令:CLC,STC,CLI,STI,CLD,NOP等 程序控制指令:CALL,RET,JMP,JNE,INT,IRET等 串指令:MOVSB,MOVSW等 I/O指令:IN,OUT,3.1 指令系统的设计,设计依据 操作特性:不同操作的数量,具体是些什么操作,复杂程度等。 数据类型:各种操作所处理的数据的类型。 指令格式:指令长度,地址数目,指令中不同域的大小等。 寄存器数目:CPU中可以直接访问的寄存器的数目及使用
23、方法。 寻址(Addressing):操作数的寻址方式。,3.1 指令系统的设计,指令设计的相关因素 操作数量:决定操作码的位数。 操作数数量:采用几个操作数(一般为两个),每个操作数均应包括寻址模式编码。有时操作数是隐含的。 寻址方式数量:有时寻址方式可以是隐含的(由操作码决定) 。 寄存器数量 :确定寄存器编码的位数。 地址范围:存储器直接寻址很少见,但变址(或基址)寻址时,较大的寻址范围必须以较多的displacement位数为前提。 编址粒度(Address Granularity):字节编址或字编址。字节编址方便,但要以更多的地址位数为代价。,3.1 指令系统的设计,指令设计 指令编
24、码设计首先考虑指令编码中的固定不变的部分,然后考虑可变的部分。 指令编码中的固定部分:指令系统方案确定后不可能发生变化的部分。 操作码(数量,位数,编码) 寻址方式(数量,位数,编码) 寄存器(数量,位数,编码) 不同指令所涉及的地址数量,3.1 指令系统的设计,指令系统设计举例 某机字长为16位,数据总线16位,内存容量64KB,8个16位通用寄存器R0R7。指令系统基本要求是: 四种寻址方式:立即寻址,寄存器直接寻址,寄存器间接寻址,变址寻址;立即数和变址寻址时位移量disp均可达16位。 32条双操作数指令(其中必有一操作数是寄存器直接寻址)。 128条单操作数指令。,3.1 指令系统的
25、设计,指令系统设计举例(续) 双操作数指令格式,补码除法(加减交替法)规则说明 1. 商为正时,够减应商真值1,不够减时商真值0; 商为负时,够减应商真值 1,不够减时商真值0; 2. 当与同号时,商Q为正,Q的真值与补码形式一致; 当与异号时,商Q为负,Q的真值与补码的关系除最后一位(恒为1)外,其余各位补码实际上是对应真值的反码。 3. 关于溢出,无论如何,第一为商只能是0。假定第一位商的真值为,则余数 ,若取1(或-1)时,余数仍为真余数,则溢出。也即: 当Q为正时,R=2-1=2-与B同号溢出; 当Q为负时,R=2-(-1)=2+与B同号溢出 4. 当Q为正时: l 若R与同号,表明R
26、是真余数,应商真值1,补码形式也是1;根据加减交替法,下一步为2R-R,即。 l 若R与异号,表明R是假余数,应商真值0,补码形式也是0;下一步为2R+R,即。 5. 当Q为负时: l 若R与同号,表明R是假余数,应商真值0,反码形式是1;根据加减交替法,下一步为 ,即 l 若R与异号,表明R是真余数,应商真值1,反码形式是0;下一步为,即,l 6. 关于最后一位恒置1:由算法可知,最后一次减尝试可能出现够减和不够减两种情况,但不管够减和不够减,减操作已经完成,算法中并不管最后余数的恢复,所以,最后一位商的真值应为1(或-1),余数有可能是假余数。分两种情况: l 若Q为正,最后一位为1,与恒置1同。 l 若Q为负,最后一位真值为1,反码形式为0,最后应将Q变成补码,最后一位也为1,与恒置1同。 商的修正及说明 1. 前提,最后一次余数为,在非恒置1前提下最后一位商为 2. 若=0,为真余数,置成1。 3. 若0, l 若Q为正,如果=0,为假余数,恢复余数为+,商不必修正。如果=1,余数和商不必修正。 l 若Q为负,如果=0(反码),为真余数,商变成补码,即置成1。如果=1(反码),为假余数,恢复余数为-,商变成补码,即加1。,