微机原理与应用:第3章 80X86指令系统_第1页
微机原理与应用:第3章 80X86指令系统_第2页
微机原理与应用:第3章 80X86指令系统_第3页
微机原理与应用:第3章 80X86指令系统_第4页
微机原理与应用:第3章 80X86指令系统_第5页
已阅读5页,还剩175页未读 继续免费阅读

下载本文档

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

文档简介

概述3.18X86/Pentium指令格式及寻址方式3.28086/8088指令系统3.380X86指令系统(略)注:重点掌握3.1节的寻址方式和3.2的指令系统3.1节的指令格式一般了解索引第三章80X86/Pentium指令系统2022/12/232参考教材《从8086到pentiumⅢ微型计算机及接口技术》

——马维华科学技术出版社2000《80X86/pentium》微型计算机原理及应用》

——吴宁电子工业出版社2000《80X86微型计算机原理及应用》

——易仲芳电子工业出版社1995《宏汇编语言程序设计及应用》

——傅德胜东南大学出版社1999《汇编语言程序设计》

——奚抗生航空工业出版社1994《

80386/486系统编程实践》

——吕晓庆浙江大学出版社1993《IBM-PC汇编语言程序设计》

——沈美明温冬婵清华大学出版社19912022/12/233概述指令:由操作码(OP)和操作数构成。指令系统:CPU所能执行的各种指令的集合。操作码:规定了指令的性质。

如数据传送,加减乘除等。操作数:参加运算的数或存放数据的地址单元。

参加运算的数分为8位、16位以及32位,存放在寄存器或存贮器中。

存放数据的地址单元需要20位(24位或32位)。因此,指令用什么方式来寻找操作数,是计算机设计中一个重要问题,影响到CPU的运行速度和效率。2022/12/234§3.18X86/Pentium指令格式及寻址方式3.1.180X86/Pentium指令格式3.1.2指令系统的寻址方式

◆寻址方式—寻找操作数的方法

◆有效地址—EA段内偏移量

◆寻址方式举例

◆转移地址寻址2022/12/23580X86/Pentium系列CPU采用变字节的指令格式,由1~6个字节构成一条指令(如图3-1)一条指令可分为6个字段:字段1

是附加字段,字段2-6是基本字段。1

Prefix前缀字段:定义或修改指令的属性。(1-4字节)如段超越、重复操作、总线锁定等。2

opcode操作码字段:规定指令的性质,指明指令的操作。(1-2字节)这是必不可少的字段。3.1.1指令格式2022/12/2363.1.1指令格式3

Modr/m和s-i-b寻址方式字段:规定寄存器/存储器操作数的寻址方式(1+1字节)。4

disp位移量字段:段内位移量的大小(0,1,2,4字节组成)。5

data立即数字段:指明立即数的大小。可为0,1,2,4字节。2022/12/237注:⑴一条指令中可以包含一个操作数,也可有一个以上的操作数,操作数越长,字节越多,占用空间越大,执行时间越长。⑵只涉及一个操作数的指令称为单操作数指令。其操作数可由本身提供,也可由指令隐含指出;对二个操作数的双操作数指令,至少有一个操作数必须由寄存器指出(因为80X86的M及I/O空间较大,直接指出一个内存单元或一个I/O端口需要较多的位数,而用寄存器编号,则用很少的位数即可)。2022/12/238⑶对16位偏移量,在指令代码中或存储器存放中,低字节在前;高字节在后。⑷大部分指令的操作码为一个字节。也有的指令为一个字节,不仅包括操作码,还隐含寄存器,形成单字节指令。这类指令字节数最少,执行速度最快,使用也最频繁。注:2022/12/2393.1.2指令系统的寻址方式一.寻址方式——寻找操作数的方法操作数的存放位置有三种可能:1.操作数包括在指令中:指令中操作数部分就是操作数本身。(操作数存放在代码段中)此时,操作数也称为立即数。2.操作数包含在CPU的某个寄存器中:某个寄存器的编码指明操作数(操作数在CPU中)。3.操作数存放在内存中:操作数部分指明此操作数的存放地址(操作数在存储器中)。2022/12/2310二.有效地址——EA段内偏移量由于逻辑地址由段基值和段内偏移量构成(8086、8088CPU),或由段选择子和偏移量构成(80286以上的CPU),我们把偏移量也称为有效地址,用EA表示。2022/12/2311构成EA的四个地址分量:EA=(基址寄存器)+[(变址寄存器)×比例因子]+位移量

构成EA的四个地址分量:基址:16位CPU:BX、BP的内容;

32位COU:任一个通用寄存器的内容。变址:16位CPU:SI、DI的内容;32位CPU:任一个通用寄存器(ESP除外)的内容。比例因子:32位(386以上CPU)寻址方式中特有的。比例因子为1,2,4,8。位移量:8位或16位或32位的立即数。2022/12/2312例:位移量TAB=3000H,EBX=1000H,ECX=20H,则TAB[EBX+ECX*2+8]的有效地址EA?解:EA=EBX+ECX*2+8+TAB=1000H+20H*2+8+3000H=4048H2022/12/23131立即寻址2

寄存器寻址3

存储器寻址

①直接寻址 ②寄存器间址 ③基址寻址 ④变址寻址 ⑤基址加变址 ⑥带位移量的基址加变址 对32位寻址方式还有:

⑦比例变址 ⑧基址加比例变址 ⑨带位移量的基址加比例变址三.寻址方式分析2022/12/2314以AL、AX及EAX清零为例即AL←0=00H=00000000B

