第三章 80868088的指令系统

第三章 80868088的指令系统
第三章 80868088的指令系统

3.1 指令的基本格式

 

一、指令构成

微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成:

l.操作码(OP-Code)字段

该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。

2.操作数(Oprand)字段

该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。

指令的基本格式如下:

 

二、8086

 

8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。

 

(1)B1字节各字段定义如下:

OP--指令操作码。

D--表示方向。D=1寄存器为目的,D=0寄存器为源。

W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。

(2)B2字节各字段定义如下:

MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量; MOD01,只有低8位位移量,需将符号扩展8位,形成16位; MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。

REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。

R/M--R/M受MOD制约。当 MOD=11(即寄存器方式时),由此字段给出指令中第二个操作数所在的寄存器编码;当MOD≠11时,此字段用来指出应如何计算指令中使用的存储器操作数的有效地址。MOD和R /M字段表示的有效地址 EA计算方法如表3-1所示,共2 4种。

 

(3) B3~B6字节这四个字节一般是给出存储器操作数地址的位移量(即偏移量)和/或立即操作数。位移量可为8位,也可为16位,这由MOD来决定。8086规定16位的字位移量的低位字节放于低地址单元,高位字节放于高地址单元。

若指令中只有8位位移量, 8086在计算有效地址时,自动用符号将其扩展成一个16位的双字节数,以保证有效地址的计算不产生错误,实现正确的寻址。指令中的立即操作数位于位移量的后面。若B3,B4有位移量,立即操作数就位于B5,B6。若指令中无位移量,立即操作数就位于B3,B4字节。总之,指令中缺少的项将由后面存在的项向前顶替,以减少指令长度。

3.2 8086的寻址方式

 

8086的操作数可隐含在操作码中,也可以是操作数字段中的操作数本身,还可以是存放操作数的地址,如寄存器,I/0端口及存储器。对存储器,给出的或是存储器地址,或是产生存储器地址的信息。从表3

-l可见,共有2 4种计算存储器有效地址EA(Effect Address)的方法。这些有效地址均在除代码段以外的存储段中,它表示的是离段起始地址的距离。以上所有能寻得操作数来源的方式,称为寻址方式。8086的寻址方式也是8位的8080/8085的母集,对不同的操作数8086有不同的方法对它们进行存取,特别是对存储器操作数,增加了许多支持数组处理和字符串处理的寻址方式。这样,可使指令方便灵活地寻址整个存储器空间,同时,对支持高级语言的使用也是必不可少的。

 

一、固定寻址( Inherent Addressing)

8086的单操作数指令,其操作是规定在CPU中某个固定的寄存器中进行,这个寄存器又被隐含在操作码中,因此,这种寻址方式的指令大多为单字节指令,例如,加减法的十进制调整指令,其操作总是固定在AL寄存器中进行;还有为双操作数指令,例如寄存器人栈和出栈指令PUSH REG和POP REG,其中有一个操作数地址也是固定的堆栈栈顶;还有乘、除法指令虽不是单字节指令,但被乘数,被除数总是放在AL 或AX中。固定寻址指令中,对固定操作数是被隐含了的。固定寻址的指令,不需要计算EA,执行速度快,加之大多为单字节指令,因此特别适合在微处理机中使用。

 

二、立即数寻址( Immediate Addressing)

这种方式下的操作数直接存放在指令中,是紧跟在操作码之后的DATA,它作为指令的组成部分放在代码段中,随着取指令一起取到指令队列,执行时直接从指令队列中取,而不必执行总线周期。立即数可以是8位,也可以是16位。如果是16位数,则低位字节数存放在低地址单元,高位字节数存放在高地址单元。

例如:MOV AL,C3H ;执行后,(AL)=C3H

MOV AX,2050H ;执行后,(AX)=2050H,其中:(AH)=

20H,(AL)=50H。

 

这种寻址方式只能用于源操作数,且因操作数是直接从指令中取得,不执行总线周期,所以这种寻址方式的显著特点是执行速度快,主要用来给寄存器赋初值。

 

三、寄存器寻址(Register Addressing)

其操作数来源于CPU的内部寄存器,指令中直接给出寄存器名。对于16位的操作数,寄存器可以是:AX,BX,CX,DX,SI,DI,SP和BP;对于8位的操作数,寄存器可以是AL,BL,CL,DL及 AH,BH,

CH,DH,可见表3-2中MOD=11时的情况。

例如:INC CX ;执行后,(CX)<-(CX)+1

MOV DS,AX ;指令执行前,若(AX)=2100H,执行后,(DS)=2100H,并且(AX)不变。

 

一条指令中,可以对源操作数采用寄存器寻址方式,也可以对目的操作数采用寄存器寻址方式,还可以两者都用寄存器寻址方式。采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要执行总线周期,因此,执行速度快。

3.3 指令执行时间

 

通常,计算机一条指令的执行时间是指取指令和执行指令所花时间的总和。但是,在8086CPU中,执行部件EU和总线接口部件BIU是并行工作的,BIU可以预先把指令取到指令队列缓冲器存放,形成取指和执行的重叠,这样,在计算指令的执行时间时,就不把取指时间计算在内。

 

