微机原理(第三版)第三章_第1页
微机原理(第三版)第三章_第2页
微机原理(第三版)第三章_第3页
微机原理(第三版)第三章_第4页
微机原理(第三版)第三章_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第3章8086/8088指令系统3.1概述1.指令的一般格式 操作码(OperationCode)操作数(Operand)源操作数(SourceOperand)目的操作数(DestinationOperand)何种操作存放运算数据或结果的地址参加运算的数据或数据的地址2立即数——直接在指令中出现,只能做为源操作数寻址(Addressing):取得操作数的途径

2.操作数的类型寄存器操作数——寄存器做为操作数存储器操作数——指令含直接或间接的地址信息,可能默认使用若干地址寄存器where?33.指令的分类(1)数据传送类;(2)算术运算类;(3)逻辑运算和移位;(4)串操作;(5)控制转移类;(6)处理器控制。每个指令类具有多种格式,如运算有+-×÷…每个格式中的操作数具有多个寻址方式8086可以组合出千余种具体的指令4在8086指令系统中,说明操作数所在地址的寻址方式可分为8种:

①立即寻址⑤寄存器相对寻址②直接寻址⑥基址-变址寻址③寄存器寻址⑦相对的基址-变址寻址④寄存器间接寻址⑧隐含寻址3.28086的寻址方式

51.立即寻址ImmediateAddressingMOV AX,1234H操作码低8位代码段高8位立即数注意:1)立即数只可以作源操作数.2)立即数的类型与目的操作数相同MOV BL,25562.直接寻址DirectAddressingMOV AX,[1000h]1)地址用方括号标识,以区别于立即数;指令码直接地址默认段寄存器+EAPAMemory2)有效地址(EA,EffectiveAddress);3)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀;4)偏移地址也可用符号地址来表示,如BUFFER73.寄存器寻址RegisterMOV AX,1234HMOV BL,255MOV AH,AL寄存器操作数,寻址速度快指令码寄存器编码Datum寄存器84.寄存器间接寻址RegisterIndirectADD AX,[BX]MOV DX,[SI]MOV [DI],AL指令码寄存器编码默认段寄存器+EAPA地址信息寄存器Memory只有寄存器BX,BP,SI,DI可以作为间接寻址的寄存器;其中BP对应的是SS,其它对应DS95.寄存器相对寻址RegisterRelativeMOV [BX][1000H],DX指令码寄存器编码默认段寄存器+EAPA地址信息寄存器偏移地址+MemoryMOV AX,[BP+8]堆栈段106.基址-变址寻址BasedIndexedADDcx,[bx][di]基址寄存器:BX,BP变址寄存器:DI,DI指令码基址寄存器编码默认段寄存器+EAPA基址信息基址寄存器变址寄存器编码+变址信息变址寄存器Memory117.基址-变址相对寻址

RelativeBasedIndexedMovax,[bx][si][2000h]指令码基址寄存器编码默认段寄存器+EAPA基址信息基址寄存器变址寄存器编码+变址信息Memory偏移地址码变址寄存器12课堂练习:1.判断下列指令操作数属于哪种寻址方式.MOVAX,DS:[BP][DI]MOV AL,‘A’MOVCX,TABLE[SI];TABLE为字符常数MOV[3F00H],AXMOVAX,[BX][BP]MOVES:AX,DXMOVAX,[DX]2.下列指令格式正确吗?课堂练习:已知8086中一些寄存器的内容和一些存储单元的内容如图,试指出下列指令执行后,AX中的内容?12H34H56H78H…2AH4CHB7H65H30100H30101H30102H30103H31200H31201H31202H31203H0100H0002H3000HBXSIDS1)MOVAX,[1200H]2)MOVAX,[BX][SI]3)MOVAX,1100H[BX]4)MOVAX,1100H[BX+SI]143.38086/8088指令系统学习和应用指令需要关注的问题:指令的功能类别,具体格式,寻址方式限制执行时间,指令的字节数(时空)指令执行对F寄存器的影响是否影响堆栈是否需要特定的寄存器实现配合

153.3.1数据传送指令

细分,如下四种:通用传送(*)目标地址传送标志传送输入输出(*)立即数寄存器存储器I/O16(1)MOVdest,src;dest←src可实现:1.通用传送指令寄存器之间传送(除CS和IP)

例:MOV CL,DLMOVDS,AXMOV AX,BXMOVAX,ES寄存器(除CS、IP)与存储器之间传送

例:MOVAX,[SI]MOV[1000H],ALMOVDS,DATA[SI+BX]MOVDEST[BP+DI],ES17MOV指令使用规则:

1、源操作数与目的操作数类型要一致。2、不能在两个存储单元之间直接传送。 MOV[1000H],[2000H] (某些单片机内部RAM可以)3、立即数不能送段寄存器。MOVDS,300H3、段寄存器之间不能传送。MOVDS,ES5、CS、IP不能做目的操作数。MOVCS,AX6、立即数不允许作为目的操作数

原则:逻辑上合理,有必要,使用频率高,效率高

立即数送通用REG或存储器例:MOVCL,4 MOVAX,03FFHMOVBYTEPTR[BX],5MOVWORDPTR[100H],5678H18几个不能直接传送的解决办法:(用AX等寄存器作桥梁)

存储器←存储器:

MOVAX,[1000H] MOV[2000H],AX

段寄存器←段寄存器:

MOVAX,DS MOVES,AX

段寄存器←立即数:

MOVAX,DATA MOVDS,AX19例:指出下列指令的错误:

MOV [BX],[DI] MOV AH,CX MOV AX,[SI][DI] MOV CS,0 MOV DS,100; MOV [1000H],23H MOV IP,2000H; MOV AX,[0100H+BX+BP]20练习:已知ES=3000H,DS=2000H,BX=5006H,SI=2008H,指令MOVAX,[BX][SI]中,源操作数的寻址方式是

,相应的物理地址是

。21MOVSI,OFFSETMEM1MOVDI,OFFESTMEM2MOVCX,200NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZNEXTHLTMEM1,MEM2是符号地址(变量)先定义后使用。在这是字节传送,定义为字节变量应用举例:把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域中。200MEM1MEM2…...…...22SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。2堆栈操作指令堆栈LIFO方式工作、被分配的连续存储区域;8086的堆栈以字为单位进行压入/弹出操作。栈底低地址高地址SPSS堆栈段进栈方向退栈方向栈顶23

①压栈指令格式:PUSHsrc;源操作数可为REG、M,目的隐含SP例:PUSHAX,设(AX)=1020H(SS)=1050H,(SP)=0004H操作:

[(SP)-1]←高字节AH,

[(SP)-2]←低字节AL(SP)←(SP)-2进栈方向执行后10500H10501H10502H10503H10504H栈基址1020栈顶执行前栈基址栈顶栈底AX102010500H10501H10502H10503H10504H24

弹出指令格式:POPdest

;目的操作数可为REG、M例:POPBX,设(SS)=1050H,(SP)=0002H操作:(BL)←[SP]

(BH)←[SP+1]

(SP)←(SP)+21020执行前栈基址栈顶栈底1020BX10500H10501H10502H10503H10504H执行后10500H10501H10502H10503H10504H栈基址栈顶出栈方向258086堆栈指令使用时应注意几点:①堆栈操作总是按字进行②不能从栈顶弹出一个字给CS③堆栈指针为SS:SP,SP永远指向栈顶④入栈时SP先自动-2,出栈后SP自动增量+226课堂练习:已知(SS)=0A2F0H,(SP)=00C0H,(AX)=8B31H,(CX)=0F213H,执行指令

PUSHAXPUSHCXPOPAX(SP)=?(AX)=?27格式:XCHGdest,src;交换两操作数的内容通用REG通用REG要求:MM

两操作数中必须有一个在寄存器中;操作数不能为段寄存器和立即数;源和目地操作数类型要一致。举例:XCHG AX,BXXCHG [2000],CL

XCHGAL,BL(3)交换指令XCHG28(4)查表指令XLAT

执行的操作:AL←[(BX)+(AL)]又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到BX中,表项序号存于AL中。

29303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’十六进制数ASCII码表存储器例如:内存数据段有一张16进制数的ASCII码表,ASCII表在DS段,并假设(DS)=4000H。设表首地址偏移量是2000H,如欲查出表中第11个代码(代码序号从0开始)即十六进制数B的ASCII码。30则可用如下几条指令实现:MOVBX,2000H

;(BX)←表首地址MOVAL,0BH

;(AL)←序号XALT

;查表转换执行后得到:(AL)=42H=’B’注意:转换表长度最大为256个表项(字节)。31(3)字节/字扩展格式:CBW;combinebytetowordCWD;combinewordtodoublewordCBW隐含的源操作数AL;结果存AXCWD隐含的源操作数AX;结果存DX322.输入输出(I/O)指令功能:CPU访问I/O端口只用累加器AL或AX来传送信息。外设外设I/OI/OCPU(1)输入指令格式:INacc,PORT;PORT端口号0~255

例:1)INAL,80H;(AL)←(80H端口)

2)

