




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术中国水利水电出版社第4章指令系统4.1数据类型及其存储规则4.2计算机指令格式4.38086的寻址方式4.48086的指令系统4.5DOS和BIOS中断4.1数据类型及其存储规则4.1.1基本数据类型及其存储
快速阅读本部分内容回答以下问题:1、对80X86系统而言,最小编址单位是什么?2、当一个二进制数据超过8位时,如何存储?3、80X86系统的基本数据类型有哪些?4、当多于一个字节的数据存储时,高位字节应该存储到低地址字节单元吗?当多于一个字节的数据存储时,其存储规则是高位字节存储在地址号高的存储单元中,低位字节存储在地址号低的存储单元中。且以低地址字节的地址为该数据的地址。图4-1基本数据类型的结构形式例:如果把双字数据72AB5396H存放在以32000H开始的内存单元中,如何存放?32000::::00000FFFFF例、存储器内容如右图,请写出地址为12000H的字数据?请写出地址为12001H的字数据?请问字数据2547的地址是什么?请写出地址为12000H的双字数据?2518CD120004759::00000FFFFF:4.1.2数字数据类型基本数据类型不考虑数的符号和小数点的问题,但有些指令指定在数字数据类型上操作。这些数字数据类型包含三部分,即:无符号整数。带符号整数。浮点数。图4-2a是无符号整数类型,图4-2b是带符号整数类型,图4-2c是浮点数类型。图4-2数字数据类型1.无符号整数:P802.带符号整数:P813.浮点数:P814.1.3指针数据类型指针是内存单元的地址,在实方式下有两种类型的指针:近指针(16位)和远指针(32位)近指针(near)是段内的16位偏移量(称为有效地址)。远指针(far)是一个32位的逻辑地址,不仅包含16位有效地址,而且包含了16位段基址。在虚拟方式下,也有两种类型指针近指针是段内32位偏移量。远指针是一个48位的逻辑地址。4.1.4字符串、位及位串数据类型(自学)4.2计算机指令格式(自学)4.38086的寻址方式快速阅读本部分内容回答以下问题:1、什么是寻址方式?2、操作数可以存放在哪些地方?3、当操作数存放在哪个地方时指令的执行速度是最快的?立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址本节以MOV指令为例说明8086指令的各种寻址方式。1、8086指令的寻址方式1)立即寻址在立即寻址(ImmediateAddressing)方式下,操作数直接包含在指令中,它是一个8位或16位的常数,也叫立即数。该指令翻译成机器码时,立即数作为指令的一部分,紧跟在操作码之后,存放在代码段内。以A~F打头的数字出现在指令中时,前面一定要加一个数字0,以免与其它符号相混淆。
示例见下页。。。如:MOVCX,2A50H它表示将立即数2A50H送到CX寄存器中。指令的机器码存放及执行过程如图4-8所示。
MOVCX,2A50H执行过程2A50CLCHCX代码段:操作码502AMOVCX,2A50H指令代码:2)寄存器寻址在寄存器寻址(RegisterAddressing)方式下,操作数放在某个寄存器中。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等对于8位操作数,则用寄存器AH、AL、BH、BL、CH、CL、DH和DL
源操作数的长度必须与目的操作数一致,否则会出错例如,我们不能将AH寄存器的内容传送到CX中去,尽管CX寄存器放得下AH的内容,但是汇编程序不知道将它放到CH还是CL中。示例见下页。。。如:MOVDX,AX假设该指令执行前(AX)=3A68H,(DX)=18C7H,则指令执行后,(DX)=3A68H,而AX的内容保持不变。如:MOVCL,AH它表示将AH中的8位数据传送到CL寄存器。除上述两种寻址方式外,在剩下的5种寻址方式下,指令的操作数都放在内存中,都为存储器寻址。进一步讲,指令的操作数大都存放在内存的数据段中。数据段的段基址保存在段寄存器DS中,且由系统给定,所以要访问操作数,指令中只需给出偏移地址即可。若要计算物理地址,则物理地址PA=DS×10H+EA5种寻存储器寻址,它们之间的差别就在于偏移地址(又称有效地址EA)的构成方法不同。
3)直接寻址(DirectAddressing)指令中直接给出操作数的16位偏移地址。偏移地址也称为有效地址(EA,EffectiveAddress),在机器码中,EA位于指令的操作码之后。直接寻址的常数地址用方括号括起来,以便与立即数相区别。如:MOVAX,[2000H];MOVBX,[500H];物理地址的计算:当采用直接寻址时,默认操作数存放在数据段中,DS保存其段基址,操作数的物理地址PA=DS×10H+EA。指令执行过程见下页。。。例:对于指令:MOVAX,[2000H],设数据段和段寄存器DS的内容如下图所示,则执行指令后,寄存器AX的内容是什么?:341232000??ALAHAX数据段:3000DS32001解:这条指令的功能是将数据段中有效地址(即偏移地址)为2000H的字数据放到AX中,但现在只知道数据段中各单元的物理地址,所以要先求出物理地址。根据物理地址的计算方法,有效地址(即偏移地址)为2000H的字数据的物理地址PA=DS×10H+EA=3000H×10H+2000H=32000H该地址对应的字数据为1234H,所以指令执行后AX的内容为1234HMOVAX,[2000H]执行过程示意图3000DS+200032000×10H:3412320001234ALAHAX数据段:代码段:操作码0020MOVAX,[2000H]指令代码:如果将上述指令中的AX换成AL,即MOVAL,[2000H],结果又如何呢?操作数的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作间址寄存器4)寄存器间接寻址EA=(BX)(BP)(SI)(DI)例:MOVAX,[BX]MOVCL,[DI]错误例:
×MOVAX,[DX]×
MOVCL,[AX]如果寄存器是BX、SI或DI,则默认操作数存放在数据段中,计算物理地址时使用DS。若寄存器是BP,则默认操作数在堆栈段中,计算物理地址时使用SS。例设DS=1000H,SI=2000H,(12000H)=8BH,(12001H)=31H;分析指令“MOVBX,[SI]”执行后寄存器BX的结果:8B3112000??BLBHBX数据段:1000DS12001解:物理地址=DS×10H+SI=10000H+2000H=12000H。指令执行过程示意图见下页。2000SI指令执行过程示意图1000DS+SI12000×10H:8B3112000318BBLBHBX数据段:代码段:操作码::MOVBX,[SI]指令代码:20005)寄存器相对寻址EA=地址寄存器的内容加上一个8/16位的位移量(常数)EA=(BX)(BP)(SI)(DI)+8位16位位移量
如果寄存器是BX、SI或DI,则默认操作数存放在数据段中,计算物理地址时段基址使用DS。若寄存器是BP,则默认操作数在堆栈段中,计算物理地址时段基址使用SS。5)寄存器相对寻址示例如下:(1)MOVBX,2000H[SI]则:EA=(SI)+2000H(2)MOVBX,COUNT[SI]则:EA=(SI)+COUNT(其中:COUNT为一常量,称为符号地址)上述指令也可写成MOVBX,[COUNT+SI]寄存器相对寻址方式与寄存器间接寻址相似,主要区别是前者在有效地址上要加一个位移量。例、设DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=78H,(36001H)=56H分析指令“MOVBX,COUNT[SI]”执行后寄存器BX的结果。:785636000??BLBHBX数据段:3000DS360012000SI解:指令的物理地址=DS×10H+SI+COUNT=30000H+2000H+4000H=36000H执行结果:BX=5678H。指令执行过程示意图见下页。指令执行过程示意图20003000DSSI+COUNT400036000×10H:7856360005678BLBHBX数据段:代码段:操作码0040MOVBX,COUNT[SI]指令代码:6)基址加变址寻址基址加变址寻址(BasedIndexedAddressing)方式,操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和MOVAX,[BX][SI]MOVAX,[BX+SI]EA=(BX)(BP)+(SI)(DI)注意:同一组内的寄存器不能同时出现。例、设DS=3000H,BX=1200H,SI=0500H,(31700H)=CDH,(31701H)=ABH,分析指令“MOVAX,[BX][SI]”执行后寄存器AX的结果。解:物理地址=DS×10H+BX+SI=30000H+1200H+0500H=31700H该指令的执行过程示意图见下页。执行结果:AX=ABCDH。上述指令也可以写成:MOVAX,[BX+SI]
指令执行过程示意图:CDAB31700ABCDALAHAX数据段:代码段:操作码MOVAX,[BX][SI]指令代码:+317000500SI3000DS×10H1200BX7)相对基址变址寻址操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上一个8位或16位位移量之和。
如:MOVAX,MASK[BX][SI]MOVAX,
[MASK+BX+SI]MOVAX,200H[BX+SI]MOVAX,MASK[BX+SI]
EA=(BX)(BP)+(SI)(DI)+8位16位位移量
例、设DS=2000H,BX=1500H,SI=0300H,MASK=0200H,(21A00H)=BFH,(21A01H)=26H,分析指令“MOVAX,MASK[BX][SI]”执行后寄存器AX的结果。解:物理地址=DS×10H+BX+SI+MASK=20000H+1500H+0300H+0200H=21A00H该指令的执行过程示意图见下页。指令执行过程示意图1500BX+MASK020021A002000DS×10H:BF2621A0026BFALAHAX数据段:操作码操作码00代码段:MOVAX,MASK[BX][SI]指令代码:0300SI02MOVAX,MASK[BX][SI]也可写成如下几种形式:MOVAX,[MASK+BX+SI]MOVAX,200H[BX+SI];MASK=0200HMOVAX,MASK[BX+SI]
寻址方式可分为立即寻址直接寻址寄存器相对寻址寄存器寻址基址-变址寻址相对基址-变址寻址寄存器间接寻址小结:寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:寻址方式指令操作数形式
寄存器间接只有一个寄存器(BX/BP/SI/DI之一)寄存器相对一个寄存器加上位移量基址—变址两个不同类别的寄存器相对基址-变址两个不同类别的寄存器加上位移量若寻址方式中用到BP寄存器,且无跨段前缀,则默认操作数在堆栈段中,计算物理地址时使用SS,即物理地址=SS×16+EA。4.48086的指令系统就8086CPU而言,其指令系统共有133条指令。按功能分类,8086的指令共有六大类,分别是:数据传送指令、算术运算指令、逻辑运算和移位指令、字符串处理指令、控制转移指令以及处理器控制指令。表4-4中列出指令中的操作数的简写符号,是从IntelIA-32手册上摘录下来的。用这些符号来描述Intel指令的格式。表4-4指令中的操作数表示法
操作数描述r88位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DLr1616位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BPr3232位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBPreg任意的通用寄存器sreg16位段寄存器:CS,DS,SS,ES,FS,GSimm8位、16位或32位立即数imm88位立即数(字节)imml616位立即数(字)imm3232位立即数(双字)r/m88位操作数(可以是8位通用寄存器或内存字节)r/m1616位操作数(可以是16位通用寄存器或内存字)r/m3232位操作数(可以是32位通用寄存器或内存双字)mem8位、16位或32位内存操作数DOPDSrc源操作数,dst目的操作数4.4.1数据传送指令数据传送指令用来把数据或地址传送到寄存器或存储器单元中,共14条,可分为4组:P90表4-51.通用数据传送指令(1)MOV传送指令(Move)格式:MOVDST,SRC操作:DST←SRC
MOV指令允许数据传送的途径如图4-14所示(CS不能做目的操作数)图4-14MOV允许传送数据的途径通用寄存器AXAHBXALCXBHDXBLSICHDICLSPDHBPDL段寄存器CS,DS,ES,SS存储器立即数MOV指令举例:如:MOVAL,‘B’;该指令把字符B的ASCII码(42H)传送到AL寄存器中。再如: MOVCL,DLMOVAX,BXMOV[SI],CXMOV[SI],CL小问题:后两条指令有什么区别?什么是堆栈?按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。为什么要设置堆栈?主要用于在调用子程序或处理中断时保存返回地址,其次用于保存中间结果。(2)PUSH进栈指令(PushWordontoStack)对8086,堆栈设置在堆栈段中。其段基址保存在SS中,堆栈指针SP保存栈顶的偏移地址,称SP指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的栈底为堆栈段的最后一个单元。SPSS堆栈段进栈方向退栈方向栈底栈顶格式:PUSHsrc ;src为16位操作数例:PUSH AX ;将AX内容压栈执行操作:(SP)←(SP)-2 ((SP))←低字节AL((SP)+1)←高字节AH示意图如下(2)PUSH进栈指令(PushWordontoStack)压栈指令的形式有如下几种:PUSH regPUSH memPUSH sreg例如:PUSHAXPUSH[BX]PUSHDS注意进栈方向是高地址向低地址发展。
格式:POPdst例:POPBX ;将栈顶内容弹至BX执行操作:(BL)←((SP))
(BH)←((SP)+1)
(SP)←(SP)+2 示意图如下:(3)POP出栈指令(POPWordoffStack)POPBX的执行示意图如下图所示低地址存储区(SS段)出栈方向执行前2010POPBX指令执行示意图(SP)存储区(SS段)执行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址例4-6设SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次执行下列指令后堆栈中的数据和SP的变化情况如何?PUSHBXPUSHAXPOPBX解:堆栈中数据和SP的执行过程见图4-15所示。
2000:00002000:003C2000:0040FE252031AX=25FEHBX=3120H(c)执行PUSHAX指令后SP2000:00002000:003E2000:0040FE252031AX=25FEHBX=25FEH(d)执行POPBX指令后SP图4-15PUSH和POP指令执行过程2000:00002000:0040AX=25FEHBX=3120H(a)指令执行前SP2000:00002000:003E2000:00402031AX=25FEHBX=3120H(b)执行PUSHBX指令后SP堆栈指令使用时应注意几点:①堆栈操作总是按字进行②不能从栈顶弹出一个字给CS③SP自动进行增减量(-2,+2)格式:XCHGdst,src功能:交换两操作数的内容。要求:两操作数中必须有一个在寄存器中;
举例:XCHG AX,BXXCHG [2000],CL(3)交换指令XCHG(Exchange)2.累加器专用传送指令(1)XLAT表转换指令(TableLookupTranslation)格式:XLAT或XLAT表首地址操作:(AL)←((BX)+(AL))。数字0~9的ASCII码表MOVBX,2000H;(BX)←表首地址MOVAL,02H;(AL)←序号XALT;查表转换执行后得到:(AL)=? 012930h31h32h...39h2000H......(AL)=32H=’2’(2)输入输出指令(I/O指令)I/O指令是专门面向输入输出端口进行读写的指令,共有2条:IN和OUT。输入指令IN用于从I/O端口读数据到累加器AL(或AX)中。输出指令OUT用于将累加器AL(或AX)中的数据写到I/O端口。只有累加器AL(或AX)才能与I/O端口进行数据传送,所以这2条指令也称为累加器专用传送指令。(2)输入输出指令(I/O指令)8086/8088系统可连接多个外设端口,可以像存储器一样用不同的地址来区分它们,8086/8088的I/O指令中,只允许用两种寻址方式:①直接寻址方式:指令中包含了一个8位的I/O端口地址,允许寻址256个端口,端口地址为0~0FFH。②寄存器间接寻址方式:端口地址由DX寄存器指定,可寻址64K个端口(0~0FFFFH)。间接寻址的适用范围较大,在编写程序时要尽量采用这种方式。1)输入指令IN(Intput)指令格式及操作如下。① INAL,PORT;直接寻址,PORT为8位立即数,表示端口地址,从PORT端口读一个字节送AL。 INAX,PORT;直接寻址,从PORT和PORT+l两个端口读一个字送AX。② INAL,DX;间接寻址,16位端口地址由DX指出,从(DX)所指的端口读一个字节送AL INAX,DX;间接寻址,从(DX)和(DX+1)所指的两个端口读一个字到AX,;低地址端口的内容送入AL,高地址端口的内容送入AH下面是用IN指令从输入端口读取数据的几个具体例子:INAL,0F1H ;AL←从F1H端口读入一个字节INAX,80H ;AL←80H口的内容,AH←81H 端口的内容MOVDX,3l0H ;端口地址310H先送入DX中 INAL,DX ;AL←310H端口的内容
2)输出指令OUT(Output)指令格式及操作如下。①OUTPORT,AL ;将AL中的一个字节输出到PORT
端口
OUTPORT,AX ;将AX中的一个字输出到PORT和
PORT+l两个端口②OUTAL,DX ;DX中为端口地址,将AL中的字节送(DX)所指的端口OUTAX,DX ;将AX中的字送(DX)和(DX)+l所指的两个端口
如下面是几个用OUT指令对输出端口进行操作的例子:OUT85H,AL ;85H端口←AL内容MOVDX,0FF4H OUTDX,AL ;FF4H端口←AL内容MOVDX,300H ;DX指向300H OUTDX,AX ;300H端口←AL内容,
301H端口←AH内容3.地址传送指令1)LEA(LoadEffectiveAddress)取有效地址指令格式:LEAreg16,mem;(reg16)←mem的偏移地址功能:取源操作数的偏移地址,并把它传送到目的操作数制定的寄存器。LEA指令要求源操作数必须是存储单元,而且目的操作数必须是一个除CS之外的16位寄存器。注意它与MOV指令的区别,MOV指令传送的一般是源操作数中的内容而不是地址如:假设:SI=1000H,DS=5000H,(51000H)=34H,(51001H)=12H执行指令LEABX,[SI]后,BX=1000H;执行指令MOVBX,[SI]后,BX=1234HLEA指令也可用取偏移地址的MOV指令代替。LEABX,[1010H]MOVBX,OFFSET[1010H]上述两条指令等效。其中OFFSET[1010H]表示存储器操作数[1010H]的偏移地址。2)LDS(LoadPointerusingDS)将双字指针送到寄存器和DS指令(自学)3)LES(LoadPointerusingES)将双字指针送到寄存器和ES指令(自学)1)LAHF(LoadAHfromFlags)标志寄存器低8位为送入AH2)SAHF(StoreAHintoFlags)AH送标志寄存器低8位4.标志传送指令3)PUSHF(PushFlagsontoStack)标志寄存器入栈指令格式:PUSHF操作:(SP)←(SP)-2,((SP))←(FLAGS低字节),((SP)+1)←(FLAGS高字节)4)POPF(PopFlagsoffStack)标志出栈指令格式:POPF执行操作:(FLAGS低字节)←((SP)),(FLAGS高字节)←((SP)+1),(SP)←(SP)+2。成对的使用PUSHF和POPF指令,可对标志寄存器进行保存和恢复,常用在过程(子程序)调用和中断服务程序的开头与结尾处,对进行过程调用或发生中断时主程序的状态(即标志位)进行保护。
4.4.2算术运算指令8086/8088指令系统提供了加、减、乘、除四种基本运算指令,可处理无符号或带符号的8位或16位二进制数的算术运算还提供了各种调整操作指令,可进行压缩的或非压缩的十进制数的算术运算。1.加法指令ADD(Addition)加法指令格式:ADDDST,SRC操作:DST←SRC+DSTADC(AdditionwithCarry)带进位的加法指令格式:ADCDST,SRC操作:DST←DST+SRC+CF
说明:这两条指令的SRC可以是reg、mem或imm,DST只能用seg和存储单元源和目的操作数不能同时为存储器,且类型必须一致。这两条指令影响的标志位为:CF、OF、PF、SF、ZF和AF列举上述两种加法指令的实例,以说明它们的用法。ADDAL,18H ;AL←AL+18HADCBL,CL ;BL←BL+CL+CFADDAL,COST[BX] ;将AL内容和逻辑地址=DS:(COST+BX)的存储单元内容相加结果送到AL中
INC(Increment)增量指令格式:INCOPR操作:OPR←OPR+1说明:相当于C语言中++。该指令主要用在循环程序中对地址指针和循环计数器等进行修改。指令执行后影响AF、OF、PF、SF和ZF,但CF不受影响BCD码运算调整指令——AAA,DAA(难点)人类习惯十进制运算,而计算机习惯二进制运算,如果让计算机完成十进制运算有两种方法:先将十进制数转化为二进制数,然后运用相关指令得到二进制结果,再将结果转化为十进制数。先将十进制数用BCD码表示,然后运用相关指令得到结果的BCD码,再将结果解码为十进制数。压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,如:0000表示0、0001表示1、0010表示2、...、1000表示8、1001表示9一个字节可以表示两个十进制位,即00~99非压缩BCD码用8个二进制位表示一个十进制位,高4位为0,低4位表示一个十进制位0~9,如:00000000表示0,00000001表示1,00000010表示2,...,00001000表示8,00001001表示9一个字节只能表示一个十进制位,即0~9分为非压缩BCD码和压缩BCD码BCD码(BinaryCodedDecimal)示例见下页。。。BCD码(BinaryCodedDecimal)真值 864二进制数(一个字节)08H40H非压缩BCD码00001000B即08H0604H压缩BCD码1000B即8H64H
00001000
+0000100100010001=(17)10例如:计算8+9方法1:转化为二进制进行加法:例如:计算8+900001000非压缩BCD码(非压缩BCD码+)
00001001非压缩BCD码0000000100000111非压缩BCD码=(17)10如何实现上述非压缩BCD码加法呢?方法2:转化为非压缩BCD码进行加法,即8的非压缩BCD加9的非压缩BCD码等于17的非压缩BCD码,如下所示:4)非压缩BCD码加法调整AAA由左边的程序可知,非压缩BCD码加法是通过间接的方法实现的:先把非压缩BCD码按二进制用ADD指令相加,然后使用AAA指令对相加的结果进行调整,最后得到和的非压缩BCD码。详细过程见下页。。。例:用非压缩BCD码计算8+9: MOVAL,08H MOVBL,09H ADDAL,BL
AAA上述程序段执行后AX的内容即为和的非压缩BCD码0107H本例中AAA的调整过程为什么要加6:ADD指令逢十六进一,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调正。例:用非压缩BCD码计算8+9: MOVAL,08H MOVBL,09H ADDAL,BL AAA08H09HALBL07H01HAX--------------------------+11HAL--------------------------+06H17HAL简而言之,非压缩BCD码加法是通过ADD(或ADC指令)与AAA指令这两条指令一起实现的。AAA的详细调整过程:P96例:用压缩BCD码计算18+29: MOVAL,18H MOVBL,29H ADDAL,BL
DAA上述程序段执行后AL的内容即为和的压缩BCD码47H5)压缩BCD码加法调整DAA与非压缩BCD码加法类似,压缩BCD码的加法是也通过间接的方法实现,即通过ADD(或ADC指令)与DAA指令这两条指令一起实现的。DAA的详细调整过程:P972.减法指令1)SUB(Subtraction)不带借位的减法指令格式:SUBDST,SRC操作:DST←DST-SRC。如:SUBDX,1850H ;DX←DX-1850HSUBBL,[BX] ;BL中内容减去逻辑地址DS:(BX)处 的字节,结果存入BL
2)SBB(SubtractwithBorrow)带借位的减法指令格式:SBBDST,SRC操作:DST←DST-SRC-CF。SBB主要用于多字节减法中。3)DEC(Decrement)减1指令格式:DECOPR操作:OPR←OPR-1。如:DECBX ;BX←BX-1DECWORDPTR[BP] ;堆栈段中位于[BP]偏置处 的字减14)NEG(Negate)取负指令格式:NEGOPR操作:OPR←0-OPR(或OPR←-OPR)。如:NEGAX;将AX中的数取负(正数变负数,负数变正数)NEGBYTEPTR[BX];对数据段中位于[BX]偏置处的字节取负
格式:CMPdest,src操作:(dest)-(src)CMP也是执行两个操作数相减,但结果不送目标操作数,只根据结果设置相应的标志位。***通过标志位可以判断两个数的大小,详细见下页.......5)比较指令CMP根据标志位来判断比较的结果1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若两个数不相等,则分两种情况考虑:①比较的是两个无符号数若CF=0,则dest>src;若CF=1,则dest<src。②比较的是两个有符号数若OF⊕SF=0,则dest>src;若OF⊕SF=1,则dest<src。示例见下页。。。比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。举例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序:
CMPAL,BL;AL和BL比较
JLE
BBB
;若AL≤BL,则转XCHGAL,BL;若AL>BL,则交换BBB:CMPAL,CL;AL和CL比较
JLE
CCC;若AL≤CL,则转XCHGAL,CL;若AL>CL,则交换CCC:HLTCMP指令可以在不改变两个操作数的情况下通过标志位反映两个数的大小,这也是其指令名称compare的来由。6)AAS(ASCIIAdjustforSubtraction)减法的ASCII调整指令(自学)7)DAS(DecirnalAdjustforSubtraction)减法的十进制调整指令(自学)3.乘法指令(1)MUL(Multiply)无符号数乘法指令格式:MULSRC操作:SRC为字节操作数:AX←AL×SRCSRC为字操作数:(DX,AX)←AX×SRC(操作数和乘积均为无符号数)SRC可以是寄存器,或是存储单元,但不能是立即数。当SRC是存储器操作数时,必须在操作数前加B或W说明是字节还是字。如:MULDL ;AX←AL×DLMULCX ;(DX,AX)←AX×CXMULBYTE[SI];AX←AL×(内存中某字节),BYTE说明字节 乘法MULWORD[BX];(DX,AX)←AX×(内存中某字),WOR说明字 乘法
(2)IMUL(IntegerMuliply)带符号数乘法指令格式:IMULSRC操作:同MUL指令。功能:把乘数和累加器中的数都作为带符号数,进行相乘。乘积的符号符合一般代数运算规则。例4-12设AL=-28H,BL=59H,试写出它们乘积的指令代码。解:指令代码如下:
IMULBL结果为:AX=F98CH=-1652(3)AAM(ASCIIAdjustforMultiply)乘法的ASCII调整指令(自学)4.除法指令(1)DIV(Divisionunsigned)无符号数除法指令格式:DIVSRC操作:SRC为字节除数:AL←AX/SRC的商AH←AX/SRC的余数。SRC为字除数:AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余数。说明:被除数,除数、商及余数均为无符号数。(2)IDIV(IntegerDivision)带符号整数除法指令格式:IDIVSRC操作:字节除数:AL←AX/SRC的商;AH←AX/SRC的余数。字除数:AX←(DX,AX)/SRC的商;DX←(DX,AX)/SRC的余数。说明:被除数,除数、商及余数均为带符号数,商的符号符合一般代数运算的符号规则,余数的符号与被除数相同。商超过了目标寄存器AL或AX所能存放数的范围。这时系统会自动产生一个中断类型号为0的除法错中断,相当于执行了除数为0的运算,所得的商和余数都不确定。
例4-14两个无符号数7A86H和04H相除的商应为1EA1H,若用DIV指令写出其代码。解:指令代码如下:
MOVAX,7A86H MOVBL,04H DIVBL这时,由于BL中的除数04H为字节,被除数AX为字,商1EAlH大于AL中能存放的最大无符号数FFH,结果将产生除法错误中断。
(3)AAD(ASCIIAdjustforDivision)除法的ASCII调整指令(自学)5.符号扩展指令这类指令的功能是对操作数最高位进行扩展,用于处理带符号数运算时的操作类型匹配问题。CBW(ConvertBytetoWord)把字节扩展为字指令格式:CBW功能:AL中字节的符号位扩展到AH中(即把AL中的最高位送入AH的所有位)CWD(ConvertWordtoDoubleWord)把字扩展成双字指令格式:CWD功能:把AX中字的符号位扩展到DX中(即把AH中的最高位送入DX的所有位)标志:不影响任何标志位例4-16编程求-38/3的商和余数。解:指令代码如下:MOVAL,11011010B ;被除数-38MOVCH,00000011B ;除数+3CBW ;将AL符号扩展到AH中,使AX=11111111l1011010BIDIVCH ;AX/CH,AL=11110l00B=-
12(商),AH=11111110B=-2(余数)
4.4.3逻辑运算与移位指令逻辑运算和移位指令对字节或字操作数进行按位操作,这类运算可分成:逻辑运算(LogicalOperations)算术逻辑移位(shiftArithmeticandShiftLogical)循环移位(Rotate)1.逻辑运算指令表4-7逻辑运算指令名称格式操作对标志位的影响OFSFZFAFPFCF逻辑非NOTOPROPR按位求反送OPR――――――逻辑与ANDDST,SRCDSR←DST∧SRC0××u×0逻辑或ORDST,SRCDSR←DST∨SRC0××u×0逻辑异或XORDST,SRCDSR←DST∨SRC0××u×0逻辑测试TESTOPR1,OPR2DST∧SRC0××u×0注:-表示对该标志位无影响;×表示根据操作结果设置标志;u表示操作后标志值无定义;0表示清除标志位为0逻辑与:对操作数的某几位清零(与0与),保留其它位(与1与)。例:对AL高4位清0,保留低4位。ANDAL,0FH逻辑运算指令的用途逻辑或:对操作数的某几位置1(与1或),保留其他位(与0或)。例:把AL的第5位置1,其他位保留。ORAL,00100000B逻辑运算指令的用途逻辑异或:对操作数的某几位取反(与1异或),保留其他位(与0异或)。逻辑运算指令的用途例1:把DH的第4,3位变反XORDH,18H例2:把AX寄存器清零 ①MOVAX,0 ②SUBAX,AX ③ANDAX,0 ④XORAX,AX例4-17设AX中存有数字5和8的ASCII码,即AX=3538H,要将它们转换成BCD码,并把结果仍放回AX,写出其指令代码?解:实现指令为:ANDAX,0F0FH;AX←0508H例4-18假设AX中存有两个BCD数0508H,要将它们分别转换成ASCII码,结果仍在AX中,写出其指令代码?解:实现指令为: ORAX,3030H;AX←3538H例4-19若AL中存有某外设端口的状态信息,其中D1位控制扬声器发声,要求该位在0和1之间来回变化,原来是1变成0,原来是0变成1,其余各位保留不变,写出其指令代码?解:实现指令为:XORAL,00000010B
表4-8算术逻辑移位指令名称格式操作对标志位的影响OFSFZFAFPFCF算术左移SALDST,CNT×
×
×
u
×
×逻辑左移SHLDST,CNT×
×
×
u
×
×算术右移SARDST,CNT×
×
×
u
×
×逻辑右移SHRDST,CNT×
×
×
u
×
×2.算术逻辑移位指令MSB←LSBCF0MSB→LSBCFMSB←LSBCF0MSB→LSBCF0移位指令实现对操作数的移位操作逻辑移位把操作数看成无符号数来移位,右移时,最高位补0,左移时,最低位补0。算术移位则把操作数看做有符号数,右移时最高位(符号位)保持不变,左移时,最低位补0。SHL和SAL两条指令的功能完全相同,在机器中实际对应同一种操作。CNT为移位计数值CL;移位位数大于1时1;移位位数等于1时表4-8中的DST可以是8位、16位寄存器或存储器操作。例4-20用移位指令将AL中的高4位和低4位内容互换。(如:1010010101011010)解:代码段如下:MOVAH,AL;将AL中的内容复制到AHMOVCL,4;设置移位次数SHLAL,CL;将AL中的低4位移至高4位,其低4位变为0000SHRAH,CL;将AH中的高4位移至低4位,其高4位变为0000ORAL,AH;AL中的高、低4位内容互换
表4-9循环移位指令名称格式操作对标志位的影响OFSFZFAFPFCF循环左移ROLDST,CNT×
-
-
-
-
×循环右移RORDST,CNT×
-
-
-
-
×带进位的循环左移RCLDST,CNT×
-
-
-
-
×带进位的循环右移RCRDST,CNT×
-
-
-
-
×3.循环移位指令算术逻辑移位指令,移出操作数的数位均被丢失,而循环移位指令把操作数从一端移到操作数的另一端,这样从操作数中移走的位就不会丢失了
MSB←─LSBCFMSB─→LSBCFMSB─→LSBCFMSB←─LSBCF例4-21用循环移位指令实现例4-20的功能。MOVCL,4RORAL,CL;也可以用“ROLAL,CL”指令实现
4.4.4串操作指令(自学)4.4.5控制转移指令程序中的指令默认情况下是顺序逐条执行的。利用控制转移指令可以改变CS和IP的值,从而改变指令的执行顺序。8086提供了如下几种转移指令:
无条件转移(UnconditionalTransfer)过程调用(CallandReturn)条件转移(ConditionalTransfer)循环控制(IterationControl)中断(Interrupt)1.无条件转移和过程调用指令(1)JMP(Jump)无条件转移指令这类指令又分成2种类型:第一种类型:段内转移或近(NEAR)转移,转移指令的目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。代码段1.无条件转移和过程调用指令(1)JMP(Jump)无条件转移指令代码段代码段—第二种类型:段间转移,又被称之为远(FAR)转移,转移指令的目的地址和JMP指令不在同一段中,发生转移时,CS和IP的值都要改变,也就是说,程序要转移到另一个代码段去执行。
1.无条件转移和过程调用指令(1)JMP(Jump)无条件转移指令无条件转移指令可分成段内直接转移段内间接转移段间直接转移段间间接转移1)段内直接转移指令近转移格式:JMP标号
(或JMPNEARPTR标号)ADD AL,BL ;两数相加 JC NEXT ;若有进位,转NEXT MOV AH,0 ;无进位,AH清0
JMP EXIT ;往下执行NEXT:MOV AH,1 ;有进位,AH置1EXIT:HLT ;停机1)段内直接转移指令短转移格式:JMPSHORT标号2)段内间接转移指令(自学)3)段间直接(远)转移指令(自学)4)段间间接转移指令(自学)(2)过程调用CALL和返回RET指令
在编程时,往往把某些完成特定功能而又经常要用到的程序段,编写成独立的模块,把它称为过程(Procedure),也称作子程序(Subroutine)。然后在程序中用CALL语句调用这些过程,调用过程的程序称为主程序。过程以语句PROC开头,用语句ENDP结束。在ENDP之前要放一条过程返回指令RET,它与CALL指令相呼应,使过程执行完毕后,能正确返回主程序中紧跟在CALL指令后面的那条指令继续运行。过程定义的一般格式如下所示:Proc_APROCNEAR或FAR …… ┋ …… RET ENDP 其中Proc_A为过程名,NEAR或FAR为属性参数,PROC和ENDP为伪指令。8086系统把处于当前代码段的过程称为近过程,可通过NEAR属性参数定义,而把处于其它代码段的过程称为远过程,可通过FAR属性参数定义。CALL指令的常用格式:CALLsub_proc;sub_proc为子程序名功能:过程调用指令CALL迫使CPU暂停执行下一条顺序指令,而把下一条指令的地址压入堆栈,这个地址称为返回地址。返回地址压栈保护后,CPU会转去执行指定的过程。等过程执行完毕后,再由过程返回指令RET从堆栈顶部弹出返回地址,从而从CALL指令的下一条指令继续执行。编译汇编程序时,子程序名sub_proc会被该子程序的地址(即其第一条指令的地址)所取代。调用子程序就相当于跳转到子程序的第一条指令处开始执行。与JMP指令类似,子程序的调用也分成2种情况:代码段代码段代码段①段内调用——只改变IP,CS不变②段间调用——同时改变IP,CS功能:恢复调用之前的主程序的执行位置,以便继续执行主程序。指令RET的操作为:如果是段内返回,则从堆栈中弹出调用之前压入的IP。如果是段间返回,从堆栈中弹出调用之前压入的IP和CS。返回指令RET条件转移指令是根据上一条指令执行后,CPU设置的状态标志作为判别测试条件来决定是否转移。当它的测试条件成立,便控制程序转向指令中给出的目的地址,去执行那里的指令,否则,程序仍顺序执行。格式:
Jxx
标号 ;xx为条件名称缩写条件转移指令共有18条,可以归类成以下两大类:标志转移指令间接标志转移指令2、条件转移指令——Jxx(1)标志转移指令这类指令直接给出标志状态的测试条件,以CF、ZF、SF、OF和PF等5个标志的10种状态为判断条件,共形成10条指令:JC ;CF=1,则转移JNC ;CF=0,则转移JP/JPE;奇偶标志PF=1(偶),则转移JNP/JPO;奇偶标志PF=0(奇),则转移JZ/JE;结果为零(ZF=1),则转移JNZ/JNE;结果不为零(ZF=0),则转移JS;SF=1,则转移JNS;SF=0,则转移JO ;OF=1,则转移JNO ;OF=0,则转移举例如下。。。例4-26求AL和BL寄存器中的两数之和,若有进位,则AH置1,否则AH清0。请写出其代码?解:可用如下程序段来实现该操作: ADD AL,BL ;两数相加
JC NEXT ;若有进位,转NEXT MOV AH,0 ;无进位,AH清0 JMP EXIT ;往下执行NEXT:MOV AH,1 ;有进位,AH置1EXIT:HLT ;停机(2)间接标志转移间接转移指令通常放在比较指令CMP之后,通过测试状态位来比较两个数的大小。格式:CMPdest,src ;比较
Jxx标号 ;根据比较结果转移对两个无符号数进行比较后,一定要用无符号数比较测试指令决定程序走向;对带符号数比较后,则要用带符号数比较测试指令。使用时要严格加以区分,否则会得到错误的结果。判断无符号数的大小——无符号数的大小用高(Above)低(Below)表示,常用的有如下4条指令:JA 高于则转移(dest>src) 转移条件为:CF=0∧ZF=0JAE 高于或等于则转移(dest≥src) 转移条件为:CF=0JB 低于则转移(dest<src) 转移条件为:CF=1JBE 低于或等于则转移(dest≤src
) 转移条件为:CF=1∨ZF=1(2)间接标志转移指令例:ax和bx中有两个无符号数,比较这两个无符号数,将较大的存ax中
cmpax,bx ;比较ax和bx
jaenext ;若ax≥bx,转移
xchgax,bx ;若ax<bx,交换next:hlt ;停机结果:ax保存较大的无符号数——有符号数的大小用大(Greater)小(Less)表示,常用的有如下4条指令:JG大于则转移(dest>src)
转移条件为:(SF⊕OF=0)∧ZF=0JGE 大于或等于则转移(dest≥src)
转移条件为:(SF⊕OF=0)∨ZF=1JL 小于则转移(dest<src)
转移条件为:(SF⊕OF=1)∧ZF=0JLE小于或等于则转移(dest≤src)
转移条件为:(SF⊕OF=1)∨ZF=1
判断有符号数的大小例:ax和bx中有两个有符号数,比较两个有符号数,将较大的存ax中
cmpax,bx ;比较ax和bx
jgenext ;若ax≥bx,转移
xchgax,bx ;若ax<bx,交换next:hlt ;停机结果:ax保存较大的有符号数3.循环控制指令循环控制指令是一组增强型的条件转移指令,用来控制一个程序段的重复执行,重复次数由CX寄存器中的内容决定。循环控制指令均不影响任何标志,这类指令共有4条:LOOP循环指令(LOOP)
LOOPE/LOOPZ(LoopIFEqual/Zero)LOOPNE/LOOPNZ(LoopIfNOTEqual/NOTZero)JCXZ(JumpIfCXZero)(1)LOOP循环指令(LOOP)格式:LOOP标号功能:这条指令用于控制重复执行一系列指令。执行前事先将重复次数放在CX寄存器中,每执行一次LOOP指令,CX自动减1。如果减1后CX≠0,则转移到指令中给定的标号处继续循环;若自动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省洪江市中考数学真题分类(平行线的证明)汇编章节测试试卷(详解版)
- 饮食招商加盟合同范本
- 考点解析湖南省津市市7年级上册期中测试卷综合练习练习题(解析版)
- 财务政策及福利解读
- 产后手术意外应急预案演练脚本(2篇)
- 2025年口腔科根尖周病治疗情境模拟测验题答案及解析
- 反射炉工专项考核试卷及答案
- 职业环境相关知识培训课件
- 考点解析-华东师大版7年级下册期末测试卷【研优卷】附答案详解
- 氟化盐生产工设备维护与保养考核试卷及答案
- 产品美工面试题及答案
- 部编版语文四年级上册第一单元大单元教学设计
- 老年慢性病的中药调理方法
- 典当黄金合同标准文本
- 旧厂房改造施工安全措施
- 内镜中心标本遗失警示教育
- 高中数学(沪教版)知识点梳理
- 食堂服务礼仪培训
- 书法第一课课件-【知识精研】小学生书法版
- 老年髋部骨折诊疗指南
- 人教版四年级上册数学第五单元教案
评论
0/150
提交评论