执行指令的时间,除了EU中的基本执行时间外,有些指令在执行过程中可能需多次访问内存,包括取操作数和存放操作结果等,这都要执行总线的读/写周期;而在每次访问内存之前,又需要计算有效地址EA,计算有效地址所需的时间又由寻址方式决定。不同寻址方式下计算有效地址所需的时间如表3-2所示。不同功能的指令,其基本执行时间也不相同,这里,将一些常用类指令的基本执行时间列举在表3-3中,其余指令的可参见附录一"时钟周期数"一栏中的第一项数据。就是同一类指令,因寻址方式不同,访问存储器次数不一,因而执行时间也不同,这里,仅列出加法指令( ADD)的情况,如表3-4所示。表中"时钟周期"一栏中的第二项"EA"为计算有效地址所需的时间。'以上所有的时间均用时钟周期数来计量。

 

 

综上所述:执行一条指令所花的总时间=基本执行时间十计算EA的时间十执行总线读/写周期的时间。其中后两项对存储器操作数才有。

除上面讨论的这些因素外,在考虑一第指令所需的执行时间时,还应注意到宇操作数在内存或I/O端口的存放格式也是一个影响因素。8086的数据总线是16位的,因此,CPU和存储器、I/O端口之间传送数据时,在一个总线周期(基本总线周期为4T)中可以传送 16位数据,即一个字。但要做到这点,是有条件的。

在第二章讨论存储器组织时,若存/取的字操作数是从偶地址开始的规则字,其存/取可在一个总线周期完成;若存/取的字操作数是从奇地址开始的非规则字时,其存/取需在二个总线周期完成。因此,这种情况下,每访问内存一次,便需多加一个总线周期的时间。如果,指令执行的是字节操作,而这个字节数是对偶地址单元或偶数端口进行的存/取,那么,在一个总线周期中,只有数据总线的低8位起传输作用,而高8位则处于空闲状态。相反,若字节数是对奇地址单元或奇数

端口进行存/取,则在一个总线周期中,只有数据总线高8位起传输使用,而低8位则处于空闲状态。

请看例题

例1 设8086的时钟频率为5MHZ(即时钟周期=0.2uS),试求ADD指令在各种寻址方式下,指令的执行时间t。

解:根据表3-4:

l.两操作数为:寄存器,寄存器,结果在寄存器。这种情况下,对于字操作数或字节操作数均花3个时钟周期,即

t=3×0.2=0.6 us

 

2.两操作数为:寄存器,存储器(用相对基址加变址寻址),结果存寄存器,这时需访问一次内存。在这种情况下,对于字节操作或对规则字操作,所需时间为

t=9+EA=9+12=21(T)

第一项9为这种寻址方式下指令基本运算和基本操作时间,第二项为计算EA的时间,则

t=21×0.2=4.2 us

对于非规则字的操作,则应在上面的时间上再加上一个总线周期时间,如 4T,即

t=(21+4)T=5.0ns

 

3.两个操作数为:存储器(用基址变址寻址),寄存器,结果存存储器,这时需访问二次内存。对于字节操作或对规则字操作,指令执行时间为:

t=16+EA=16+8=24(T)=4.8us

第一项的16为这种寻址方式下指令基本运算和基本操作时间,第二项为计算EA时间。

对于非规则字操作,指令执行时间应在上面的时间上加上两个总统周期,则

t=(6+8+4+4)T=32T=6.4us

还有其它三种寻址方式下,ADD的执行时间,请读者练习计算。

 

从这个例子可以看出:对于同一种ADD指令,因寻址方式不同,执行指令的时间相差甚远,这是指令的时间指标概念。从表3-4还可以看到:同一类指令使用不同的寻址方式,其指令长度也不一样,即占有的内存

的字节数相差也很大,这是指令的空间指标的概念,合起来就是指令的时/空指标。指令是程序的基本组成单元,那么当要求程序有较高的时/空利用率时,就要求程序设计者,不仅要研究程序的算法,数据结构,还要研究指令与寻址方式的选用,才能编制出理想的程序。

3.48086指令系统

 

从本节开始,我们开始具体学习8086每一条指令的功能与格式。

 

8086指令系统包含133条基本指令,这些指令与寻址方式组合,再加上不同的操作数类型----字或字节,可构成上千种指令。

 

按功能的不同,可将这些指令分为六类:

 

1.数据传送类 4.串操作类

2.算术运算类 5.控制转移类

3.逻辑运算与移位类 6.处理器控制类

 

我们也按这种分类,来逐步学习。

 

学习指令系统,应重点注意掌握如下问题:

指令功能的准确理解

指令中操作数的寻址方式(可用的操作数及不可用的操作数)

指令对标志位的影响

指令正确写法(指令格式)

(一)通用数据传送指令

 

1.传送指令(MOV类指令)

指令格式:MOV dst,src

指令功能:将src代表的源操作数的内容送到dst 代表的目标操作数去。

注意,源操作数在后,目标操作数在前。指令执行后,源操作数的内容不会改变。

另:指令操作符使用大小写都是可以的。

掌握MOV指令的关键是,应搞清楚指令中两个操作数src与dst可用

的寻址方式的组合,及不可用的寻址方式的组合。

 

可用的寻址方式的组合:

(1)CPU通用寄存器之间传送(r/r) r代表任一个通用寄存器

例子:MOV CL,AL ;AL中的8位数据传送到CL

MOV SI,AX ;AX中的16位数据传送到 SI

注意:上面指令中,分号";"后的文字为该指令的注释

 

(2)通用寄存器和段寄存器之间传送(r/SEG) SEG代表任一个段寄存器

例子:MOV DS,AX ; AX中的 16位数据到 DS

MOV AX,ES ; ES中的 16位数据到 AX

 

(3)通用寄存器和存储单元之间传送( r/M),M 代表以某种寻址方式表示的内存操作数。

例子:MOV AL,[BX] ;DS数据段中(BX)所指存储单元内容到AL MOV [DI],AX ;AX中的16位数据送DS数据段中(DI)和(DI)+1所指的两个相邻存储单元

MOV [2000H],CX ;CX中的16位数据送DS数据段中(2000H)和(2001H)两个相邻存储单元

注意:存储单元可以使用直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址这些存储单元寻址方式中的任何一种。但必须注意段约定。

 

(4)段寄存器和存储单元之间传送(seg/M)

例如:MOV DS,[2000H] ;2000H和 2001H两存储单元内容到DS MOV [BX][SI],CS ;CS内容传至(BX)+(SI)和(BX)+(SI)+1所指的两个存储单元

 

(5)立即数到通用寄存器(r->Imm),Imm 代表某一个立即数

例如:MOV SP,2000H ;2000H 送SP, 赋初值

 

(6)立即数到存储单元(M->Imm)

例如:MOV WORD PTR [SI],4501H ;立即数 4501H到(SI)所指的字单元。即(SI)与(SI)+1指向的两个单元。WORD PTR 在这里限定[SI]是WORD类型(即字类型)的操作数。

 

请点击这里参看直接寻址操作示意图

请点击这里参看寄存器间接寻址操作示意图

请点击这里参看寄存器相对寻址操作示意图

请点击这里参看相对基址加变址操作示意图

对于MOV指令的使用,有几点需要注意:

 

①MOV指令可以传送 8位的数据,也可以传 16位的数据,这决定于寄存器是8位还是 16位,也决定于立即数的形式。下面的使用是错误的:

MOV ES, AL

MOV CL,4231H

换句话说:MOV指令中的两个操作数的类型必须一致。要么都是8位数据,要么都是16位数据。

对于上面的第(6)种情况,此时两个操作数:[SI]及4501H的类型都不确定,这时必须用某种类型限定符(如WORD PTR)指定某一个操作数的类型。

(五)综合运算符

 

这种运算符为存储器地址操作数临时指定一个新的属性,而忽略当前的属性,所以又称为属性修改运算将。

有六个综合运算将: PTR、段属性前缀、SHORT、THIS、HIGH和LOW。

 

1.PTR

PTR用来生成一个新的存储器地址操作数,但它本身并不实际分配存储器。

格式:类型 PTR 存储器地址表达式

PTR将它左边的类型指定给右边的地址表达式。这样一来,PTR便产生了一个新的存储器地址操作数。这个新的地址操作数具有和PTR右边的地址表达式一样的段基址和编移量,即它们指示的是同一存储单元,但却有不同的类型。新的由PTR产生的存储器操作数的类型由 rtR 指定,以前的存储器操作数的类型则由定义此存储单元时的伪指令(例如 DB、DW等等)确定。

在PTR表达式中出现的类型可以是BYTE、WORD、DWORD、NEAR、FAR或结构名称。PTR右边的地址表达式可以是标号以及作为地址指针的寄存器、变量和数值的各种组合形式。

 

例9 PTR应用举例。

 

已知变量VAR1定义如下:

VAR1 DW 2030H

此时,VARI的当前类型为WORD。

应用 1:用PTR建立新的变量VAR2和VAR3

VAR2 EQU BYTE PTR VAR1

VAR3 EQU BYTE PTR VAR1+l

存储器分配如图 4-6(l)所示。

 

 

可见,VAR1与VAR2为同一存储单元,但是VAR1和VAR2的类型却不同。

TYPE VAR1=2 ;VAR1是字型的

TYPE VAR2=1 ;VAR2是字节型的

同理,VAR3和 VAR1+1具有同样的段基址和偏移量,但却有不同的类型。

 

应用2:下列程序段在汇编时将出现"操作类型不明确"的错误。

MOV BX,OFFSET VARI

MOV [BX],7

汇编程序不能确定是将0007H送入VAR1和VAR1+1两个单元,还是只选07H到VAR1单元。即不明确是字操作还是字节操作。所以,我们要将[BX]单元的属性写明。修改为:

MOV BYTE PTR[BX],7

则指令执行后,往VAR1单元送入07H,而VAR1+1单元内容不变,如图 4-6(2)所示。

若:MOV WORD PTR[BX],7

则指令执行后,往VAR1单元送07H,往紧接着的 VAR1+1单元送00H,如图4-6(3)所示

WORD PTR 在这里限定[SI]是WORD类型(即字类型)。另外,BYTE PTR 限定字节类型。

 