AX←0=0000H=0000000000000000B

EAX←0=00000000H=0……0B

32个“0”

︸2022/12/2315

指令中的操作数部分就是操作数本身,与操作码一起取到指令队列中。在执行时不需再访问存贮器,立即数可以是8位/16位或是32位。例: MOVAL,0;AL←0MOVAX,0;AX←0MOVEAX,0;EAX←0操作码为MOV:传送操作数:目的为AL,AX,EAX;源为0。如:

图3-2

1

立即寻址2022/12/23162寄存器寻址操作数存放在指令指出的寄存器中,可以是8位/16位或32位。对16位:AX、BX、CX、DX、SI、DI、SP、BP对8位:AH、AL、BH、BL、CH、CL、DH、DLMOVBX,0;BX←0MOVAX,BX;AX←BX=0显然,寄存器寻址是CPU内部操作,不需要访问总线周期,所以,指令的执行速度快。2022/12/23173存储器寻址对操作数是指明参加操作的数的地址即EA时,这类寻址都是存储器寻址。随着寻找EA的不同,存储器寻址可分为:①直接寻址

②寄存器间接寻址③基址寻址

④变址寻址⑤基址加变址

⑥带位移量的基址加变址对32位寻址方式还有:⑦比例变址⑧基址加比例变址⑨带位移量的基址加比例变址2022/12/2318①直接寻址指令中直接给出操作数的有效地址EA。例:设DS=4000H,2000H单元开始存放00H,00H。

MOVAL,[2000H];AL←[2000H]=00HP96图3-32022/12/2319操作数的有效地址EA存放在SI、DI、BP、BX四个寄存器之一中。借用上例:

MOVBX,2000H;BX←2000HMOVAL,[BX];AL←[BX]=[2000H]=00H,EA=2000H

图3-4②寄存器间址2022/12/2320对16位间址:BX、SI、DI为间址寄存器时,DS为默认段基址;BP为间寄存器时,SS为默认段基址。对32位间址:8个32位通用寄存器为间址R,除EBP、ESP外,都默认为DS。图3-5②寄存器间址2022/12/2321③基址寻址操作数的有效地址EA=基址R+位移量例:MOVBX,1000H;基址R为BX、BP之一MOVAL,1000H[BX];EA=BX+1000H=1000+1000H=2000H ;AL←[BX+1000H]=[2000H]=00H2022/12/2322