INAX,80H;(AH)←(81H端口);(AL)←(80H端口)3)MOVDX,03B0HINAL,DX;(AL)←((DX))INacc,DX;DX表示的端口范围达64K33例:OUT68H,AX;(69H,68H)←(AX)(2)输出指令OUT

格式:OUTport,acc或OUTDX,accMOVDX,220HOUTDX,AL;((DX))←(AL)34例:已知(AX)=8060H,(DX)=03F8H,端口PORT1的地址是48H,内容是40H,请指出下列指令执行的结果.1)OUTDX,AL2)INAL,PORT1353.3.2算术运算指令指令本身并不区分无符号数和带符号数:无符号数可用CF标志判断是否溢出;带符号数可用OF标志判断是否溢出;带符号数的溢出是一种出错状态,在运算过程中应当避免。无符号数的溢出可看作是向更高位的进位。361)不带进位的加法指令

ADDdest,src

;destdest+src1.加法指令src:n,通用REG,M三种寻址方式

dest:通用REG,M两种寻址方式实例:ADDCL,10;

ADDSI,[BX+20H];

ADD[DI],200H;37例:MOVAL,7EHADDAL,5BH对标志位的影响:CF=0,AF=1OF=1,PF=0SF=1ZF=038实例:

ADCAX,BX;

ADC[BX+200H],CL;2)带进位的加法指令

ADCdest,src

;destdest+src+CF3)加1指令

INCdest

;dest+1dest(不影响

CF,常用循环指令中修改指针或循环次数)39例:已知数据如图,低位在前,高位在后.1)将其看作两个4字节(双倍精度字)的无符号数相加:

28164148H+84522258=?结果存放在SUM开始的存储区。ADC指令用于多字节加法运算中

程序段如下:MOVAX,NUM1MOVBX,NUM2ADDAX,BX;低字相加MOVSUM,AXMOVAX,NUM1+2MOVBX,NUM2+2ADCAX,BX;高字相加

;包括低字的进位MOVSUM+2,AX数据段16H28H58H22H48H41H52H84H被加数加数NUM1NUM2SUM40MOVCX,4LEASI,NUM1LEADI,NUM2LEABX,SUM字节运算:AGAIN:MOVAL,[SI]ADCAL,[DI]MOV[BX],ALCLCINCSIINCDIINCBXLOOPAGAIN41思考题:

2)将其看作从NUM1单元开始的连续8个字节

数据相加,和为16位数,放在SUM和SUM+1单元中.42(1)不考虑借位的减法指令SUB

SUBdest,src

;dest←(dest)-(src)2.减法指令(2)考虑借位的减法指令SBB(主要用于多字节的减法)

SBBdest,src

;dest←(dest)-(src)-(CF)(3)减1指令DEC

DECdest

;dest←(dest)-1,不影响CF例:

SUBAL,60H;SUB[BX+20H],DXSBBAX,CX;SBBWORDPTR[SI],2080HDECCL;DECBYTEPTR[DI+2]43(4)求补指令NEG:

NEGopr

;opr←0-(opr)对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。(5)比较指令CMP

CMPdest,src

;(dest)-(src)CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。例:CMPAL,0AH;

CMPDI,[BX+03]44根据标志位来判断比较的结果②比较的是两个有符号数,须考虑两个数是同号或异号。1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若两个数不相等,则分两种情况考虑:①比较的是两个无符号数

若CF=0,则dest>src;

若CF=1,则dest<src。若OF⊕SF=0,则dest>src;若OF⊕SF=1,则dest<src。但这样来使用标志位太繁琐,所以8086指令系统中的条件转移指令自动确定应该用哪些标志判断。45例:在内存中从DATA单元开始两个8位数,试比较大小,将大者送到MAX单元。MOVAL,DATACMPAL,DATA+1若是带符号数JG大于转移JNCDONE;判断CF分支,或用JA指令

MOVAL,DATA+1DONE:MOVMAX,AL46进行乘法时:8位*8位→16位乘积,16位*16位→32位乘积隐含的操作数为AX,DX3.乘法指令(1)无符号数的乘法指令

MULsrc;字节操作数(AX)(AL)×(src)

;字操作数(DX,AX)(AX)×(src)(2)有符号数乘法指令

IMULsrc;要求两操作数均为有符号数例: MUL BL;(AL)×(BL),乘积在AX中

MUL CX;(AX)×(CX),乘积在DX,AX中

IMULBL;(AX)←(AL)×(BL) MUL BYTEPTR[BX]474.除法指令进行除法时:16位/8位→8位商 32位/16位→16位商隐含的操作数为AX,DX(1) 无符号数除法指令