②MOV指令中的dst和src两操作数中必用一个寄存器,不允许用MOV在两存储器单元间传送数据。若需要时,可借助一通用寄存器为桥梁,即

MOV AL,[SI]

MOV [DI],AL

 

③不能用CS和IP作目的操作数,也就是说这两个寄存器的内容不能随意改变。

 

④不允许在段寄存器之间直接传送数据。

 

⑤不允许用立即数作目的操作数

 

⑥不能向段寄存器送立即数,因此当要对段寄存器初始化赋值时,也要通过CPU的通用寄存器,如:

MOV AX,DATA ;将数据段首地址DATA通过AX填入DS中

MOV DS,AX

请看例子

例1 请将当前数据段1000H单元内容送至AH和AL中

解:

MOV AH,[2000H]

MOV AL,AH

例2 请将当前数据段1000H单元内容送至当前数据段2000H单元处

解:

MOV AH,[1000H]

MOV [2000H],AH

 

注: 存储单元送存储单元,必须用某个寄存器过渡。

 

例3 请将当前数据段1000H单元内容与当前数据段2000H单元内容互

解:

MOV AH,[1000H]

MOV AL,[2000H]

MOV [1000H],AL

MOV [2000H],AH 

 

例4 有一主程序调用一子程序,子程序中将用到AX,BX、CX和DX。为了使主程序中这些寄存器内容不被破坏,在进入子程序时应进行入栈保护,子程序执行完后,再出栈恢复原来的数据。子程序中的保护现场和恢复现场的程序段为:

SUBROUT PROC NEAR ;定义过程(即子程序)

PUSHF ;以下保护现场

PUSH AX

PUSH BX

PUSH CX

PUSH DX

. ;(子程序主体)

POP DX ;以下恢复现场

POP CX

POP BX

POP AX

POPF

RET ;返回

SUBROUT ENDP ;过程结束

 

请注意PUSH 指令与POP指令的用法。他们的使用一定是对称的。 这样,调用该子程序前后,堆栈没有变化。

2.堆栈操作指令

 

堆栈及其用法在前一章已经介绍。

四、堆栈

 

一般的计算机系统都需要设立堆栈,用它来暂存一批需要保护的数据或地址,它好似堆放货物的仓库一样。堆栈常常就是一段特别划分出来的存储区。之所以要专门划分出来,是因为堆栈存储区存取数据或地址采用的原则比较特殊,它是按照"先进后出"(First In Last 0ut简称FILO)或"后进先出"的原则进行的。

 

先解释什么是"先进后出"。所谓"先进后出",指的是先存入堆栈(一般称为推入堆栈)的数据后取出来(一般称为弹出堆栈)。而"后进先出"就是指后存入堆栈的先取出来,两者意思是一样的。显然,这和一般的数据存储区是不一样的,一般的数据存储区采用的是"随机存取"方式,并无先进后出这样的原则。

 

因此,所谓堆栈,就是在内存中开辟的一段特殊的存储区域,这段区域采用"先进后出"的原则存取数据。

 

8086由于采用了存储器的分段,为了表示所划分出来的堆栈区,也用一种称为堆栈段的段来表示。堆栈段在存储区中的位置由堆栈段寄存器SS和堆栈指针SP来规定。SS中存放堆栈段的段地址,SP中则存放栈顶的偏移地址,此地址是表示栈顶离段首址的偏移量。堆栈段的表示如图2-32a所示。一个系统中使用的堆栈数目不受限制,在有多个堆栈的情况下,各个堆栈是用各自的段名来区分的。一个堆栈段的深度最大为64KB。在有多个堆栈情况下,只有一个堆栈段是当前的执行程序可直接寻址的,称此堆栈段为当前堆栈段,SS给出当前堆栈段的首址,SP 指出当前堆栈段中的栈顶位置。

 

堆栈最典型的用法就是在调用子程序时保存返回地址。为了实现正确的返回,需要将断点地址暂存起来。断点地址是指主程序中调用指令(CALL 指令)的下一条指令的地址,它们是在执行调用指令CALL时,被存入堆栈的;当子程序执行完时,在执行返回指令RET时,将存入堆栈的断点地址送回CS和IP,这样,程序的执行又能正确的回到了断点处的下一条指令。

 

当子程序中存在嵌套调用时,也就是在子程序中又需要调用例外的子程序时,堆栈"先进后出"的原则对于保证各调用能正确返回就是至关重要的。因为,在嵌套调用时,正确的返回次序是"先调用的后返回,后调用的先返回",所以就要求存放返回地址的堆栈实行"先进后出",请看下面的动画演示。

图2-31 堆栈"先进后出"保证嵌套调用正确返回

由于堆栈是以"先进后出",或者"后进先出"方式工作的一个存储区,因此它有专门的操作指令:入栈指令(PUSH)和出栈指令(POP)。

 

堆栈操作指令总是对当前堆栈顶的存储单元进行操作的。当前栈顶地址(偏移地址)保存在堆栈指针SP中。(SP)任何时候都指向当前的栈顶。因此,入栈指令PUSH和出栈指令POP的操作,首先是在当前栈须进行,随后要及时地修改SP指针,保证(SP)总是指向当前栈顶。

 

指令格式: PUSH src

POP dst

 