有效地址EA=变址R+位移量DISP即EA=方法同基址寻址,只是变址R为SI、DI之一④变址寻址SIDI+{8位位移量16位位移量2022/12/2323⑤基址加变址寻址EA=EA=基址R+变址R例:MOVBX,1000HMOVDI,1000HMOVAL,[BX][DI];EA=BX+DI=1000H+1000H=2000H ;AL←[EA]=[2000H]=00H﹛﹜﹛﹜+BXBPSIDI2022/12/2324⑥带位移量的基址加变址寻址EA=如上例:MOVBX,800HMOVDI,1000HMOVAL,800H[BX][DI];AL←[800H+1000H+800H]=[2000H]=00H{BXBP}+{SIDI}+{8位位移量16位位移量}2022/12/2325⑦比例变址EA=[变址寄存器]×比例因子+位移量设:TABLE=1000HMOVESI,400HMOVEAX,1000H[ESI×4]

;EAX←[ESI×4+TABLE]=[400H*4+1000H]=[2000H]=00000000H2022/12/2326⑧基址加比例变址EA=[基址R]+[变址R]×比例因子

MOVEBX,1000HMOVESI,800HMOVEAX,[EBX][ESI×2];EAX←[EBX+ESI×2]=1000H+800H×2=[2000H]=00000000HEA=2000H2022/12/2327⑨带位移量的基址加比例变址EA=[基址R]+[变址R]×比例因子+位移量MOVEBX,1000HMOVESI,400HMOVEAX,800H[EBX][ESI×2];EAX←[EBX+ESI×2]=1000H+400H×2+800H=[2000H]=00000000HEA=2000H2022/12/2328注对存储器寻址:R为BX、SI、DI或直接地址时,默认DS段;R为BP、SP时,默认SS段。非默认段时,由段超越寄存器指明。如ES:MOVCX,[BX]亦可写为MOVCX,ES:[BX];段基值由DS改为ES。(见表3-2)2022/12/2329例:设DS=2000H,[DS:2000H]=0

SS=1000H,[SS:2000H]=1BX=BP=2000HMOVAL,[BX];AL=[DS*10H+BX]=0MOVAL,[BP];AL=[SS*10H+BP]=1MOVAL,SS:[BX];AL=[SS*10H+BX]=1DS:MOVAL,[BP];AL=[DS*10H+BP]=0例3

设DS=2100H,SS=1000H,

CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作数的有效地址EA和物理地址PA①MOVAL,TABLE解1:直接寻址EA=TABLE=1B57H,PA=DS*10H+TBLE=2100H*10H+1B57H=22B57H②MOVAL,[BX]解2:寄存器间址

EA=BX=0158H,PA=DS*10H+EA=2100*10H+0158H=21158H例3

设DS=2100H,SS=1000H,

CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作数的有效地址EA和物理地址PA③MOVAL,TABLE[BP]解:基址EA=BP+TABLE=1058H+1B57H=2BAFH,PA=SS*10H+EA=1000H*10H+2BAFH=12BAFH④MOVAL,TABLE[DI]解:变址EA=DI+TABLE=10A5H+1B57H=2BFCH,PA=DS*10H+EA=2100H*10H+2BFCH=23BFCH例3设DS=2100H,SS=1000H,

CS=2000H,BX=0158H,DI=10A5H,DISP偏移量TABLE=1B57H,BP=1058H,求下列指令源操作数的有效地址EA和物理地址PA⑤MOVAL,TABLE[BX][DI]解:带位移量的基址加变址EA=BX+DI+TABLE=0158H+10A5H+1B57H=2D54HPA=DS*10H+EA=2100H*10H+2054H=23054H⑥MOVAL,CS:[BX]解:段超越EA=BX=0158HPA=CS*10H+EA=2000H*10H+0158H=20158H2022/12/2333四转移地址寻址以上讲了是有关数据的操作数寻址方式。我们知道:操作数是包括数据(操作数本身-立即寻址)和数据地址(通过EA寻址)两部分构成。在遇到转移指令或调用指令时要确定转向地址。这里我们介绍有关转移地址的四种寻址方式转移地址的四种寻址方式段内直接寻址段内间接寻址段间直接寻址段间间接寻址2022/12/23351段内直接寻址:EA=IP+DISP(8/16位)由于此时是以IP为基址,DISP是相对IP的差值,故这是一种相对寻址方式,允许其在内存中各个区域运行,而不用改变指令,这符合程序的再定位要求。在条件转移时:DISP只允许8位在无条件转移时:8位的DISP称为短跳转16位的DISP称为近跳转2022/12/2336例:(汇编语言格式)JMPNEARPTRPROGIA;IP←IP+PROGIA(16B)JMPSHORTQUEST其中PROGIA和QUEST是偏移量的符号地址如是16位:DISP则符号地址前加操作符NEARPTR如是8位:DISP则符号地址前加操作符SHORT2022/12/23372段内间接寻址EA={REGMEM}→IP∣→除立即数外的任一种数据寻址方式不能用于条件转移,以下2种也是如此。而JMP和CALL不受限制。段内间址转移指令的汇编格式为例:JMPBX ;IP←BXJMPWORDPTR[BP+TABLE];IPL←[BP+TABLE],IPH←[BP+TABLE+1]其中WORDPTR为字操作符,表示其后的转向地址是一个字的有效地址2022/12/2338指令中直接提供转向地址和偏移地址

DISP→IP

段地址→CS

例:JMPFARPTRROUTINE;IP←DISP,CS←DISP所在段

3段间直接寻址:︸段间转移的操作符︸转向的符号地址DISP2022/12/23394段间间接寻址:用存贮器中二个相继字的内容来取代IP和CS寄存器中的原始内容以达到级间转移的目的。这里存贮单元地址是立即数和寄存器寻址方式外的任一种数据寻址方式例:JMPDWORDPTR[INTERS+BX]

;IP←[INTERS+BX]CS←[INTERS+BX]所在段基址

︸双字操作符︸基址寻址2022/12/2340§3.28086/8088系统8086/8088指令系统可以分为6组:数据传送类指令

算术运算指令逻辑运算类指令

控制转移指令处理器控制类指令

串处理类指令

下面分别加以说明。(有关指令符号见表3-3)2022/12/23413.2.1数据传送类指令数据传送类指令用于把数据、地址或立即数传送到寄存器或存贮单元(I/O)端口)中。它又分为四种:即:1通用数据传送2I/O数据传送3目标地址数据传送4标志位数据传送2022/12/2342一通用数据传送8086/8088提供5条这类指令:表3-4MOV ——

传送PUSH——

入栈POP ——

出栈XCHG——

交换XLAT——

换码(字节翻译)2022/12/23431MOV指令:MOVOPRD1,OPRD2;OPRD1←OPRD2

源操作数可以是Reg、Seg、MEM、im目的操作数可以是Reg、Seg(CS除外)、

MEM,不能是立即数。当源是im时,目的不能是Seg。↑↑目的源操作数从源传送到目的2022/12/2344MOV指令形式MOVREG/SEG,REG;B/W,REG/SEG←REGMOVREG,SEG;W,REG←SEGMOVREG/SEG,MEM;B/W,REG/SEG←MEMMOVMEM,REG/SEG;B/W,MEM←REG/SEGMOVREG,IMM;B/W,REG←IMMMOVMEM,IMM;B/W,MEM←IMM2022/12/2345例:

①实现CPU内部寄存器之间数据传送:(CS和IP除外)MOVAL,BLMOVDL,CHMOVAX,DXMOVDS,AXMOVDX,ESMOVBX,DIMOVSI,BPMOVAX,DATA_SEGMOVDS,AX;段地址必须通过Reg→Seg…2022/12/2346例②实现立即数传送至CPU内部的通用Reg

(AX,BX,CX,DX,BP,SP,SI,DI)或MEM:MOVCL,4MOVAX,0000HMOVSI,057BHMOVAL,‘E’

;ASCII代码‘E’(45H)ALMOVBYTEPTRABC,1;…2022/12/2347例③实现Reg和MEM(CS和IP除外)之间数据传送:MOVAL,BUFFERMOVAX,[SI]MOV[DI],CXMOVSI,BLOCK[BP]MOVDS,DAT[SI+BX]MOVDEST[BP+DI],ESMOVBX,OFFSETTABLE;把TABLE的偏移地址而不是内容送BX,OFFSET为属性操作符。…2022/12/2348要实现MEM→MEM的数据传送,必须借助于CPU的Reg:例:MOVAL,AREA1MOVAREA2,ALMOVAREA1,AREA2正确错误}2022/12/2349注意:MOV指令使用时1、立即数IMM和段寄存器CS不能作为目的操作数。例MOV5,AX;5←AX,错

