• 1.53k likes • 1.69k Views
微机原理 第 04 讲. 课 题 8086 的寻址方式( 1 ) 目的任务 ● 理解寻址方式的含义及实质 重点难点 ● 各种寻址方式的区别. 第四章 INTEL 8086/8088 指令系统 4.1 指令格式及寻址方式 4.1.1 8086/8088 的通用指令格式 一条指令的一般格式为: 操作码字段 + 操作数字段。 操作码字段 :指明计算机所要执行的操作(即功 能); 操作数字段 :指出在指令执行过程中所需要的操 作数。. 对有操作数的指令,在执行指令所规定 的操作之前首先要寻找操作数。操作数可放
E N D
微机原理 第04讲 • 课 题 • 8086的寻址方式(1) • 目的任务 • ●理解寻址方式的含义及实质 • 重点难点 • ●各种寻址方式的区别 德 能 日 新
第四章 INTEL 8086/8088指令系统 • 4.1指令格式及寻址方式 • 4.1.1 8086/8088的通用指令格式 • 一条指令的一般格式为: • 操作码字段 + 操作数字段。 • 操作码字段:指明计算机所要执行的操作(即功 • 能); • 操作数字段:指出在指令执行过程中所需要的操 • 作数。 德 能 日 新
对有操作数的指令,在执行指令所规定 • 的操作之前首先要寻找操作数。操作数可放 • 在CPU寄存器中,或内存单元中,或I/O端 • 口内,寻找这些操作数的方式称为寻址方 • 式,即指令中用于说明操作数或操作数所在 • 地址的方法。 德 能 日 新
4.1.2立即寻址(立即数) • 特点:操作数直接存放在指令中,作为指令 • 的一部分存放在代码段里,这种操作数称为 • 立即寻址。操作数可以是各种数制下的数。 • 一般常用于给寄存器或存储单元赋初值 • (即初始化),立即数只能用于源操作数字 • 段,不能用于目的操作数字段 。立即数可是 • 二进制、十进制、十六进制。 (例1) 德 能 日 新
4.1.3寄存器寻址 • 特点:操作数在某寄存器中,存取这类操作 • 数在CPU内部进行,所以执行速度快。 • 存放16位操作数的寄存器有:AX, • BX,CX,DX,BP,SP,SI,DI; • 存放8位操作数的寄存器有: AH,AL, • BH,CH,CL,DH,DL。 • CS、DS、SS、ES---------16位的段寄存器 • (例2) 德 能 日 新
注意:指令指针IP和标志寄存器PSW以及 • 所有标志位的代号CF、ZF、OF等都不能作 • 为寄存器寻址方式的操作数,不允许出现在 • 汇编语言的任何指令中。另外,8088汇编 • 语言还规定,不允许用MOV等具有赋值功 • 能的指令修改CS的值,在8088汇编语言中 • MOV CS, AX不符合语法规则。 德 能 日 新
4.1.4存储器操作数寻址 • 内存型寻址方式是指参与操作的数据 • 在内存中,因此必须指明操作数究竟在内存 • 的什么地方,即指出内存的逻辑地址。存储 • 器是分段管理的,要找到操作数,必须指明 • 操作数所在的段(段基址由段寄存器指明) • 及段内偏移地址(以有效地址EA的形成方 • 式指出)。 德 能 日 新
1.直接寻址方式 • 特点:指令中指接给出操作数在段内的偏移 • 量,段基址隐含给出或用段前缀指明。该寻址 • 方式适用于处理单个变量。 • 一般操作数存放在数据段,故操作数的物 • 理地址为: • 物理地址=(DS)× 16 + EA • =(段基址的寄存器)× 16 + 偏移地址 • (例3) 德 能 日 新
说明: • ※偏移地址(EA)在指令中直接给出。指 • 令中缺省段寄存器说明,段基址在DS段寄存 • 器中;否则在指令中需对段寄存器加以说明。 • 例如:MOV AX,ES:[2300H] • ※可用符号地址代替数值地址,例如: • MOV AX,VALUE ;此时,VALUE 为存放 • 操作数单元的符号地址,即变量名,也可写 • 成:MOV AX,[VALUE];两者等价。 德 能 日 新
2.寄存器间接寻址 • 特点:操作数有效地址在基址寄存器BP、DI • 中,而操作数则在存储器中。它适用于表格 • 处理,执行完一条指令后,只需修改寄存器 • 内容就可取出表格中的下一项元素。 • a.令中的有效地址(EA)存放在BX,SI,DI • 寄存器中,则操作数在数据段中,即操作数 • 的物理地址为: (BX) • 物理地址=16D×(DS)+ (SI) • (DI) 德 能 日 新
b.若有效地址存放在BP寄存器,则操作数在堆栈段b.若有效地址存放在BP寄存器,则操作数在堆栈段 中,即操作数物理地址为: • 物理地址=(SS)16+(BP) • c.可使用段跨越前缀来取得其他段中的数 • 据,如:MOV AX,ES:[BX] • (例4) • 注意:MOV AX,BX; (AX)← (BX)与前 • 面的 MOV AX,[BX]含义不同。 德 能 日 新
3.寄存器相对寻址 • 特点:操作数的有效地址是一个基址寄存器或 • 变址寄存器的内容和指令中指定的8位或16位位 • 移量(即偏移量)之和。适用于表格处理,修 • 改基址或变址寄存器的内容来取得表格中的元 • 素。 德 能 日 新
一般形式: • (BX) • 物理地址=16D×(DS)+(SI)+8/16位位移量 • (DI) • 物理地址=16D×(SS)+(BP)+8/16位位移量 • (例5) 德 能 日 新
4.1.5 I/O端口寻址 • 1.直接端口寻址方式 • 特点:I/O端口地址以8位立即数方式在指令中直接 • 给出. • 例如: IN AL,PORT; • PORT为寻址端口编号,只能在0~255范围之内。 德 能 日 新
2.间接端口寻址方式 • I/O地址超过8位时,应放在DX寄存器中,即 • 通过DX间接寻址,所能寻址的端口编号为0~ • 65535。如 OUT DX,AL,表示将AL的内容输 • 出到由(DX)指出的端口中去。 • 在16位PC机中,仅用A9~A0 十条地址线表 • 示I/O端口,所以DX间接寻址的范围为0~ • 1023(即0~3FFH)。 德 能 日 新
4.2 8086/8088的指令系统 • 目前许多计算机的指令系统包含了几百条指令,十几种寻址方式,这对丰富汇编语言程序设计,提高高级语言的执行效率是有利的。我们称这些计算机为“复杂指令系统计算机:,简称CISC(Complex Instruction Set Computer)。 德 能 日 新
基本指令集是80X86微机不断发展的指令集的一个基本子集,包括8086/8088指令系统的全部指令。IBM PC/XT微型计算机的微处理器采用的是8088芯片,本节将介绍8088/8086微处理器的指令系统。指令系统是指处理器所能完成的所有指令的集合。它是微处理器设计时就确定了的。所以,对于不同的微处理器,其指令系统中所包含的具体指令是各不相同的。由于微处理器8088与8086的指令系统是完全一样的 ,所以,本节介绍的指令系统同样适用于8086CPU。 德 能 日 新
8086/8088CPU指令系统可以分成下列几类: • 数据传送指令; • 算术运算指令; • 逻辑运算和移位指令; • 转移和循环控制指令; • 调用和返回指令; • 字符串操作指令; • 处理器控制指令。 德 能 日 新
学习指令系统着重要掌握指令的基本操作功能,学习指令系统着重要掌握指令的基本操作功能, • 合法的寻址方式以及对标志位的影响。 • 为了便于了解指令的形式和功能,对指令中的操 • 作数符号的约定如下: • OPR:操作数; • DST:在多操作数指令中,表示目标操作数; • SRC:在多操作数指令中,表示源操作数; • SEG:段寄存器; • REG:通用寄存器; • MEM:8位或16位存储器; • DATA:8位或16位立即数。 德 能 日 新
4.2.1 数据传送指令 • 数据传送类指令是计算机中最基本、最常用、最重要的一类操作。这里讨论的数据传送指令仅指CPU中的寄存器与寄存器或者寄存器与存储器之间的数据传送。这类指令的基本格式及功能说明见表4.1。表中除了SAHF和POPF指令之外,标志位寄存器F的各位均不受影响。指令中出现两个操作数时,目的操作数在前,源操作数在后,并且目的操作数的寻址方式一定不能为立即数和段寄存器CS。 德 能 日 新
表4-1数据传送类指令的格式和功能 德 能 日 新
1.通用数据传送指令 • (1)MOV 指令 • 格式: MOV DST, SRC • 操作:(DST)←(SRC),即把源操作 • 数的内容送目的操作数。 • 其中DST代表目的操作数,SRC代表 • 源操作数。 德 能 日 新
说明: • *MOV 指令不允许两个存储器单元传送数据,即DST • 和SRC 不能同时为存储器操作数,DST 目的操作数不 • 允许使用立即寻址方式(目的操作数是数据送往的地 • 点)。 • *如果目的操作数是使用通用寄存器的寄存器寻址方 • 式,则源操作数可以是立即数、寄存器寻址或内存型 • 寻址方式中的任何一种。 • *MOV 指令也不允许在两个段寄存器之间传送数 • 据。(当目的操作数是段寄存器时,源操作数不能是 • 立即数,也不能是另一个段寄存器,只能是通用寄存器 • 或内存型寻址方式。) • *CS不能做目标操作数。 德 能 日 新
*如果两个操作数都有确定的类型,则两者的类型必*如果两个操作数都有确定的类型,则两者的类型必 • 须相同,即要么都是8位的字节型,要么都是16位的字 • 型。 • *如果两个操作数中只有一个可以确定类型,则另一 • 个操作数的类型按可确定类型的一个操作数同型处 • 理;当一个操作数是寄存器,另一操作数是变量,且 • 两者类型不同时,变量可以临时改变类型,保持与寄 • 存器类型一致。 • *如果目的操作数是寄存器间接寻址或者基址变址寻 • 址方式,源操作数是不超过255的立即数,这时两个操 • 作数的类型都不能确定,需要在目的操作数的前面用 • BYTE PTR或者WORD PTR指明操作是字节型还是字 • 型。 • *对标志位无影响。 德 能 日 新
下面的各个例子从汇编语言的语法上讲都是 • 正确的,其中buf是已定义的字节型变量。 • MOV AL,BL MOV AL,’3’ • MOV BX,[BX] MOV DX,3 • MOV CL,[buf+BP] MOV CX,[buf+BP] • MOV AX,WORD PTR [buf] MOV DS,AX • MOV BYTE PTR [BX],3 MOV [buf],3 • MOV WORD RTR [SI],3 MOV DS,[BX][DI] 德 能 日 新
下面的指令是不符合语法规则的: • MOV AL,BX • MOV [BX],[buf] • MOV 3,AL • MOV AX,[DX] • MOV AX,[BL] • MOV DS,CS • MOV CS,DX • MOV AX,IP • MOV BX,WORD PTR AL 德 能 日 新
(2)交换命令 • 格式:XCHG OPR1,OPR2 • 操作:OPR1←→OPR2,即将操作数(OPR1)与 • 操作数(OPR2)进行交换。 • 说明:该指令在使用过程需要注意的几点与MOV指 • 令说明相同。一条交换指令完成的功能相当与三条 • MOV 指令完成的功能。 • MOV CX,AX • XGHG AX,BX;相当于 MOV AX,BX • MOV BX,CX 德 能 日 新
(3)压入堆栈指令 • 格式:PUSH SRC • 操作:(SP)←(SP)-2,((SP)+1), • (SP)←SRC,即SP指针先减2,后按字入 • 栈。注意:堆栈的存取必须以字为单位。堆栈是 • 按“后进先出”的方式工作的一个存储区,只有一 • 个出入口,用一个堆栈指针寄存器SP来指示进 • 出栈操作。SP的工作内容在任何时候都指向当 • 前的栈顶,源操作数SRC除了立即寻址之外的其 • 他存储器操作数寻址方式均可使用。 德 能 日 新
(4)出栈指令 • 格式:POP DST • 操作:(DST)←((SP)+1,(SP)),(SP)←(SP)+2 • 即先出栈,后指针加2,按字取出。目标操作 • 数DST的寻址方式为立即寻址方式之外的所有存 • 储器操作数寻址方式和寄存器寻址方式。 德 能 日 新
(5)有效地址送寄存器指令 • 该指令把存储器操作数的有效地址送到指定的 • 寄存器中。 • 格式: LEA REG,SRC • 操作:(REG)←SRC,即把源操作数(SRC应是 • 存储器操作数)的有效地址送到指定的寄存器中 • (REG)。 • 例1:LEA DX,[BX+SI+0B62H] • 执行前:(BX)=3000H,(SI)=0050H • 执行后:(DX)=3000H+0050H+0B62H=3BA2H(有效地址或偏移地址) • 注意:这里DX 寄存器得到的是偏移地址而不是该存储单元的内容。 德 能 日 新
例2:(SI)=0500H,(BX)=1000H, • (DS)=2000H • DS:0500H单元存放3412H • DS:1000H单元存放00AAH • MOV AX,[SI];(AX)← [SI],(AX)=1234H • LEA AX,[SI]; (AX)← EA, (AX)=0500H • MOV DI,[BX]; (DI)← [BX],(DI)=AA00H • LEA DI,[BX]; (DI)← [BX],[DI]=1000H 德 能 日 新
(6)指针送寄存器和DS指令 • 格式:LDS REG,SRC • 操作:(REG) (SRC),(DS)← (SRC+2),即把源操作数指定的4 个相继字节的内容作为一 • 个地址指针送到由指令指定的寄存器和DS寄存器。 • REG为16位寄存器名。 • 例3:(DS)=9000H,(90012H)=0150H, (90014H)=4000H • 执行:LDS SI,[12H] • 源操作数物理地址=9000H×16d+0012H=90012H, • 即将90012H开始的4个单元内容送到SI 和DS中。 • 执行后:(SI)=0105H,(DS)=4000H, 德 能 日 新
(7)指针送寄存器和ES指令 • 格式:LES REG,SRC • 操作: (REG)← (SRC) • (ES)← (SRC+2) • 把源操作数指定的4个相继字节的内容 • 作为一个地址指针送到由指令指定的寄存器 • REG和ES 中。 德 能 日 新
(8)累加器专用传送指令 • 1>输入指令 • 格式I: IN AL ,PORT ;字节输入 • IN AX ,PORT ;字输入 • 操作:(AL)←(PORT), • (AX)←(PORT),从外设读入数据。 • 格式 II: IN AL, DX ;字节输入 • IN AX, DX ;字输入 • 操作:(AL)←[(DX)](字节), • (AX)←[(DX)+1,(DX)](字) 德 能 日 新
2>输出指令 • 格式I: OUT PORT ,AL ;字节输出 • OUT PORT ,AX ;字输出 • 操作:[PORT] ←(AL)(字节), • [PORT+1,PORT] ←(AX)(字), • 将数据传送给外设。 德 能 日 新
格式II:OUT DX ,AL ;字节输出 • OUT DX ,AX ;字输出 • 操作:[(DX)] ←(AL)(字节),[(DX)+1,(DX)] ←(AX)(字) • IN/OUT 指令有二种格式,选择哪一种,取决于外部设备端口地址的宽度。格式I指令有二个字节,称长格式,格式II只有一个字节,称短格式。 德 能 日 新
3>XLAT 换码指令 • 格式:XLAT OPR 或 XLAT • 操作:(AL)←[(BX)+(AL)],将AL中的当前内容转换为某一种代码。 • 在使用这条指令前,先建立一个字节表格,OPR为表格首地址,应存入BX寄存器中,待转换的代码应放在AL寄存器,该代码是相对于表格首地址的位移量,再根据(BX)+(AL)所求得的地址读取所要的代码,并存入AL 中。该指令常用于查表,根据元素在表格中的位置查表求元素的值。 德 能 日 新
2.标志传送指令 • (1)LAHF指令 • 格式:LAHF • 操作:(AH)←(PSW的低字节),即标志寄存 • 器(PSW)的低字节传送到AH寄存器中。 • (2)SAHF指令 • 格式:SAHF • 操作:(PSW的低字节)←(AH),即将AH 寄 • 存器的内容传送到标志寄存器的低字中。 • 该指令影响状态标志SF、ZF、AF、PF和CF 。 德 能 日 新
(3)PUSHF指令 • 格式:PUSHF • 操作:(SP)←(SP)-2, • [(SP)+1,(SP)]←(PSW),标志寄存器的 • 内容入栈。 • (4)POPF指令 • 格式:POPF • 操作:(PSW)←[(SP)+1,(SP)], • (SP)←(SP)+2,标志寄存器的内容出栈。该 • 指令影响标志寄存器的所有标志位。数据传送指令 • 除了SAHF 和POPF 两条外,执行结果都不影响标 • 志位。 德 能 日 新
4.2.2算术运算类指令 寄存器 通用寄存器 通用寄存器 立即数 立即数 存储器 通用寄存器 ± ± ± ± ± 通用寄存器 存储器 • 算术运算指令大多数为双操作数指令,其中加 ,减运算操作的操作数如图4-1所示。 图4-1 加减运算的操作数 德 能 日 新
1.加法指令 • (1)ADD 加法指令 • 格式: ADD DST, SRC • 操作: (DST)←(DST)+(SRC),完成两个操作数相加,结果传送到目的操作数中。加法运算不改变源操作数的值。 德 能 日 新
在汇编语言中,涉及到有关寄存器中或内 • 存中存放的数据的计算时,不能像高级语言那 • 样写一个简明的表达式就可以了,也没有任何 • 内部函数,而必须一步步写出计算的过程,这 • 是汇编语言程序篇幅很长的一个原因。 德 能 日 新
说明: • *ADD 不允许两个存储器单元内容相加,即 • DST和SRC 不能同时为存储器操作数,DST • 目的操作数不允许使用立即寻址方式。 • *ADD指令也不允许在两个段寄存器之间相 • 加。 • *ADD指令本身并不区分相加的两个数是无 • 符号数还是有符号数,因为相加的结果在存 • 储形式上是一样的。 • *对标志位有影响,主要是CF、 ZF 、OF 、 • SF 标志位。 德 能 日 新
例1:设AX=3AF7H,试确定指令ADD AL,AH执行 • 后AX的值。 • 0F7H+3AH=31H(有进位) • 执行后,AX=3A31H. • ADD指令把两个字节型或字型数据相加,如 • 果最高位向外有进位,在计算加法的结果时会被 • 忽略,但进位情况会在标志位上反映出来;另一 • 方面,AH作为源操作数,其值没有改变,所以指 • 令执行后AX的值是3A31H. 德 能 日 新
(2)ADC带进位加法指令 • 格式:ADC DST,SRC • 操作:(DST)←(DST)+(SRC)+(CF), • 即完成两个操作数及进位(CF)三者相加,结果 • 传送到目的操作数中。 • 说明:与ADD 指令说明相同。 德 能 日 新
例2:(DX)=0002H,(AX)=0E365H, (BX)=0003H,(CX)=0D024H • ADD AX,CX • ADC DX,BX • 第一条指令执行后(AX)=0B389H,SF=1,ZF=0,CF=1,OF=0 • 第二条指令执行后 (DX)=0006H,SH=0,ZF=0,CF=0,OF=0 德 能 日 新
(3)INC 加1指令 • 格式:INC DST • 操作:(DST)←(DST)+1,即操作数加1。 • 说明:DST单操作数不允许使用立即寻址方 • 式。除了CF标志位之外,对其他标志位均有影 • 响。 德 能 日 新
2.减法运算指令 • (1)SUB 减法 • 格式:SUB DST ,SRC • 操作:(DST)←(DST)-(SRC),目的操 • 作数与源操作数相减,差传达到目的操作数中。 德 能 日 新
说明: • SUB指令不允许两个存储器单元内容相减, • 即DST和SRC不能同时为存储器操作数,DST目 • 的操作数不允许使用立即寻址方式。 • SUB指令也不允许在两个段寄存器之间相 • 减。对标志位有影响,主要是CF、ZF、OF、 • SF标志位。 德 能 日 新
例3:设AX=3AF7H,试确定指令SUB AH,AL • 执行后AX的值。 • 3AH-0F7H=43H • 运算中有借位,执行后,AX=43F7H。如 • 果把操作数当无符号数,相当于58-47=67。 • 这个结果显然与正确值是有偏差的,产生这 • 一现象的原因是,作为无符号数58减247本就 • 不够减,这一现象会在标志位上有所反映。 • 如果把操作数当成有符号数,相当于 • (+58)-(-9)=(+67)。 德 能 日 新