入栈和出栈指令都有3种格式:

 

(1)CPU通用寄存器人/出栈( PUSH/POP r)

例如: PUSH AX

POP BX

 

(2)段寄存器入/出栈(PUSH /POP SEG)

例如: PUSH CS

POP DS

 

(3)存储器单元人/出栈(PUSH/POP M)

例如: PUSH[BX十 DI]

POP [2000H]

 

PUSH 指令执行时,先将SP-1,再将源操作数的高8位推入堆栈,再将SP-1,再将源操作数的低8位推入堆栈。

 

POP指令执行时,先将(SP)指向的堆栈单元推出至目标操作数的低8位,再将SP+1,再将(SP)指向的堆栈单元推出至目标操作数的高8位,再将SP+1。

 

也就是说,8086的堆栈是向上生长的(向地址低的方向生长)。

 

请点击这里参看堆栈操作示意图

入栈和出栈指令使用时需注意:

 

①堆栈操作指令中,有一个操作数是隐含了的,这个操作数就是(SP)指示的栈顶存储单元。

②8086堆栈操作都是字操作,而不允许对字节操作,因此,若写PUSH AL是错误的。

③CS寄存器可入栈,但不能随意弹出一个数据到CS。

④在使用堆栈操作保存多个寄存器内容和恢复多个寄存器时,要按"先进后出"原则来组织入栈和出栈的顺序。具体来说,就是要注意:要成队使用PUSH与POP指令,即PUSH、POP指令的个数应一

致。

使用PUSH与POP指令的顺序,必须相反。

请看堆栈指令使用的例子

例1 请将当前数据段1000H单元内容送至AH和AL中

解:

MOV AH,[2000H]

MOV AL,AH

例2 请将当前数据段1000H单元内容送至当前数据段2000H单元处

解:

MOV AH,[1000H]

MOV [2000H],AH

 

注: 存储单元送存储单元,必须用某个寄存器过渡。

 

例3 请将当前数据段1000H单元内容与当前数据段2000H单元内容互

解:

MOV AH,[1000H]

MOV AL,[2000H]

MOV [1000H],AL

MOV [2000H],AH 

 

例4 有一主程序调用一子程序,子程序中将用到AX,BX、CX和DX。为了使主程序中这些寄存器内容不被破坏,在进入子程序时应进行入栈保护,子程序执行完后,再出栈恢复原来的数据。子程序中的保护现场和恢复现场的程序段为:

SUBROUT PROC NEAR ;定义过程(即子程序)

PUSHF ;以下保护现场

PUSH AX

PUSH BX

PUSH CX

PUSH DX

. ;(子程序主体)

POP DX ;以下恢复现场

POP CX

POP BX

POP AX

POPF

RET ;返回

SUBROUT ENDP ;过程结束

 

请注意PUSH 指令与POP指令的用法。他们的使用一定是对称的。 这样,调用该子程序前后,堆栈没有变化。

3.交换指令(Exchange)

 

指令格式:XCHG OPR1,OPR2

执行操作:OPR1与OPR2内容互换

 

交换指令可用的寻址方式是内部寄存器之间,或内部寄存器与存储单元之间的内容(字节或字)交换。

例如: XCHG AL,BL ;(AL)与(BL)内容进行交换

XCHG BX,CX ;(BX)与(CX)内容进行交换

XCHG[2200H],DX ;(DX)与(2200H),(2201H)两单元间进行交换。

 

使用时应注意,不可使用的寻址方式组合:

(1)OPR1和OPR2不能同时为存储器操作数;

(2)任一个操作数都不能使用段寄存器,也不能使用立即数。

第三章指令系统

第5章指令系统 一、判断题 (×)1.执行指令时,指令在内存中的地址存放在指令寄存器中。 (√)2.程序计数器PC用来指示从内存中取指令。 (√)3.同一系列的不同型号的计算机,保持软件向上兼容的特点。 (√)4.在计算机的指令系统中,真正必须的指令数是不多的,其余的指令都是为了提高机器速度和便于编程而引入的。 (×)5.RISC的主要目标是减少指令数,因此允许以增加每条指令的功能的办法来减少指令系统所包含的指令数。 二、选择题 1.在计算机的指令系统中采用不同的寻址方式的主要目的是 C 。 A.实现程序控制和快速查找存储器地址 B.可以直接访问主存和外存 C.缩短指令长度,扩大寻址空间,提高编程的灵活性 D.降低指令的译码难度 2.单操作数指令的操作数由 B 提供。 A.指定寄存器或由操作码指定存储单元 B.由地址码指定的存储单元;如果已标明该存储单元的内容为地址,则由该地址所指定的存储单元 C.由操作码直接指定数据 D.由操作码直接指定的存储单元 3.在多地址指令中,算术运算结果不会存储在 A 中。 A.累加器B.第一地址码所指定的存储空间 C.第二地址码所指定的存储空间D.第三地址码所指定的存储空间 4.把存储单元A的内容传送到存储单元B的指令执行后,存储单元A的内容为 B 。A.空白或零,视机器而定B.与存储单元B的内容相同 C.二进制补码D.存储单元A的内容与存储单元B的内容之差 三、填空题 1.指令操作码通常有两种编码格式:固定格式和可变格式。 2.在当前的计算机中,指令的执行方式有3种,就是顺序执行方式,重叠执行方式和流水线方式。 3.数据传送类指令实现的功能是传送数据,它往往是在主存储器和寄存器之间,或寄存器和寄存器之间传送数据。 4.所谓堆栈,是主存中专门用来存放数据的一个特定的区域,它具有先进后出的性质。 5.Intel 8086/8088的字符串操作指令用来处理存放在存储器中的一串字符或数据。6.内存地址寄存器用来指示从内存中取数据。 7.浮点运算指令对于用于科学计算的计算机是很必要的,可以提高机器的运算速度。四、名词解释 1.计算机指令系统:是指一台计算机上全部指令的集合,也称为计算机的指令集。 2.固定格式:操作码的长度是固定的,集中放在指令字的某一个字段中。 3.可变格式:操作码的长度可变,且分散地放在指令字的不同字段中。 4.寻址:就是寻找操作数的地址,最终目的是寻找所需的操作数。 五、简答题