MOVCS,AX;CS←AX,错2、立即数不能直接传送到段寄存器SEG。

例MOVDS,5;DS←5,错3、两个存储单元之间不能直接传送数据。 例MOVMEM1,MEM2;MEM1←MEM22022/12/2350注意:MOV指令使用时4、两个段寄存器之间不能直接传送数据。例MOVDS,CS;DS←CS,错5、操作数类型必须匹配。例MOVAX,BL;AX←BL,错

MOVCL,DX;CL←DX,错以上注意点对以后介绍的指令同样适用。2022/12/23512堆栈操作:①堆栈——按照信息的先进后出(后进先出)原则组织的一段内存区域。在80X86/Pentium中此区域用SS来指示堆栈段基址,用SP指针来指示堆栈地址的偏移量,SP始终指向堆栈的顶部,堆栈的初值SP可由MOVSP,IMM16指令来设定。低地址高地址出栈入栈SS:SP→2022/12/2352②堆栈的作用★首先,在调用子程序/中断服务处理时,需要暂停主程序的执行,转去执行子程序/中断服务程序,为了保证程序执行完毕后能正确地返回到主程序,必须在调用时记录下一条要执行指令的地址(即CS和IP的值);★其次,在调用子程序/中断服务程序时,往往要用到Reg或影响到标志位,为了保证返回时有关Reg或标志位的正确,故也必须记下Reg及Flag的信息;★第三,在子程序嵌套或子程序递归的场合,要求能逐次返回上层子程序。2022/12/2353③堆栈操作指令:PUSH和POP都是16位操作;立即数不能直接如栈。ⅰ入栈:PUSHREG16;SP-1→SP,REG16H→[SP]SP-1→SP,REG16L→[SP]具体指令:PUSHREG16;W,SP←SP-2,[SP]←REG16PUSHSeg;W,SP←SP-2,[SP]←SegPUSHMEM16;W,SP←SP-2,[SP]←MEM16

}SP-2→SPOPRD→[SP]堆栈操作示意图2022/12/2354ii出栈:POPREG16;[SP]→REG16LSP+1→SP[SP]→REG16HSP+1→SP具体指令:POPREG16;W,REG16←[SP],SP←SP+2POPSeg;W,Seg←[SP],SP←SP+2POPMEM16;W,MEM16←[SP],SP←SP+2[SP]→OPRDSP+2→SP}堆栈操作示意图2022/12/23553.交换指令

XCHGOPRD1,OPRD2;OPRD1OPRD2

用于将源操作数和目的操作数(字或字节)进行交换OPRD:reg、MEM,但Seg不行。例:XCHGAX,REG;W,AXREGXCHGREG,MEM;B/W,REG MEM2022/12/2356例:XCHGBX,[BP+SI]设BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,[2F246H]=4154H则指令执行后:BX=4154HOPRD2的物理地址:2F000H+0200H+0046H=2F246H[2F246H]=6F30H2022/12/23574换码指令XLAT;B;AL←[BX+AL]用于将一种代码翻译成另一种代码有效地址EA=BX+AL,[EA]→ALAL为8位无符号数:00H~FFH(0~255)2022/12/2358使用该指令,应首先在DS段中预置一个表格,(长度≤256B)表格起始地址的偏移量先送入BX,AL为查找对象在表中的偏移字节(与表首址之差)(主要用于查找一些无规则代码)例:0~9的ASCII代码查找DS=2000HBX=0800HAL=04EA=0800+04=0804H物理地址:20000+0804=20804H书上例BCD0~9→七段LED代码见P83图3-162022/12/23591、 8086系统规定,凡是遇到给SS赋值时,系统自动禁止外部中断,直到下一条指令执行后,才开放中断,以防止在修改SS、SP过程中,堆栈空间的混乱。2、通用传送指令通常不改变标志位。注意:2022/12/2360二I/O数据传送

1、用于CPU和外设之间进行数据交换;

2、包括IN/OUT指令,可以是字节或字I/O;

3、指令中指定AL或AX与外设端口交换信息;

4、端口地址为一字节即0~255(00~FFH)时,可直接寻址,亦可间接寻址;对端口地址为两字节,即256~65535(0100H~FFFFH)时,只能间接寻址;

5、间址寄存器只能用DX。2022/12/23611输入指令:

INAL,n;B,AL←[n]INAX,n;W,AL←[n],AH←[n+1]INAL,DX;B,AL←[DX]INAX,DX;W,AL←[DX],AH←[DX+1]2输出指令:OUTn,AL;B,[n]←ALOUTn,AX;W,[n]←AL,[n+1]←AHOUTDX,AL;B,[DX]←ALOUTDX,AX;W,[DX]←AL,[DX+1]←AH2022/12/2362例:INAL,21H/INAX,21HMOVDX,210HINAL,DX/INAX,DXMOVDX,261HOUTDX,ALMOVAX,1234HOUT22H,AX;[22H]←34H[23H]←12H2022/12/2363三目标地址传送亦称为有效地址计算指令(见P76表3-7)。共3条与MOV指令的区别在于不是传送变量本身,而是传送变量的有效地址EA,这样,就不必用软件计算EA。1、