DIVsrc;字节操作(AX)/(SRC),;(AL)商,(AH)余数;字操作(DX,AX)/(SRC),;(AX)商,(DX)

余数

(2)有符号数除法指令

IDIVsrc例:DIV WORDPTR[BX]DIVCL485.BCD码运算的十进制调整指令压缩BCD码指令:DAA(加法调整)、DAS(减法调整)非压缩BCD码指令:AAA(加法调整)、AAS(减法调整)

AAM(乘法调整)、AAD(除法调整)1、这类指令都是无操作数指令,隐含的源操作数是AL/AX,目的是AL/AX。2、先执行二进制运算指令如ADD、SUB、MUL等(除法除外),并将结果放AL(AX),然后紧接着执行BCD码指令。49指令操作(调整方法):若AL的低4位>9∨AF=1则(AL)←(AL)+6,AF←1若AL的高4位>9∨CF=1则(AL)←(AL)+60H,CF←10110100068+010110015911000001+01100110+66

100100111压缩BCD码加法调整DAA例:压缩BCD码68H+59H=?MOVAL,68HMOVBL,59HADDAL,BLDAA最后结果为:

(AL)=27H,CF=1,AF=150例:已知数据如图,从NUM1和NUM2开始的压缩BCD码相加,和放在SUM和SUM+1单元中.MOVCX,4LEASI,NUM1LEADI,NUM2LEABX,SUMCLCAGAIN:MOVAL,[SI]ADCAL,[DI]

DAAMOV[BX],ALINCSIINCDIINCBXLOOPAGAIN数据段16H28H58H22H48H41H52H84H被加数加数NUM1NUM2SUM513.3.3逻辑运算和位移指令逻辑运算指令●运算规则:按位操作,无进/借位●对标志位的影响(除NOT指令外):

CFOFSFZFPFAF00***无定义

根据运算结果设置ANDDEST,SRC

;“与”两位都是1,结果为1,否则为0,用于屏蔽。52例1:保留AL中低4位,高4位清0。例3:测试AL的bit7,bit5,bit2是否都是1。

ANDAL,0FH例2:AL中有字符’a’~’z’,将其转换成大写。ANDAL,01011111BAND AL,10100100B CMP AL,10100100B JZ MATCHNOTMATCH:

… JMP CONTINUEMATCH:

…CONTINUE: 53ORDEST,SRC ;

“或”两位都是0,结果为0, ;否则为1。用于置位。例1:把AL中的非压缩BCD码变成相应十进制数的ASCII码。例1:把AX寄存器清零ORAL,30H例2:把AL的第5位置为1ORAL,00100000BXORDEST,SRC;

“异或”,两位相同为0,两位不

;同为1。指定位取反或自身清0例2:把DH的bit4,3变反XORDH,18H①MOVAX,0②XORAX,AX③ANDAX,0④SUBAX,AX54NOTDEST ;按位取反。

测试指令TEST;操作与AND指令类似,但不将”与”的结果送回,只影响标志位。常用于位测试,与条件转移指令一起用。例:测试AL的内容是否为负数。

TESTAL,80H;检查AL中D7=1?

JNZMINUS;是1(负数),转MINUS

;否则为正数MINUS:552.移位指令(1)非循环移位指令算术左移指令SAL(ShiftArithmeticLeft)算术右移指令SAR(ShiftArithmeticRight)逻辑左移指令SHL(ShiftLeft)逻辑右移指令SHR(ShiftRight)这4条指令的格式相同

SALmem/reg,CL

;移位位数大于1时1

;移位位数等于1时56移位指令执行的操作如下图所示:最低位最高位最低位最高位CF(c)逻辑右移SHR0CF(b)算术右移SAR最低位最高位CF0(a)算术/逻辑左移SAL/SHL57移位1位时,位数1直接写在指令寄存器中;移位位数多于1时,事先用指令将其放在CL寄存器中。例如: MOVCL,4 SHRAL,CL;AL中的内容右移4位影响C,P,S,Z,O标志。58例:把AL中的数x乘10因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下: MOVCL,3 SALAL,1;2x MOVAH,AL SALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10x59循环左移指令ROL

循环右移指令ROR带进位位的循环左移指令RCL