第三章 MCS-51指令系统习题答案

第三章 MCS -51指令系统 5 题 分析下面程序段的执行功能。 CLR A MOV R2, A MOV R7, #4 LOOP: CLR C MOV A, R0 RLC A MOV R0, A MOV A, R1 RLC A MOV R1, A MOV A, R2 RLC A MOV R2, A DJNZ R7, LO OP SJMP $ 答:将R2:R1:R0所表示的24位二进制数左移4位。(相当×16) 6 题 设系统晶振为12MHZ ,阅读下列程序,分析其功能。 START : SETB P1.0 NEXT: MOV 30H, #10 LOOP2: MOV 31H, #0FAH LOOP1: NOP NOP DJNZ 31H, LOOP1 DJNZ 30H, LOOP2 CPL P1.0 AJMP NEXT SJMP $ 答:((2+1+1)*250+2+2)*10+2=10.042(ms) 在P1.0引脚上输出周期为20ms 的方波。 7 题 阅读下列程序,分析其功能。 MOV R7, #10 MOV A, #30H MOV DPTR, #2000H LOOP : MOVX @DPTR, A INC A INC DPL DJNZ R7, LOOP SJMP $ R2 R1 R0 0 0 0 0

答:在外部数据存储器中的以下地址内存放数据: (2000H)=30H (2001H)=31H (2002H)=32H ┇┇ (2009H)=39H 8 题简述下列程序段完成的功能,程序完成后SP指针应指向哪里? MOV SP, #2FH MOV DPTR, #2000H MOV R7, #50H NEXT: MOVX A, @DPTR PUSH A INC DPL DJNZ R7, NEXT SJMP $ 答:以内部存储器地址30H作为栈底,从30H开始一直到7FH依次存放外部数据存储器中2000H一直到204FH地址中的数据。7FH作为栈顶。程序完成后SP=7FH。 9 题分析下列程序段执行结果,程序执行完后,SP指向哪里? MOV SP, #3FH MOV R0, #40H MOV R7, #10H NEXT: POP A MOV @R0, A DEC R0 DJNZ R7, NEXT SJMP $ 答:将栈中3FH,3EH一直到30H地址中的内容依次放入40H,3FH,…,31H单元中。执行完后SP=2FH。 10 题分析下列程序段执行结果。 XCH A, 30H MOV B, A ANL A, #0FH MOV 33H, A MOV A, B SW AP A ANL A, #15 MOV 34H, A SJMP $ 答:将30H单元中的数的高四位放入34H中,低四位放入33H中。

(完整版)第三章指令系统

第三章指令系统习题参考答案(三) 1、80C51系列单片机的指令系统有何特点? 答:80c51的指令系统的特点有:(1)执行时间短。一个机器周期指令有64条,2个时间周期指令有45条,而4个机器周期指令仅有2条(即乘法和除法指令);(2)指令编码字节少。单字节的指令有49条,双字节的指令有45条,三字节的指令仅有17条;(3)位操作指令丰富。这是80c51单片机面向控制特点的重要保证。 2、80C51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器 空间如何? 答:(1)寄存器寻址。 对应的寄存器有: ·工作寄存器R0~R7 ·累加器A ·寄存器B ·数据指针DPTR (2)直接寻址。 对应的存储空间有: ·片内RAM低128字节(以地址形式表示) ·SFR(以地址形式或SFR符号形式表示,但符号将转换为相应的SFR 地址) (3)寄存器间接寻址。 对应的空间有: ·片内RAM(采用@R0,@R1或SP); ·片外RAM(采用@R0,@R1或@DPTR) (4)变址寻址。 对应的空间有: ·ROM空间(采用@A+DPTR,@A+PC) (5)相对寻址。 ·ROM空间(采用JC rel) (6)位寻址。 ·片内RAM的20H~2FH单元的128可寻址位 ·SFR的可寻址位 3、访问特殊功寄存器SFR可以采用哪些寻址方式? 答:直接寻址、位寻址 4、访问内部RAM单元可以采用哪些寻址方式? 答:寄存器寻址、直接寻址、寄存器间接寻址 5、访问外部RAM单元可以采用哪些寻址方式? 答:寄存器间接寻址 6、访问外部程序存储器可以采用哪些寻址方式? 答:立即寻址、变址寻址、相对寻址 7、为什么说布尔处理功能是80C51单片机的重要特点? 答:布尔处理功能是MCS-51系列单片机的一个重要特征,在物理结构