EA送Reg指令

LEAREG16,MEM;W,REG←ADDRMEM以下是四字节(双字)传送指令:2、指针送Reg和DS指令:*隐含DS,

LDSReg,MEM;DW,REG16←[EA],DS←[EA+2]3、指针送Reg和ES指令:*隐含ES

LESReg,MEM;DW,REG16←[EA],ES←[EA+2]*LDS和LES的区别只是SEG不同而已。2022/12/23644、例:①LEABX,0F62H[BX][SI]设BX=0400H,SI=003CH指令执行后

BX=0400H+003CH+0F62H=139EH

*注意:这里BX得到的是EA而不是[EA]②

LDSSI,[10H]设DS=C000H,DS:10=0180H,DS:12=2000H,执行后,SI=0180H,DS=2000H如图:80H01H00H20HLES只是[EA+2]→ES而不是DSDS:0010DS:0012DS:C000H执行后SI=0180HDS=200H2022/12/2366四标志位传送用于状态保护或恢复。(共四条,见P79表3-6)单字节指令,无操作数(隐含)

1读标志指令OFDFIFTFSFZFAFPFCFFregAHLAHF;AH←FRL;主要兼容8BCPU2022/12/2367

2

设置标志指令

SAHF;FRL←AH;

同上功能与LAHF相反,恢复FRL的状态。

3/4标志位入栈/标志位出栈指令

PUSHF/POPF;[SP]←FR,SP←SP-2/FR←[SP],SP←SP+2FR的内容进/出栈指令,用于中断/子程序调用时,保护/恢复FR的内容,或用于改变TF(跟踪)状态。2022/12/2368例P78PUSHFPOPAXORAX,0100H;使D8=1(TF)PUSHAXPOPF2022/12/23693.2.2算术运算类指令一、算术运算指令涉及的问题1数据类型

算术运算类指令主要涉及两种类型的数据即无符号数和有符号数:

对8位有符号数的范围:-128~+127对8位无符号数的范围:0~255对16位无符号数的范围:0~65535对16位无符号数的范围:-132768~327672022/12/2370对压缩BCD码的范围:

0~99(每四位→一个十进制数)对非压缩BCD码的范围:

0~9(每8位→一个十进制数)

10011001→99(压缩)

00001001→9(非压缩)对加/减运算:86采用同一套指令

对乘/除运算:带符号数和无符号数的运算采用的指令不同2022/12/23712运算标志通常算术指令都会影响状态标志F

如:无符号数运算进位CF=1

有符号数运算溢出OF=1

运算结果为0,ZF=1

运算结果为负,SF=1

运算结果为偶,PF=1(低8位)这些标志通常决定程序的流程。算术运算指令共有20条见P87表3-52022/12/2372二、加/减运算8086/8088的加/减运算指令共有12条1.ADDCPRD1,OPRD2SUBCPRD1,OPRD2;OPRD1←OPRD1±OPRD2指令格式:ADD/SUBreg,reg;B(W),reg←reg±regADD/SUBreg,mem;B(W),reg←reg±memADD/SUBreg,imm;B(W),reg←reg±immADD/SUBmem,reg;B(W),mem←mem±regADD/SUBmem,imm;B(W),mem←mem±imm2022/12/2373关于加/减运算的例子见P87

设AX=65AOH,BX=B79EH执行ADDAX,BX

0110010110100000+101101111001111010001110100111110有进位CF=1最高位D15=0SF=0Cs⊕Cp=1⊕1=0OF=0 结果非零ZF=0D3D4无进位,AF=0低8位为5个1,PF=02022/12/2374指令执行后,AX=1D3EH.FR:CF=1,SF=0,OF=0,ZF=0,AF=0,PF=0对AF标志是由调整指令(如DAA)使用的,编程者一般不予考虑。对运算结果分析:如AX,BX为无符号数,则结果>65535(CF=1);如AX,BX为带符号数,则结果在16位补码所能表示的范围内因而运算结果正确(1D3EH)。

上例AX,BX,如执行SUBAX,BX,则 0110010110100000+01001000011000101010111000000010[B79EH]变补*无进位→有借位CF=1D15=1→SF=1CS⊕CP=0+1=1→OF=1AX=AE02H*结果非0→ZF=0无进位→有借位,AF=1低8位一个1,PF=0低8位一个1,PF=0分析2022/12/2376这是带进/借位的加/减法指令

单精度——16位运算 双精度——32位运算多精度——32位以上运算带进/借位的加/减指令主要用来进行多精度运算。ADC/SBBreg,src;reg←reg±src±CFADC/SBBa,imADC/SBBdst,immADC/SBBdst,reg2ADC/SBB2022/12/2377通常,在多精度(双)运算时,最低字节用ADD/SUB指令,在其它高位字节都用ADC/SBB指令例

DXAX+BXCX设DX=0002HAX=OF365H BX=0005HCX=OE024H指令:

ADDAX,CXADCDX,BX2022/12/2378首先:

F365

+E024D389其次:

0002

+0005

+1

0008DX=0008SF=0ZF=0CF=0OF=0

进位1——←AX=00389HSF=1ZF=0CF=1OF=02022/12/23793

增/减量指令:

INCOPRDDECOPRD

主要用来对指定操作数±1,常见于修改循环地址指针和计数次数。指令格式:

INCr;B/W,r←r+1DECr;B/W,r←r-1INCsrc;B/W,src←src+1DECsrc;B/W,src←src-1注意:不影响CF标志;OPRD←OPRD±12022/12/23804取补指令:NEGOPRD;OPRD←OPRD+1NEGr;B/W,R←0-RNEGsrc;SRC←0-SRC2022/12/23815比较指令:CMPOPRD1,OPRD2;OPRD1-OPRD2比较指令不影响源和目的操作数,但影标志位。指令格式: CMPr,src;r-src CMPa,im;a-im CMPdst,r;dst-r CMPdst,im;dst-im2022/12/2382比较指令,顾名思义,即进行两个数的大小比较1对相等的两数,仅测ZF标志2对无数符数,用CF标志3对带符号数,比较复杂,不能简单由SF或OF来判断,而必须根据SF⊕OF来确定。2022/12/2383小结符号结果OFSFZFCF无A≥BA<B01有A≥BA<B00111001}OF⊕SF=0A≥B}OF⊕SF=1A<B2022/12/23846

BCD码调整指令AAA,DAAAAS,DASAAA/AAS非压缩(非组合)BCD码加/减调整,DAA/DAS压缩(组合)BCD码加/减调整。}调整指令功能:DAA/DAS:若L∩OFH>P∪AF=1则AL←AL±6CF←AF若AL>9FH或CF=1AL←AL±60HCF←12022/12/2385例:1834+2789

ALCFAFMOVAL,34H;34H00ADDAL,89H;BDH00DAA;23H 10MOVBL,AL;23H10MOVAL,18H;18H10ADCAL,27H;40H01DAA;46H00MOVBH,AL;46H002022/12/2386AAA/AAS; AL←AL±6非压缩BCD AH←AH+1 AF←1 CF←1 AL←AL∩OF例7+5 00000111+00000101 1100 +0110AL=00010010 ∩00001111 00000010←AL 00000000 +1 00000001→AHAX=0102H→122022/12/2388三乘/除运算

在86系统中,因增加了乘/除运算逻辑部件,因而可直接进行乘/除运算。这是较8BCPU(如Z80等)先进之处之一。1乘法运算①MULOPRD;无符号数乘法运算 IMULOPRD;带符号数乘法运算

2022/12/2389②两个8位数相乘,会得到一个16位的乘积,两个16位数相乘,会得到一个32位的乘积。

故乘法运算时,只指明一个操作数,另一个隐含在AL(8位)或AX(16位)中:8位数相乘→结果在AX中 16位数相乘→结果在DX,AX中③乘法运算影响Freg的CF、DF,其它标志不确定AH(DX)≠0→CF=1OF=1,否则都为0(IMUL时稍有不同,是低位符号的扩展)。2022/12/2390④指令格式:

MULsrc;B,AX←AL*srcIMULsrc;W,DX,AX←AX*src例:MULBL;B,AX←AL*BLMULCX;W,DXAX←AX*CX MULBYTEPTR[SI];AX←AL*[SI] MULWORDPTR[DI];DXAX←AX*[DI+1][DI]

对有符号数运算,将MUL改为IMUL2022/12/2391⑤MUL和IMUL区别例3*(-2)=-63*14=42(2AH)∣→[1110]补∣→1110故3*(-2)和3*14都成了0011*1110=2AH2AH这个结果对3*14是正确的对3*(-2)是错误的竖式:0011×111000101010=2A另一种算法:先计算3*2=6,再求补码(IMUL)竖式:

0011 × 001000000110

求补11111010求补FA-6此结果对3*(-2)是正确的对3*14是错误的∴要想得到无/有符号数每次法运算的正确结果,必须分别进行无/有符号数的乘法运算。这就是MUL/IMUL的来历和执行过程。乘法运算是如此,除法运算也相同。2022/12/23932除法运算DIVOPRD;IDIVOPRD;

ALAH余商AXDX2022/12/2394①无/带符号数除法运算:DIVsrc;B,AL←AX/src的商

AH←AX/src的余数 ;W,AX←DXAX/src的商

DX←DXAX/src的余数

对带符号数:IDIVsrc,其操作同DIV,只是src是带符号的,商和余数也为带符号数,且余数的符号与被除数相同2022/12/2395②除法运算的符号扩展为了便于进行8位/16位的除法运算,其被除数常常设计为16位/32位。为此,86指令系统中设计了二条符号扩展指令

CBW——字节转换为字指令 ;AL的内容符号扩展到AH即AL的D7=0→AH=00HAL的D7=1→AH=0FFHD7AHAL2022/12/2396同理CWD——字转换为双字指令;AX的内容符号扩展到DX即AX的D15=0→DX=0000HAX的D15=1→DX=0FFFFHD15DXAX2022/12/2397③除法运算的溢出除法运算,在字节操作时,要求商为8b。当8b操作时,被除数高8b的绝对值>除数的绝对值;或16b操作时,被除数高16b的绝对值>除数的绝对值,商就会产生溢出,IBMPC机中设计为0型中断处理。为避免除法溢出,程序在设计时应考虑溢出判断及处理。2022/12/2398④例⑴设AX=0400HBL=0B4H=1024(无)+1024(带)=180(无)-76(带)执行DIVBL的结果是:;AL=05H=5(商);AH=7CH=124(余数)执行IDIVBL的结果是:;AL=0F3H=-13(商);AH=24H=36(余数)2022/12/2399AXBLDIVIDIV0400H0B4HAH(余)AL(商)AH(余)AL(商)10241801245+1024-7636-132022/12/23100⑵计算(V-(X*Y+Z-540))/X设X、Y、Z、V均为16b带符号数,且已分别装入X、Y、Z、V单元,要求上式计算结果的商存于AX,余数存入DXMOVAX,x;IMULy;X*YMOVCX,AXMOVBX,DX;BX,CX←X*YMOVAX,ZCWD;Z扩展为32b2022/12/23101ADDCX,AXADCBX,DX;X*Y+Z→BX,CXSUBCX,540SBBBX,0;X*Y+Z-540→BX,CXMOVAX,VCWD;V扩展为32bSUBAX,CXSBBDX,BX;V-(X*Y+Z-540)→DX,AXIDIVX;DX,AX/X→DX,AX余数商2022/12/231023非组合BCD的乘/除调整指令AAM;紧跟MUL指令后;(AX←把AL中的积调整到非压缩的BCD格式)AH←AL/10(0AH)的商