带进位位的循环右移指令RCR(2)循环移位指令60循环移位指令功能示意图最低位(c)RCL最低位(d)RCR最低位最高位CF(a)ROL最高位CF最低位最高位CF(b)ROR最高位CF61循环移位举例:例1:将AL的高4位与低4位互换。MOVCL,4ROLAL,CL例2:一双字,四字节:高字节放DX中,低字节放AX中,若左移一位SALAX,1RCLDX,1例3:可实现对数据的检测:如检测CF中0或1的个数.623.3.5程序控制指令控制转移指令分为转移指令调用和返回指令循环控制指令中断指令63转移指令的实质:改变PC,在8086系列,即(CS:IP)的内容。转移指令分为无条件转移和条件转移。无条件转移的寻址方式较多,转移范围大;条件转移的测试条件丰富,转移范围小。1.转移指令64例:程序片段CODE1 SEGMENT ---

JMPAGAIN

---

JMP fargoonAGAIN: --- ---CODE1 ENDSCODE2 SEGMENT ---goon: --- ---CODE2 ENDS程序片段中,JMPAGAIN,为段内转移,其标号在同一段内;JMPfargoon为段间转移,其的标号在另一个程序段中。标号代表地址,也称为符号地址,可由软件工具将其转化为逻辑地址。(1)无条件转移指令-JMPSEGMENT,ENDS是汇编语言程序中的伪指令(Directives)65

直接转移:直接给出目标地址/相对的位移量间接转移:间接给出目标地址的寻址方式段内转移:目标地址在同一段内,只改变IP段间转移:目标地址不在同一段内,改变CS:IP根据JMP的远近根据目标地址的寻址方式66段内直接短转移JMPSHORTLABLELABLE代表目标地址2字节指令编码:机器码EB8位偏移量eEBe...源地址目标地址e=目标地址-源地址源地址=指令存储地址+2执行时e带符号扩展再加到IP中,于是下一指令周期从目标地址处执行。转移范围?67段内直接转移JMPNEARLABLELABLE代表目标地址3字节指令编码:机器码E916位偏移量eE9e_H...源地址目标地址e_Le=目标地址-源地址源地址=指令存储地址+3执行时e加到IP中,于是下一指令周期从目标地址处执行。转移范围?68段间直接转移JMPFARLABLELABLE是另一段中的符号地址5字节编码机器码EA16位段地址16位偏移量EAoffset_H01seg_LFFseg_HFF...offset_L00FFFF0100CSIP目标地址执行CS:IP被更新为目标地址,于是下一指令周期从目标地址处执行。转移范围?例如LABLE=FFFF:000069段内间接转移JMPOPERANDOPERAND寄存器操作数或存储器操作数,16位目标地址与寻址方式有关例:JMP BX IP(BX)实现转移例:JMP WORDPTR[BX+DI]通过寻址,在存储器中获得一个字,用于更新IP,实现转移70段内间接转移JMPOPERANDOPERAND为存储器操作数,32位按寻址方式在存储器中获得一个双字,低16位用于更新IP,高16位用于更新CS,从而实现转移例:JMP DWORD

PTR[BX]设(DS)=3000H,(BX)=3000H,(33000H)~(33003)依次为0BH,20H,10H,80H试分析转移过程和目标地址解:PA=(DS)*16+(BX)=33000HIP200BH,CS8010H执行后,新的目标地址8010:200BH71(2)条件转移指令JxxlabelXX为测试条件,根据某标志位或几个标志位的组合,决定是否进行转移;形成程序分支(Branch);一律为短转移,转移范围为-128~+127结合无条件转移,可以转移得更远72单个标志做判断条件JCJNCJE/JZJNE/JNZJSJNSJOJNOJPJNPZFSFOFPFJCXZ(CX=0转)CF无符号数条件转移(测试标志CF、ZF)JBJNBJAJNA

判断有符号数的大小(测试SF、OF、ZF)JLJNLJGJNG732.循环控制指令指令格式1:

LOOP

label循环次数先置于CX中;Label标识一个循环的开始地址LOOP指令确定循环继续或结束操作:CX←(CX)-1;若(CX)≠0,则转至label处执行;否则循环结束,执行LOOP后面的指令;相当于DECCX和JNZlabel两条指令label距离本指令-128~+127的范围之内。74指令格式2:LOOPZlabel操作:(CX)-1→CX,(CX)≠0继续循环;但ZF≠1可提前结束循环。指令格式3:LOOPNZlabel操作:(CX)-1→CX,(CX)≠0继续循环,但ZF=1可提前结束循环。循环中的比较指令等,影响ZF标志;例如,在数据块中寻找某个关键字,找到后可以提前结束循环。75例:在以DATA为首地址的内存数据段中,存放有200个16位带符号数,试找出其中最大和最小的符号数,并分别放在MAX和MIN为首的内存单元中。LEASI,DATAMOVCX,200MOVAX,[SI]INCSIINCSIMOVMAX,AXMOVMIN,AXDECCXNEXT:M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论