第三章 80868088的指令系统

3.1 指令的基本格式   一、指令构成 微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成: l.操作码(OP-Code)字段 该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。 2.操作数(Oprand)字段 该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。 指令的基本格式如下:   二、8086   8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。   (1)B1字节各字段定义如下: OP--指令操作码。 D--表示方向。D=1寄存器为目的,D=0寄存器为源。 W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。

(2)B2字节各字段定义如下: MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量; MOD01,只有低8位位移量,需将符号扩展8位,形成16位; MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。 REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。 R/M--R/M受MOD制约。当 MOD=11(即寄存器方式时),由此字段给出指令中第二个操作数所在的寄存器编码;当MOD≠11时,此字段用来指出应如何计算指令中使用的存储器操作数的有效地址。MOD和R /M字段表示的有效地址 EA计算方法如表3-1所示,共2 4种。   (3) B3~B6字节这四个字节一般是给出存储器操作数地址的位移量(即偏移量)和/或立即操作数。位移量可为8位,也可为16位,这由MOD来决定。8086规定16位的字位移量的低位字节放于低地址单元,高位字节放于高地址单元。 若指令中只有8位位移量, 8086在计算有效地址时,自动用符号将其扩展成一个16位的双字节数,以保证有效地址的计算不产生错误,实现正确的寻址。指令中的立即操作数位于位移量的后面。若B3,B4有位移量,立即操作数就位于B5,B6。若指令中无位移量,立即操作数就位于B3,B4字节。总之,指令中缺少的项将由后面存在的项向前顶替,以减少指令长度。 3.2 8086的寻址方式   8086的操作数可隐含在操作码中,也可以是操作数字段中的操作数本身,还可以是存放操作数的地址,如寄存器,I/0端口及存储器。对存储器,给出的或是存储器地址,或是产生存储器地址的信息。从表3

第3章答案指令系统1-40..

第3章指令系统 1,简述下列基本概念:指令,指令系统,机器语言,汇编语言,高级语言。1、指令:CPU根据人的意图来执行某种操作的命令 指令系统:一台计算机所能执行的全部指令集合 机器语言:用二进制编码表示,计算机能直接识别和执行的语言 汇编语言:用助记符、符号和数字来表示指令的程序语言 高级语言:独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言 2,什么是计算机的指令和指令系统? 2、见第1题。 3,简述89C51汇编指令格式。 3、操作码[目的操作数] [,源操作数] 4,简述89C51寻址方式和所能涉及的寻址空间。 5,要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式? 5、SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址 6,在89C51片内RAM中,已知(30H)=38H, (38H)=40H, (40H)=48H, (48H)=90H, 请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。 6、MOV A,40H ;直接寻址(40H)→A MOV R0,A ;寄存器寻址(A)→R0 MOV P1,#0F0H ;立即数寻址0F0→P1

MOV @R0,30H ;直接寻址(30H)→(R0) MOV DPTR,#3848H ;立即数寻址3848H→DPTR MOV 40H,38H ;直接寻址(38H)→40H MOV R0,30H ;直接寻址(30H)→R0 MOV P0,R0 ;寄存器寻址(R0 )→P0 MOV 18H,#30H ;立即数寻址30H→18H MOV A,@R0 ;寄存器间接寻址((R0)) →A MOV P2,P1 ;直接寻址(P1)→P2 最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H 注意:→左边是内容,右边是单元 7,对89C51片内RAM的高128字节的地址空间寻址要注意什么 7、用直接寻址,位寻址,寄存器寻址 8,指出下列指令的本质区别。 8,MOV A,DATA ;直接寻址2字节1周期 MOV A,#DATA ;立即数寻址2字节1周期 MOV DATA1,DATA2 ;直接寻址3字节2周期 MOV 74H,#78H ;立即数寻址3字节2周期 如果想查某一指令的机器码,字节数或周期数可查阅书本后面的附录A 9,设R0内容为32H, A的内容为48H, 片内RAM的32H单元内容为80H, 40H单元内容为08H, 请指出在执行下列程序段后上述各单元内容的变化。 9、 MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80→40H MOV R0,#35H ;35H→R0 最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H 10,如何访问SFR,可使用哪些寻址方式? 10、用直接寻址,位寻址,寄存器寻址 11,如何访问片外RAM,可使用哪些寻址方式? 11、只能采用寄存器间接寻址(用MOVX指令) 12,如何访问片内RAM,可使用哪些寻址方式? 12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7) 高128字节:直接寻址,位寻址,寄存器寻址 13,如何访问片内外程序存储器,可使用哪些寻址方式? 13、采用变址寻址(用MOVC指令)

第三章计算机硬件体系结构报告