AL←AL/10(0AH)的余数AAD;紧接DIV指令前;(被除数AX)AL←AH*10(0AH)+ALAH←02022/12/23103AL=00001001=09H;BL=09HMULBLAX=0000000001010001=0051HAAMAX=0000100000000001=(0801H)=81例:①9*9AHAL非压缩BCD2022/12/23104例②设被除数6262/7AX=0000011000000010B;BL=7AADAX=0000000000111110BDIVBLAX=0000011000001000B=0608HAAM/AAD影响PF、SF、CF余数商2022/12/231053.2.3逻辑运算与移位类指令用于处理字或字节中数据位的信息。包括逻辑运算、移位(循环移位)指令部分一.

逻辑运算指令

见P88表3-10:

NOT、AND、OR、XOR、TEST

所有指令均为按位操作(8/16B)段寄存器不能进行逻辑运算主要用来组合、屏蔽、取反和测试操作数的某些位。2022/12/23106逻辑非: NOTOPRD(例NOTAX);OPRD←OPRD逻辑与:

ANDdst,src;dst←dst∩src

例:ANDAL,0F0H;AL←AL∩0F0H逻辑或:

ORdst,src;dst←dst∪src

例:ORBL,AL;BL←BL∪AL逻辑异或:XORdst,src;dst←dst⊕src例:XORBX,CX;BX←BX⊕CX2022/12/23107逻辑测试:

TESTOPRD1,OPRD2;OPRD1∩OPRD2

例:TESTAL,10000000B;不保留调试结果,但通过FR反映其状态。以上5条指令NOT不影响F.Reg.其它四条总使OF=CF=0,而PF、SF、ZF则根据运算结果设置。应用举例: 1、用AND指令:屏蔽Di→置0,不变Di→置1。屏蔽D0、D1位:INAL,20H ANDAL,0FCH;(11111100B)2022/12/231082.用OR指令:组合Di→置1,不变Di→置0。组合D5位:

MOVAL,43H;01000011ORAL,20H;∪00100000011000112022/12/231093、用TEST指令:测试Di→置1

屏蔽Di→置0MOVAL,40HTESTAL,0AFH01000000∩1010111100000000MOVDL,ALTESTDL,00000010BJNZexit;测D1位是否为1这里要求测试D0、D1、D2、D3、D5、D7位是否为0,根据test的结果CF=OF=0,SF=0、ZF=1说明测试位全为0,如后跟条件转移指令即可进行不同处理。2022/12/231104、用XOR指令:取反Di→置1,

不变Di→置0MOVAL,11HXORAL,3000100010000001100010010;D0、D1位取反XOR指令还可用来测试某一操作数是否与另一确定数相等,常用在检查地址是否匹配时用。⊕2022/12/23111XORAX,042EHJZMATCH;AX=042EH,转MATCHXORAX,AX;AX←0000H,CF=0移位和循环2022/12/23113移位和循环2022/12/23114说明:1目标操作数可以是8B或16B2计数值决定移位或循环次数计数值为1时常用im表示 计数值>1时必需用CL表示 计数值≤2553通常左/右移对应乘/除2n有符号数除2n→SAR(算术右移)无符号数除2n→SHR(逻辑右移)2022/12/23115例1:AX*5/2MOVDX,AXSALAX,1;AX*2SALAX,1;AX*4ADDAX,DX;AX*5SARAX,1;AX*5/22022/12/231163.2.4控制转移类指令控制转移类指令包括四部分:

转移指令:

JMP/Jx

重复操作:

LOOP

调用/返回:CALL/RET

中断:INTn/IRET

在86/88CPU中,CS和IP决定程序的执行顺序。

当程序发生转移时,实际上是把新值赋给CS和IP,下面一一讨论8086/8088控制转移的指令。2022/12/23117一转移指令:转移指令分为二类:在段内直接转移时,分为短转移和近转移,即IP←IP+DISP(8/16b)SHORT(短转移):若DISP在JMP指令的-128~+127字节内,汇编程序就自动产生一个二字节指令。

NEAR(近转移):若DISP不在短转移的范围内,就在±32K范围内寻找目标地址,汇编程序就自动产生一个三字节指令。段内直接转移:JMP1000H;IP←IP+1000H段内间接转移:JMPCX;IP←CXJMPWORDPTR[BX]段间直接转移:JMP2000:0100H段间间接转移:JMPDWORDPTR[SI]1无条件转移2022/12/23118段内间接转移:IP←[Reg、MEM]段间转移指令:改变CS和IP段间直接转移:指令中给出新的CS和IP值段间间接转移:根据计算出的EA值找出连续四个地址单元的内容为IP和CS的新值即:IP←[EA+1,EA] CS←[EA+3,EA+2]2022/12/231192条件转移共18条见P116表3.2条件转移指令