第三章计算机硬件体系结构 一、填空题 1.地址总线的位数决定了计算机的能力,数据总线的宽度决定了计算机的。2.计算机的运算速度用每秒钟所能执行的______数表示,单位是______。 3.按照总线上传送信息类型的不同,可将总线分为___________、___________、__________三种。 4.在计算机中通常以___________作为单位传送信息的。 5.指令一般包括___________和___________两部分。 6.若一台微机的地址总线位长为32位,则其最大寻址空间为___________。 7.CPU包括________、__________和_______________三个基本部分。 8. 光盘按读写性能可分为___________、___________、__________三种。 二、单项选择题 1. 一个完整的微型计算机硬件系统应由____、存储器、输入设备和输出设备构成。 A. 硬盘 B. ROM和RAM C. CPU D. 显示器 2. 计算机中指令的执行主要由___完成的。 A. 存储器 B. 控制器 C. CPU D. 总线 3. 微型计算机的CPU主要由两部分构成,它们是____。 A. 内存和控制器 B. 内存和外存 C. 运算器和控制器 D. 外存和运算器 4. 磁盘经过高级格式化后,其表面形成多个不同半径的同心圆,这些同心圆称为____。 A. 磁道 B. 扇区 C. 族 D. 磁面 5. 下面有关计算机的叙述中,是正确的。 A. 计算机的主机包括CPU、内存储器和硬盘三部分 B. 计算机程序必须装载到内存中才能执行 C. 计算机必须具有硬盘才能工作 D. 计算机键盘上字母键的排列方式是随机的 6. 计算机的内存储器比辅助存储器_______。 A. 存储更多信息,但存取速度慢 B. 可以存储的信息少,但存取速度快 C. 存储更多信息,且存取速度快 D. 可以存储的信息少,且存取速度慢 7. 计算机的输入输出设备中,处理速度最快的是_____。 A. 软盘 B. 键盘 C. 打印机 D. 硬盘 8. 在计算机中指令主要存放在中。 A. CPU B. 内存 C. 键盘 D. 磁盘 9. 下列有关存储器读写速度的排列,正确的是。 A. RAM>Cache>硬盘>软盘 B. Cache>RAM>硬盘>软盘 C. Cache>硬盘>RAM>软盘 D. RAM>硬盘>软盘>Cache 10. CPU中的可存放少量数据。 A. 存储器 B. 辅助存储器 C. 寄存器 D. 只读存储器

第三章 80868088的指令系统

3.1 指令的基本格式 一、指令构成 微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成: l.操作码(OP-Code)字段 该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。 2.操作数(Oprand)字段 该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。 指令的基本格式如下: 二、8086 8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。 表3-1 8086指令格式 (1)B1字节各字段定义如下: OP--指令操作码。 D--表示方向。D=1寄存器为目的,D=0寄存器为源。 W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。 (2)B2字节各字段定义如下: MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量;MOD01,只有低8位位移量,需将符号扩展8位,形成16位;MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。 REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。

第三章指令系统及寻址方式

第三章指令系统及寻址方式 一、教学内容 1.指令格式 2.指令寻址方式 3.指令系统 二、要求掌握指令的书写格式、指令的寻址方式和每一条指令的作用。 三、重点掌握指令的寻址方式和每一条指令的功能作用。 四、难点在于理解和掌握指令的寻址方式,怎样找到操作数所在存储单元的存放地址以及运用指令编程的技巧等。 五、本章分为4讲,每讲2学时。 第一讲指令寻址方式 1.指令的书写格式 指令有两种书写格式: ?机器指令:由一串二进制数描述 ?符号指令:用英文字母缩写词描述。符号指令的书写格式如下: 标号:操作助记符 [目的操作数][,源操作数];注释 几点说明: 1)标号—表示某一条指令所在存储单元的首址。标号应由字母打头,后跟字母、数字及特殊字符均可,但不能用关键字。 标号的用法: ①标号一般放在子程序(子过程)的第一条指令的开头; ②标号一般放在转移指令要转去的目的地的第一条指令的开头。 ③标号一般放在其他符号定义的前面。 2)指令助记符(操作助记符):MOV;ADD;SUB;END。 3)操作数—有源操作数和目的操作数,他们之间用“,” 分隔。操作数也可有可无。 2.数据寻址方式 一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。

1)立即寻址 操作数直接包含在代码段的指令中。 如: MOV EAX,H MOV BX,6688H MOV AX,1234H ?立即数只能作为源操作数 ?立即寻址主要用来给通用寄存器或存储器赋值 ?不允许给段寄存器直接赋值 2)寄存器寻址 操作数在寄存器中。 32位寄存器:EAX、EBX、ECX、EDX、 ESP、EBP、 ESI、EDI 16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、 CH、CL、DH、DL 如: MOV AX,BX MOV EDI,ESI MOV AL,CL 3)存储器寻址 操作数在存储器中,其地址由指令以某种方式指出。 ① 16位指令模式下的存储器寻址 16位指令模式寻址结构由4部分组成:段基址×10H+基址+变址+偏移量基址:BX、BP ,变址:SI、DI ,偏移量:8位或16位 如果有效地址在BX,SI或DI中,则以DS寄存器内容为段基址; 如果有效地址在BP中,则以SS段寄存器的内容为段基址。 如果使用段超越(CS:ES:DS:SS:),前缀操作数可以放在冒号前指定的段。例如:MOV ES:[DI],AL MOV ES:2000H, AL

相关文档
最新文档