其特征为:2字节的SHORTJMP(-128~+127)=>相对IP的JMP即e-2=>e=-126~+129助记符不唯一。JE/JZJA/JNBE测试5个状态标志:CF、ZF、OF、SF、PF条件转移指令归纳起来分为三类:①单个标志:表中1~10。根据某个标志的状态来决定转移(5个标志10条指令)2022/12/23120②无符号数:表中11~14根据CF和ZF的状态来决定转移③带符号数:表中15~18根据SF、OF和ZF的状态来决定转移为什么要分带符号数和无符号数呢?因为其测试状态不同(CF、ZF/SF、DF、ZF)例01H和0FEH这两个数作为无符号数01H<0FEH作为带符号数01H>0FEH(-2)2022/12/23121∴执行下列指令:

MOVAL,01H CMPAL,0FEH后,CF=1,OF=0,SF=0,ZF=0若要求AL中无符号数>0FEH转移时,必须使用JA∵(CF=1∩ZF=0)∴不转移(AL<0FEH)若要求AL中的带符号数>0FFH转移时,必须使用JG∵(SF⊕OF=0∩ZF=0)∴转移(AL>0FEH)2022/12/23122通常,条件转移指令与CMP一起配合使用CMP无符号带符号目>源JAJG目=源JE/JZJE/JZ目≠源JNEJNE目<源JBJL目≤源JBEJLE目≥源JAEJGE2022/12/23123例

①ADDAL,AL JCTOOBG;CF=1,转TOOBG

…TOOBG:②SUBAL,BL(CMPAL,BL)JZZERO (JEZERO);ZF=1,转ZERO

…ZERO: ③CMPBX,AXJABXM;CF=0且ZF=0转BXM(无符号数)

BXM:………2022/12/23124④比较AL>=、<10CMPAL,10JAEAE10

… ;A<10AE10:JAA10

… ;A=10A10: ;A>10……2022/12/23125例:设2000H开始的区域中,存放着20个数据,要求找出其中最大的一个数,并存到2000H单元中。GATMAX: MOVBX,2000H;BX←2000H MOVAL,[BX];AL←第一个数

MOVCX,19;CX←计数值20P1:INCBX;BX指向下个数

CMPAL,[BX];和下个数比较

JAEP2;AL≥[BX]转P2 MOVAL,[BX];AL<[BX],则AL←[BX]P2:DECCX;计数-1→CX JNZP1 ;CX≠0,转P1 MOV[2000H],AL;CX=0,比较完,BX←2000H2022/12/23126

利用一条指令来控制程序的循环操作。共有4条:

LOOP

;CX←CX-1,CX≠0,转移LOOPZ/LOOPE;CX←CX-1,CX≠0∩ZF=1,转移

LOOPNZ/LOOPNE;CX←CX-1,CX≠0∩ZF=0,转移

JCXZ

;CX=0,转移二重复控制类指令:Click2022/12/23127

重复控制指令使程序简练如:MOVCX,n MOVCX,nBEGIN:LOOPZ/LOOPELOOPNZ/LOOPNE:功能同LOOP,增加限制循环条件(ZF)。

注意:ZF的建立非CX所为,而是前面指令执行结果。JCXZ:只是简单根据CX=0转移,有的书把其放在条件转移指令中。

LOOPBEGIN;CX←CX-1

……等效循环体===>……循环体DECCXJNZBEGIN…BEGIN:…2022/12/23128例:有一个L个字符的字符串存储于首址为ASCII_STR的存储区中。现要求在字符串中查找“空格”(ASCII码为20H)字符,找到则继续执行,未找到则转到not_found去执行,编制实现这一要求的程序如下:2022/12/23129MOVCX,L;putarrayincxMOVSI,-1 ;initializeindex,andMOVAL,20H;MOVAL,“”;putcodefor;spaceinALNEXT:INCSI;increamentindexCMPAL,ASCII_STR[SI];TextforspaceLOOPNZNEXT;loopifnotspaceandcount;innonzeroJNZNOT_found;branchtoNOT_Found

Not_found:……2022/12/23130在程序执行过程中,有两种可能:①查找到“space”,此时提前结束循环(ZF=1),而顺序继续执行②未查找到“space”,此时因CX=0,而结束循环,JNZ条件满足,(是执行CMP指令的结果!)而转到not_found去执行。 在继续执行时,可打印出找到“space”,以及“space”的位置;在执行not_found时,可打印未找到“space”的信息。2022/12/23131三调用/返回指令模块化程序设计子程序将一些具有独立功能的部分程序编写成独立的程序模块调用过程CALLPROC_A

CALLPROC_A……PROC_ARET……2022/12/23132该指令执行的操作是:SP←SP-2,[SP+1,SP]←IP;IP入栈IP←IP+16位位移量

;转向子程序入口

该指令执行的操作是:SP←SP-2,[SP+1,SP]←CS;CS入栈SP←SP-2,[SP+1,SP]←IP;IP入栈IP←偏移地址EA;IP由指令中的偏移地址取代CS←段地址;CS由指令中的段地址取代该指令执行的操作是:SP←

温馨提示

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

评论

0/150

提交评论