第三章-80x86指令系统_第1页
第三章-80x86指令系统_第2页
第三章-80x86指令系统_第3页
第三章-80x86指令系统_第4页
第三章-80x86指令系统_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

主要内容8086指令格式和寻址方式操作数的寻址方式转移地址的寻址方式8086指令系统数据传送指令算术运算指令位操作指令串操作指令控制转移指令处理器控制指令115一条指令对应一种规定操作,设计微处理器时已经设计好!3.18086/8088指令系统的寻址方式1.操作数的种类指令中操作的对象数据操作数地址操作数立即数操作数:指令中要操作的数据在指令中。寄存器操作数:指令中要操作的数据在指定的寄存器中。存储器操作数:指令中要操作的数据存放在指定的存储单元中。I/O操作数:指令中要操作的数据来自或送到I/O端口。:程序要转移的目标地址立即数操作数寄存器操作数存储器操作数有的指令有2个操作数,分别为源操作数和目的操作数;有的指令有1个操作数,或没有操作数。指令只有一个目的操作数地址2.寻址方式所谓寻址方式是指指令中给出的寻找操作数(包括数据操作数和地址操作数)的方法。1)数据寻址方式(1)立即数寻址方式所提供的操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分。立即数可以是8位;也可以为16位,高位字节存放在高地址存储单元,低位字节存放在低地址单元MOVBL,80HMOVAX,1090H只适用于双操作数指令中的源操作数寻址,而且多用来为寄存器赋初值或者目的操作数与一个常数运算。80HAH10HAL90H(2)寄存器寻址方式操作数存放在指令规定的寄存器中,寄存器的名字在指令中给出。16位操作数,寄存器为AX、BX、CX、DX、SI、DI、SP、BP8为操作数,寄存器为AH、AL、BH、BL、CH、CL、DH、DLMOVCL,DLMOVAX,BX假设(DL)=50H,(BX)=1234H50HAH12HAL34H若指令的源操作数和目的操作数都采用寄存器寻址方式,由于除取指操作外,不需要访问存储器,因而指令执行的速度快。寄存器数量越多,程序的执行速度越快。(3)存储器寻址方式操作数存放在存储单元中。唯一性?由段地址左移4位与操作数在段内的偏移地址相加得到的。存储器操作数在段内的偏移地址(EA)位移量(Displacement):存放在指令中的一个8位或16位的数,

但不是立即数,而是一个地址。基址(BaseAddress):存放在基址寄存器BX或BP中的内容。变址(IndexAddress):存放在变址寄存器SI或DI中的内容。直接寻址方式寄存器间接寻址方式寄存器相对寻址方式基址变址寻址方式基址变址相对寻址方式①直接寻址方式(DirectAddressing)操作数位于存储器中,指令中给出存储器的地址,且为段内偏移(有效地址)。操作数的完整地址还应包含段地址,若无特殊说明,隐含的段地址由DS寄存器提供。EA=位移量例:MOVAL,[1064H]表示地址时,必须加上方括号若(DS)=2000H,执行情况如图所示:45H8086/8088允许段超越MOVAL,ES:[1064H]ES:MOV[1064H],AX在汇编语言指令中,可以用符号地址表示位移量:MOVAL,[Value]或MOVAL,value②寄存器间接寻址方式操作数位于存储器中,该存储器的地址存放于指令指定的寄存器中,指令对存储器中的内容进行运算。若无特殊说明,隐含的段地址由DS提供,只有BP做间接寻址的时候,隐含的段地址为SS。EA=(SI)源变址寄存器(DI)目的变址寄存器(BX)基址寄存器(BP)基地址指针寄存器用作间址的寄存器必须加上方括号存储器…50H40H30000H32000HAX(DS)×10H=30000H(SI)=2000H32000H+存储器…30000H31000HAL50H(DS)×10H=30000H(BX)=1000H31000H+例:MOVAX,[SI]MOV[BX],AL若(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64HAH40HAL50H50H执行结果(AX)=4050H执行结果(31000)H=50H寄存器间接寻址允许段超越:MOVES:[DI],AXEA=(SI)源变址寄存器(DI)目的变址寄存器(BX)基址寄存器(BP)基址地址指针寄存器+disp-8/disp-16③寄存器相对寻址方式操作数位于内存单元中,若指令中规定的寄存器为SI、DI、BX,则操作数默认存在数据段中;若指令中规定的寄存器是BP,则操作数默认存在堆栈段中。指令书写形式:MOVAL,[BP+TABLE]MOVAL,[BP]+TABLEMOVAL,TABLE[BP]其中TABLE是一个8位或16位的位移量。此方式常用于访问一维表格和数组的元素,用表格和数组首地址(是一个具体的地址值,表明数组或表格第一个元素在数据段中的段内偏移)作偏移量,基址寄存器存放数组元素的下标,指明被访问元素在表格或数组中的位置。允许段超越CX操作码50H10H存储器…30H30000H32050H+操作码40H(DS)×10H=30000H(BX)=1000HCOUNT=1050H32050H50HAX操作码10H存储器…30000H32010H+操作码(DS)×10H=30000H(SI)=2000H10H32010H40HMOV[SI+10H],AXMOVCX,[BX+COUNT]若(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H50H40HCH40HCL30H执行结果:(32010H)=4050H执行结果(CX)=4030H④基址变址寻址方式操作数位于内存单元中EA=(SI)源变址寄存器(DI)目的变址寄存器+(BX)基址寄存器(BP)基址指针寄存器一般情况下,由基址寄存器决定操作数在哪个段中:BX的内容作为基址操作数在数据段中BP的内容作为基址操作数在堆栈段中此寻址方式可用于处理一维表格或数组,基址寄存器存放数组首址,变址寄存器存放欲访问元素在数组中的位置(下标);也可用于处理二维表格或数组,要求二维数组位于指令规定的段的开始,基址寄存器和变址寄存器分别存放数组元素的行列下标。指令书写形式:

MOVAX,[BP+SI]MOVAX,[BP][SI]允许段超越MOV[BX+DI],AXMOVAH,[BP][SI]若(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H,(BP)=2000H,(SI)=1200H存储器…56H40000H43200HAH(SS)×10H=40000H(BP)=2000H(SI)=1200H43200H+存储器…30000H32100H00HAX50H(DS)×10H=30000H(BX)=1000H(DI)=1100H32100H+50H00H56H执行结果:(32100H)=0050H执行结果(AH)=56H⑤基址变址相对寻址方式操作数位于内存单元中EA=(SI)源变址寄存器(DI)目的变址寄存器+(BX)基址寄存器(BP)基地址指针寄存器+disp-8/disp-16基址寄存器为BX时操作数在数据段中基址寄存器为BP时操作数在堆栈段中此寻址方式常用于处理二维表格或数组。表格或数组的首址作偏移量,基址寄存器和变址寄存器存放数组的行、列下标,指明元素在数组中的位置。指令书写形式:MOVAX,[BX+SI+COUNT]MOVAX,[BX][SI+COUNT]MOVAX,[BX+SI]COUNTMOVAX,[BX][SI]COUNTMOVAX,COUNT[BX][SI]允许段超越MOVAH,[BX+DI+1234H]MOV[BP+SI+DATA],CX若(DS)=4000H,(SS)=5000H,(BX)=1000H,(DI)=1500H,(BP)=2000H,(SI)=1050H,(CX)=2050H,DATA=10H存储器…64H40000H43734HAH(DS)×10H=40000H(BX)=1000H(DI)=1500H1234H43734H+存储器…50000H53060H20HCX50H(SS)×10H=50000H(BP)=2000H(SI)=1050HDATA=10H53060H+64H50H20H执行结果:(AH)=64H执行结果:(53060H)=2050H寻址方式源操作数格式使用段寄存器指令举例立即数寻址data(CS)MOVAX,1064H寄存器寻址r无MOVAH,AL直接寻址[data]DSMOVAX,[1064H]

存储器寻址寄存器间接寻址[SI]、[DI]、[BX][BP]DSSSMOVAX,[SI]寄存器相对寻址[BX]+disp[SI]+disp[DI]+disp[BP]+dispDSDSDSSSMOVAX,[BX]+1064H基址变址寻址[BX]+[SI][BX]+[DI][BP]+[SI][BP]+[DI]DSDSSSSSMOVAX,[BX][SI]基址变址相对寻址[BX]+[SI]+disp[BX]+[DI]+disp[BP]+[SI]+disp[BP]+[DI]+dispDSDSSSSSMOVAX,[BX][DI]+1064H(4)I/O端口寻址方式端口直接寻址方式端口间接寻址方式①端口直接寻址方式端口地址用8位(0~255)立即数INAL,21H7FH②端口间接寻址方式当端口地址大于FFH时,必须事先将端口地址放在DX寄存器MOVDX,120HOUTDX,AX10F0H2)地址寻址方式找出程序转移的地址。转移地址可以在段内(段内转移);转移地址也可以跨段(段间转移)。仅更改IP的内容。(1)段内直接寻址方式(相对寻址方式)指令内含有目标地址距本转移指令的偏移量。该偏移量是8位或16位的有符号数,正数表明要向前转移,常用于跳过一段程序;负数表明要向回转移,常用于构成循环!当位移量是8位时,称为短转移,转移范围为-128~+127;位移量是16位时,称为近转移,转移范围为-32768~+32767。此寻址方式适用于无条件转移或条件转移JMPNEARPTRPROGIA如果位移量为16位,目标地址前加操作符NEARPTRJMPSHORTQUEST如果位移量为8位,目标地址前加操作符SHORT如果目标地址标号已经定义,可不写SHORT(2)段内间接寻址程序转移地址存放在寄存器或存储单元中,存储器可用各种数据寻址方式表示,仅更改IP的内容。指令格式:JMPBXJMPWORDPTR[BP+TABLE]WORDPTR为操作符,用以指出其后的寻址方式所取得的目标地址是一个字的有效地址。(3)段间直接寻址方式指令中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP的内容。指令格式:JMPLABEL_NAMEJMPFARPTRNEXTROUTINT(4)段间间接寻址由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是将存储器的前两个单元的内容送给IP,后两个单元的内容送给CS。指令格式:JMPVAR_DOUBLE

WORDJMPDWORDPTR[BP][DI]此三种方式都不可用于条件转移指令转移范围寻址方式段内转移(段内偏移送入IP)段间转移(段地址送CS,段内偏移送IP)直接方式(指令中直接给出目标地址或目标地址距当前IP的偏移量)段内直接寻址(相对寻址)Eg:JMP0136JMP1000段间直接寻址Eg:JMPFFFF:0000间接方式(指令中给出存放目标地址的寄存器或存放目标地址的存储单元的地址)段内间接寻址Eg:JMPBXJMP[BX]JMP[0136]段间间接寻址Eg:JMPFAR[BX]JMPFAR[0136]转移指令目标地址的寻址方式寻址方式数据寻址方式地址寻址方式立即数寻址方式寄存器寻址方式存储器寻址方式I/O端口寻址方式直接寻址方式寄存器间接寻址方式寄存器相对寻址方式基址变址寻址方式基址变址相对寻址方式端口直接寻址方式端口间接寻址方式段内直接寻址方式段内间接寻址方式段间直接寻址方式段间间接寻址方式3.28086/8088指令系统数据传送类指令算术运算类指令位操作指令串操作指令程序控制指令处理器控制指令通用数据传送指令输入输出指令目标地址传送指令标志传送指令对状态标志位不发生影响!1、数据传送指令数据传送指令MOV堆栈操作指令数据交换指令XCHG字节转换指令XLAT压入堆栈指令PUSH弹出堆栈指令POP输入指令IN输出指令OUT取有效地址指令LEA地址指针装入DS指令LDS地址指针装入ES指令LES取标志指令LAHF置标志指令SAHF标志压入堆栈指令PUSHF标志弹出堆栈指令POPF通用数据传送指令输入输出指令目标地址传送指令标志传送指令1、数据传送指令1)通用数据传送指令(1)数据传送指令MOV(MOVement)指令格式及操作:MOVdst,src;(dst)←(src)dst表示目的操作数,src表示源操作数源操作数可以是:立即数、寄存器以及各种寻址的内存单元内容。源操作数和目的操作数不能同时为内存单元。目的操作数可以是寄存器或者各种寻址的内存单元。不可以是立即数、IP、CS。正确的指令举例:MOVAL,BL ;BL中的8位数送ALMOVDS,AX;AX中的16位数送DSMOV[DI],AX;累加器内容送DI和DI+1所指的两个单元(数据段)MOVCX,[1000H];将数据段1000和1001两单元内容送CXMOVBL,20H;将立即数20H送BLMOVDX,5020H;将立即数5020H送DXMOVAX,[BP+SI+04H];将(BP+SI+4)和(BP+SI+5)两单元(堆栈段);内容送AX以下的指令是错误的:MOV52H,AHMOVCS,AXMOV[DI],[SI]MOV[1000],[SI]MOVIP,BX;立即数不能作为目的操作数;CS不能作为目的操作数;内存单元之间不能直接传送;内存单元之间不能直接传送;IP不能作为目的操作数(2)堆栈操作指令堆栈是按照“后进先出”原则使用的一片内存区域。数据装入堆栈的过程称为“压入(PUSH)”,从堆栈中取出数据的过程称为“弹出(POP)”。顺序:先压入堆栈的数据后弹出堆栈;后压入堆栈的数据将先弹出堆栈!堆栈SP栈底栈顶低地址高地址PUSHPOP8086的堆栈建立在内存的堆栈段中。堆栈的开辟和使用是借助于堆栈指针寄存器SP及相关硬件实现的。SP的内容指向栈顶内存单元的地址,SP初值指向的内存称为栈底。(用MOV指令更改SP的值,实际上就是从新设置栈底,开辟新的堆栈)。程序执行时,SP的值始终指向栈顶,当有数据压入堆栈时,SP的值向远离栈底的方向变化,SP值减小;当有数据弹出堆栈时,SP值向靠近栈底的方向变化,SP值增大。堆栈操作中的操作数类型必须是字操作数,即16位操作数。①压入堆栈指令PUSH(PUSHwordontostack)PUSHsrc;(SP)←(SP)–2,((SP)+1:(SP))←(src)先将堆栈指针SP减2,使SP始终指向栈顶,然后再将操作数src压入(SP)+1和(SP)两个存储单元PUSHAX ;(SP)←(SP)–2,(SP)+1←(AH),(SP)←(AL)PUSHCSPUSH[SI]源操作数可以为通用寄存器、段寄存器、某种寻址方式所指示的存储单元,但是不能为立即数!②弹出堆栈指令POP(POPwordoffstack)POPdst ;(dst)←((SP)+1,(SP)),(SP)←(SP)+2POPBXPOPES目的操作数可以为存储器、通用寄存器或段寄存器(但不能为CS),不能为立即数!在子程序的开头保护寄存器的顺序为:PUSHAXPUSHBXPUSHCXPUSHDX则子程序返回前,应按如下顺序恢复寄存器值:POPDXPOPCXPOPBXPOPAX(3)数据交换指令XCHG(eXCHanGe)XCHGdst,src ;(dst)←→(src)源操作数和目的操作数均可以是寄存器或存储器,但不能同时为存储器,而且,段寄存器的内容不能参加交换。交换的内容可以是一个字节,也可以是一个字!XCHGAL,BL ;AL和BL之间进行字节交换XCHGBX,CX;BX和CX之间进行字交换XCHG[2500H],DX;DX和2500H、2501两个单元内容交换(数据段)(4)字节查表转换指令XLAT(transLATe)XLATsrc_table ;(AL)←((BX)+(AL)) 字节查表转换指令,根据表中元素的序号,查出表中相应元素的内容。为了实现查表转换,预先应将表的首地址,即表头地址传送到BX寄存器,元素的序号即位移量送AL,表中第一个元素的序号为0,然后依次是1,2,3,…。执行XLAT指令后,表中指定序号的元素存于AL,AL中的内容被取代。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。利用XLAT指令实现不同数制或编码系统之间的转换。

被寻址表的最大长度为255个字节MOVBX,OFFSETHex_tableMOVAX,0AHXLATHex_table偏移地址XLATXLATsrc_tableXLATES:src_table;重设段寄存器ES,必须写操作数(AL)=41H2)输入输出指令输入指令从外设端口读入数据,输出指令向端口发送数据。无论是读入的数据或是准备发送的数据必须放在寄存器AL(字节)或AX(字)中。端口直接寻址的输入输出指令,可寻址256个端口(0~255)端口通过DX寄存器间接寻址的输入输出指令,可寻址64K个端口(0~65535)(1)输入指令IN(Inputbyteorword)

口地址为8位时,口地址直接出现在指令中。格式:INAX/AL,PORT8位口地址既可以传送8位数据,也可以传送16位数据,取决于具体设备的接口芯片。功能:从PORT口输入8位或16位数据到AL或AX寄存器。口地址为16位时,口地址存放在DX寄存器中。格式:INAX/AL,DX功能:从以DX内容为口地址的接口输入8位或16位数据到AL或AX寄存器。从DX和DX+1所指出的两个端口读一个字,较低地址端口中的值读到AL中,较高地址端口中的值读到AH中。(2)输出指令口地址为8位时,口地址直接出现在指令中。格式:OUTPORT,AX/AL功能:将AL或AX寄存器中的8位或16位数据输出到PORT口。口地址为16位时,口地址存放在DX寄存器中。格式:OUTDX,AX/AL功能:将AL/AX寄存器中的8位或16位数据输出到以DX内容为口地址的接口。将AL中的字节输出到DX所指的端口中,将AH中的字节输出到DX+1所指的端口中。3)目标地址传送指令(1)取有效地址指令LEA(LoadEffectiveAddress)指令格式: LEAreg16,mem

将近地址指针写入到指定的寄存器。

目的操作数必须为16位通用寄存器,源操作数必须是一个存储器操作数。结果是把源操作数的有效地址传送到目标寄存器。LEABX,BUFFER ;(BX)←OFFSETBUFFERLEAAX,[BP][DI] ;(AX)←(BP)+(DI)LEADX,BETA[BX][SI];(DX)←(BX)+(SI)+BETALEABX,BUFFERMOVBX,BUFFER前者将BUFFER的偏移地址送到BX;后者将存储器变量BUFFER的内容传送到BX。LEABX,BUFFERMOVBX,OFFSETBUFFER(2)地址指针装入DS指令LDS(LoadpointerDS)指令格式:LDSreg16,mem32用于写入远地址指针。源操作数是存储器操作数,目的操作数可以是任一个16位通用寄存器把一个存放在4个存储单元中共计32位的目标地址(段地址和偏移量)传送到两个目的寄存器,其中,后两个字节(高地址)内容,即段地址送到DS;前两个字节(低地址)内容,即偏移量送到指令中所出现的目的寄存器中。设当前(DS)=C000H,有关的存储单元的内容为(C0010H)=80H,(C0011H)=01H,(C0012H)=00H,(C0013H)=20H执行LDSSI,[0010H]C0010HC0011HC0012HC0013H20H80H01H00H送入SI送入DS执行完后(DS)=2000H(SI)=0180H(3)地址指针装入ES指令LES(LoadpointerintoES)指令格式:LESreg16,mem32与LDS类似,装入一个32位的远地址指针,位移地址送指定寄存器,段地址送附加段寄存器ES。mem内存单元内容(四个字节)分别赋值给reg寄存器和ES寄存器,低两字节送入reg寄存器,高两字节送入ES寄存器。LESreg,memmem内存单元内容(四个字节)分别赋值给reg寄存器和DS寄存器,低两字节送入reg寄存器,高两字节送入DS寄存器LDSreg,memmem内存单元的地址的段内偏移部分赋值给reg寄存器LEAreg,mem功能格式目标地址传送指令4)标志传送指令FLAGS,其中包括6个状态标志位和3个控制标志位。共有4条标志传送指令,都为单字节指令,指令的操作数为隐含形式。(1)取标志指令LAHF(LoadAHfromFlags)指令格式:LAHFAH××××OFDFIFTFSFZF×AF×PF×CFFLAGSSFZFAFPFCF(2)置标志指令SAHF(StoreAHintoFlags)指令格式:SAHFAHSFZFAFPFCF××××OFDFIFTFSFZF×AF×PF×CFFLAGSSAHF将影响标志寄存器(3)标志压入堆栈指令PUSHF(PUSHFlagsontostack)指令格式:PUSHF ;(SP)←(SP)−2,((SP)+1):(SP))←(FLAGS)(4)标志弹出堆栈指令POPF(POPFlagsoffstack)指令格式:POPF ;(FLAGS)←((SP)+1:(SP)),(SP)←(SP)+2

LAHF

SAHF修改AH寄存器如何修改标志寄存器的高8位或者低8位呢先用LAHF指令把标志寄存器的低8位赋值给AH寄存器,然后用程序修改AH寄存器,最后再用SAHF指令把修改后的AH寄存器的内容传送回标志寄存器的低8位。PUSHFPOPAX ;借助堆栈,将FLAG赋值给AXPUSHAX;借助堆栈,将AX赋值给FLAGPOPF修改AX内容长度可以为8位或16位,若为带符号数,用补码表示2、算术运算指令1)算术运算的数据类型无符号的二进制数带符号的二进制数压缩型十进制数(压缩型BCD码)非压缩型十进制数(非压缩型BCD码)只有加/减运算压缩型BCD码,每个字节存两位数,即两位BCD码,对于一个字节来说,压缩型BCD码的范围是0~99;非压缩型BCD码,每个字节存一位数,即由字节的低4位决定存放的数字,对于高四位,进行乘/除运算时必须全为0,加/减运算时可以为任意值。2)算术运算指令对标志位的影响标志位中的绝大多数可由跟在算术指令后的条件转移指令进行测试,改变程序的流程。算术运算类指令共有20条:①加法指令②带进位加法指令③加一指令④减法指令⑤带借位减法指令⑥减一指令⑦求补指令⑧比较指令⑨无符号数乘法指令⑩带符号数乘法指令无符号数除法指令带符号数除法指令字节扩展指令字扩展指令非压缩型BCD码加法调整指令压缩型BCD码加法调整指令非压缩型BCD码减法调整指令压缩型BCD码减法调整指令非压缩型BCD码乘法调整指令非压缩型BCD码除法调整指令段寄存器不能参加加、减、乘、除运算①加法指令ADD(ADDition)指令格式及操作:ADDdst,src;(dst)←(dst)+(src)ADD指令将目的操作数与源操作数相加,并将结果送给目的操作数。加法指令将影响状态标志位。目的操作数:寄存器、存储器源操作数:寄存器、存储器、立即数两者不能同时为存储器ADDCL,10HADDDX,SIADDAX,MEMADDDATA[BX],ALADDALPHA[DI],30H数据可以为8位,也可以为16位。数据类型若为无符号数,结果超出范围,则CF位为1;若为带符号数,超出补码表示范围,则OF位为1。(1)加法指令:不带进位加法指令、带进位加法指令、加1指令②带进位加法指令ADC(ADditionwithCarry)操作格式及操作:ADCdst,src ;(dst)←(dst)+(src)+(CF)影响状态标志位目的操作数:寄存器、存储器源操作数:寄存器、存储器、立即数两者不能同时为存储器带进位加法指令主要用于多字节数据的加法运算,如果低字节相加时产生进位,则在下一次高字节相加时将这个进位加进去。③加1指令INC(INCrementby1)指令格式及操作:INCdst;(dst)←(dst)+1INC将目的操作数加1,并将结果送回目的操作数。影响SF、ZF、AF、PF、OF,不影响CF。目的操作数:寄存器、存储器,不能为段寄存器和立即数。INCDLINCSIINCBYTEPTR[BX][SI]INCWORDPTR[DI]BYTEPTR指定随后的存储器操作数的类型是字节型WORDPTR指定随后的存储器操作数是字型常用于循环程序中修改地址(2)减法指令:不带借位减法指令、带借位减法指令、减1指令、求补指令、比较指令①减法指令SUB(SUBtraction)指令格式及操作:SUBdst,src ;(dst)←(dst)−(src)用目的操作数减源操作数,结果送回目的操作数目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器允许字节相减,也允许字相减两者不能同时为存储器SUBAL,37HSUBDX,BXSUBCX,VARE1SUBARRAY[DI],AXSUBBETA[BX][DI],512H当无符号数的较小数减较大数时,因不够减而产生借位,此时进位标志CF置1。当带符号数的较小数减较大数时,将得到负的结果,则符号标志SF置1。带符号数相减如果结果溢出,则OF置1。②带借位减法指令SBB(SuBtractionwithBorrow)指令格式及操作:SBBdst,src ;(dst)←(dst)-(src)-(CF)对标志位影响同SUB目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器允许字节相减,也允许字相减两者不能同时为存储器SBBBX,1000HSBBCX,DXSBBAL,DATA[SI]SBBDISP[BP],BLSBBBYTEPTR[SI+6],97H主要用于多字节减法,可以考虑进位。③减1指令DEC(DECrementby1)指令格式及操作:DECdst ;(dst)←(dst)−1操作数可以为寄存器或者是存储器,但不能为立即数和段寄存器影响SF、ZF、AF、PF、OF,不影响CFDECBLDECCXDECBYTEPTR[BX]DECWORDPTR[BP][DI]MOVAX,0FFFFHCYC:DEC AXJNZCYCHLT延时!计算两个多字节十六进制数之和:3B74AC60F8H+20D59E36C1H=?程序如下:

MOVCX,5;设置循环次数

MOVSI,0;置位移量初值

CLC ;清进位CFLOOPER:MOVAL,DATA2[SI];取一个加数

ADCDATA1[SI],AL;和一个被加数相加

INCSI;位移量加1

DECCX;循环次数减1

JNZLOOPER;加完否,若没完,;转LOOPER,继续相加

HLT ;程序暂停

④求补指令NEG(NEGate)指令格式及操作:NEGdst;(dst)←0 −(dst)只有一个目的操作数,存放运算的最终结果。操作数可以为寄存器、存储器,对8位数或16位数求补。NEG BLNEG AXNEG BYTEPTR[BP][SI]NEG WORDPTR[DI+20]用NEG可以得到负数的绝对值!⑤比较指令CMP(CoMPare)。指令格式及操作:CMPdst,src ;(dst)−(src)比较指令后两个操作数内容均不变,比较结果反映在状态标志位上目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器两者不能同时为存储器!!!CMPAL,0AH ;寄存器与立即数比较CMPCX,DI ;寄存器之间比较CMPAH,AREA1;寄存器与存储器比较CMP[BX+5],SI;存储器与寄存器比较内存数据段存放了200个带符号数,首地址为TAB1,要求将各数取绝对值后存入以TAB2为首址的内存区。开始传送源地址,目标地址设置循环次数判断符号位符号位为1?为1求补存入目标地址源地址加1,目标地址加1循环次数减1循环次数到?不为1到结束LEASI,TAB1 ;(SI)←源地址指针

LEADI,TAB2 ;(DI)←目标地址指针

MOVCX,200 ;(CX)←循环次数

CHECK:MOVAL,[SI];取一个带符号数到ALORAL,AL;AL内容不变,但使之影响标志

JNSNEXT;若(SF)=0,则转NEXTNEGAL;否则求补NEXT:MOV[DI],AL;传送到目标地址INCSI;源地址加1INCDI;目标地址加1DECCX;循环次数减1JNZCHECK;如不等于零,则转CHECKHLT ;停止在数据段从MYDATA开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元。 LEA BX,MYDATA ;MYDATA偏移地址送BX MOV AL,[BX] ;第一个无符号数送AL INC BX ;BX指向第二个无符号数

CMP AL,[BX] ;两个数比较

JNC DONE ;如CF=0,则转DONE,即无借位 MOV AL,[BX] ;否则,第二个无符号数送ALDONE: MOVMAX,AL ;较大的无符号数送MAX单元

HLT ;停止

格式功能影响标志位INCdst加1送入目的操作数AF、OF、ZF、SF、PFDECdst减1送入目的操作数AF、OF、ZF、SF、PF(3)乘法指令只有一个源操作数,另外一个操作数在累加器中,目的操作数隐含!可以进行字或字节的乘法运算无符号数乘法指令带符号数乘法指令①无符号数乘法指令MUL(MULtiplicationunsigned)。指令格式及操作:MULsrc;(AX)←(AL)

(src) (字节乘法) ;(DX:AX)←(AX)

(src) (字乘法)

一个操作数(乘数)在累加器中8位乘法时乘数在AL中16位乘法时乘数在AX中src必须在寄存器或存储单元中范围:0~255;0~65535MUL AL MUL BX MUL BYTEPTR[DI+6] MUL WORDPTRALPHA源操作数是存储器时,应说明数据长度MOV AL,14HMOV CL,05HMUL CL;(AX)=0064H,(CF)=(OF)=0高半部分(AH或DX)为零,则状态标志位(CF)=(OF)=0;若高半部分(AH或DX)包含乘积的有效数字,状态标志位(CF)=(OF)=1执行速度慢!②带符号数的乘法IMUL(IntegerMULtiplication)指令格式如下:IMUL src ;(AX)←(AL)

(src)(字节乘法) ;(DX:AX)←(AX)

(src) (字乘法)8位带符号数的取值范围:-128~+127;16位带符号数的取值范围:-32768~+32767乘积的高半部分仅是低半部分符号位的扩展:状态标志位(CF)=(OF)=0乘积的高半部分包含乘积的有效数字而不仅是符号的扩展:状态标志位(CF)=(OF)=1乘积为正时:符号位为0,AH或DX的高半部分为8位全零或16位全0乘积为负时:符号位为1,AH或DX的高半部分为8位全零或16位全1MOVAX,04E8HMOVBX,4E20HIMULBX;(DX:AX)=(AX)×(BX)执行结果为:(DX)=017FH,(AX)=4D00H,且(CF)=(OF)=1。(4)除法指令除数只能是被除数的一半被除数为16位时,除数应该为8位;被除数为32位时,除数应该为16位。ALAH商余数AX操作数(8位)除数被除数(16位)(a)AXDX商余数AX操作数(16位)除数被除数(32位)(b)DX被除数为16位,存放于AX中。除数为8位,可存放于寄存器/存储器中。8位商放在AL中,8位余数放在AH中。被除数为32位,存放于DX:AX中。除数为16位,可存放于寄存器/存储器中。16位商放在AX中,16位余数放在DX中。除法指令对状态标志位SF、ZF、AF、PF、CF和OF的影响不确定。要求:①无符号数除法指令DIV(DIVisionunsigned)指令格式及操作:DIVsrc;(AL)←(AX)/(src)的商 (字节除法) ;(AH)←(AX)/(src)的余数 ;(AX)←(DX:AX)/(src)的商 (字除法) ;(DX)←(DX:AX)/(src)的余数除数为0时,则CPU自动产生0号内部中断DIV BL ;AX除以BLDIV CX ;(DX:AX)除以CXDIV BYTEPTRDATA ;AX除以存储器(8位)DIV WORDPTR[DI+BX] ;(DX:AX)除以存储器(16位)MOV AX,0F05H ;MOV DX,068AH ;MOV CX,08E9H ;DIV CX ;(DX:AX)除以CX执行结果:(AX)=BBE1H(商)(DX)=073CH(余数)若被除数与除数位数相同需要将被除数进行扩展MOVAL,0FBHXORAH,AH将8位扩展为16位!②带符号数除法指令IDIV(IntegerDIVision)P92指令格式及操作:IDIVsrc;(AL)←(AX)/(src)的商(字节除法) ;(AH)←(AX)/(src)的余数 ;(AX)←(DX:AX)/(src)的商(字除法) ;(DX)←(DX:AX)/(src)的余数除数为0时,则CPU自动产生0号内部中断(除法出错中断)若被除数和除数字长相等,在做IDIV之前,必须先用符号扩展指令CBW、CWD将被除数的符号位扩展,使之成为16位数或32位数。(5)符号扩展指令正数的符号位为零,在高位全添上零;负数的符号位为1,高位全添上1。保证原数据的大小和符号不变。①字节扩展指令CBW(ConvertBytetoWord)指令格式及操作:CBW;如果(AL)<80H,则(AH)←00H,;否则(AH)←0FFHMOVAL,4FHCBW(b)

MOVAL,0F4HCBW 结果:(a)(AL)=01001111B(AH)=00000000B(b)(AL)=11110100B(AH)=11111111B隐含操作数②字扩展指令CWD(ConvertWordtoDoubleword)指令格式及操作:CWD ;如果(AX)<8000H, ;则(DX)←0000H,否则(DX)←FFFFH隐含的操作数为AX和DX将一个字(16位)按其符号位扩展为双字(32位)。CWD和CBW一样,不影响状态标志位!字长相等的带符号数除法:MOV AX,-2000;(AX)=-2000CWD ;(DX)=0FFFFHMOV BX,-421;(BX)=-421 IDIV BX ;(AX)=4(商),(DX)=-316(余数)字长不相等的带符号数乘法:MOV AL,MUL_BYTE ;(AL)←8位被乘数(带符号数)CBW ;将AL扩展成16位带符号数,在AX中IMUL BX ;两个16位带符号数相乘,结果在DX:AX中4)十进制数(BCD码)运算指令利用二进制数的运算指令算出结果,再用专门的指令对结果进行修正。34+23=57 0011010034的BCD码+0010001123的BCD码0101011157的BCD码压缩型BCD码非压缩型BCD码48+29=77 0100100048的BCD码+0010100129的BCD码0111000171的BCD码

01001000+0010100101110001中间结果AF=1+00000110加06H调整01110111正确结果,77的BCD码72+91=163

01110010 10010001CF ←100000011中间结果CF=1+01100000 01100011正确结果

01010111 +01000110 10011101中间结果 +00000110 10100011中间结果 +01100000CF←100000011正确结果CF=157+46=103低4位>9高4位>9(1)十进制加法的调整指令①非压缩型BCD码加法调整指令AAA(ASCIIAdjustforAddition)指令格式如下: AAA隐含操作数为累加器:AL和AH如果 (AL)∧0FH>9,或(AF)=1则 (AL)←(AL)+06H (AH)←(AH)+1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH)否则 (AL)←((AL)∧0FH)

∧相与影响AF、CF计算两个非压缩型BCD码7+8=?MOV AX,0007H ;(AL)=07H,(AH)=00HMOV BL,08H ;(BL)=08HADD AL,BL ;(AL)=0FHAAA ;(AL)=05H,(AH)=01H,(CF)=(AF)=1

个位十位②压缩型BCD码加法调整指令DAA(DecimalAdjustforAddition)指令格式如下:

DAA隐含操作数为AL,任何时候都不会更改AH中内容。如果 ((AL)∧0FH)>9或(AF)=1则 (AL)←(AL)+06H (AF)←1如果 (AL)>90H或(CF)=1则 (AL)←(AL)+60H (CF)←1

影响标志位:SF、ZF、AF、PF、CF计算两个2位的十进制数之和:68+59=?MOVAL,68H ;(AL)=68HMOVBL,59H ;(BL)=59HADDAL,BL ;(AL)=C1H,(AF)=1DAA ;(AL)=27H,(CF)=1计算7+8=?MOVAX,0007H;(AL)=07H,(AH)=00H MOVBL,08H;(BL)=08HADDAL,BL ;(AL)=0FHDAA;(AL)=15H,(AH)=00H, ;(AF)=1,(CF)=0

(2)十进制减法的调整指令非压缩型BCD码减法调整指令压缩型BCD码减法调整指令①非压缩型BCD码减法调整指令AAS(ASCIIAdjustforSubtraction)指令格式如下: AAS隐含操作数为AL、AH影响状态标志AF、CF如果 (AL)∧0FH>9或(AF)=1则 (AL)←(AL)−06H (AH)←(AH)−1 (AF)←1 (CF)←(AF) (AL)←((AL)∧0FH)否则 (AL)←((AL)∧0FH)两位十进制数的减法运算:13−4=?均以非压缩型BCD码存放MOV AX,0103H;(AH)=01H,(AL)=03HMOV BL,04H;(BL)=04HSUB AL,BL;(AL)=03H−04H=FFHAAS;(AL)=09H,(AH)=0个位十位②压缩型BCD码减法调整指令DAS(DecimalAdjustforSubtraction)指令格式如下: DAS如果 ((AL)∧0FH)>9或(AF)=1则 (AL)←(AL)−06H (AF)←1如果 (AL)>90H或(CF)=1则 (AL)←(AL)−60H (CF)←1隐含操作数为AL;只改变AL中的内容。影响状态标志位SF、ZF、AF、PF、CF两个2位的十进制数的减法运算:83−38=?采用压缩型BCD码的形式来存放原始数据MOV AL,83H ;(AL)=83HMOV BL,38H ;(BL)=38HSUB AL,BL ;(AL)=4BHDAS ;(AL)=45H(3)十进制乘除法的调整指令指令系统中只提供了非压缩型BCD码的调整指令,因此,CPU只能进行非压缩型BCD的乘除法运算。①非压缩型BCD码的乘法调整指令AAM(ASCIIAdjustforMultiply)指令格式如下: AAM先用MUL指令将两个真正的非压缩型BCD码相乘,结果放在AX中:(AH)←(AL)/0AH的商 即AL除以10,商送AH(AL)←(AL)/0AH的余数 即AL除以10,余数送AL隐含操作数为AL、AH,影响SF、ZF、PF两个十进制数的乘法运算:7

9=?MOVAL,07H ;(AL)=07HMOVBL,09H ;(BL)=09HMULBL ;(AX)=07H

09H=003FHAAM ;(AH)=06H,(AL)=03H十位个位非压缩型BCD码AAM实质是将AL寄存器中的二进制数转换为非压缩型BCD码,十位存放在AH,个位存放在AL。②非压缩型BCD码的除法调整指令AAD(ASCIIAdjustforDivision)指令格式如下: AAD操作:(AL)←(AH)

0AH+(AL)(AH)←0AAD是在除法之前进行调整,然后用DIV指令进行除法,所得之商还需用AAM指令进行调整,才能得到正确的非压缩型BCD码。隐含操作数AL、AH,根据AL的结果影响SF、ZF、PF两个十进制数的除法运算:73÷2=?将被除数和除数以非压缩型BCD码的形式分别存放在AX和BL寄存器中,被除数的十位在AH,个位在AL,除数在BL。MOVAX,0703H;(AH)=07H,(AL)=03HMOVBL,02H;(BL)=02HAAD ;(AL)=49H(即十进制数73)DIVBL ;(AL)=24H(商)(AH)=01H(余数)AAM ;(AH)=03H,(AL)=06H商的十位商的个位余数丢失AAD操作实质上是将AX寄存器中非压缩型BCD码转换为真正的二进制数,存放在AL中。3、位操作指令逻辑“与”AND测试指令TEST逻辑“或”OR逻辑“异或”XOR逻辑“非”逻辑左移SHL/算术左移SAL逻辑右移SHR算术右移SAR循环左移ROL循环右移ROR带进位循环左移RCL带进位循环右移RCR逻辑运算指令移位指令循环移位指令对8位或16位寄存器或存储单元中的内容按位操作1)逻辑运算指令000101110110110000011011XANDYXORYXXORYNOTXXY逻辑运算返回的值(1)逻辑“与”指令AND(logicalAND)指令格式及操作:ANDdst,src;(dst)←(dst)∧(src)目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器两个操作数不能同时为存储器!操作对象可以为字节、可以为字!影响SF、ZF、PF,同时将CF和OF置0。不影响标志位ANDAL,00001111H ;寄存器"与"立即数ANDCX,DI;寄存器"与"寄存器ANDSI,MEM_NAME ;寄存器"与"存储器ANDALPHA[DI],AX ;存储器"与"寄存器AND[BX][SI],0FFFEH ;存储器"与"立即数

AND指令可以用“0”屏蔽掉某些不关心的位,用“1”保留感兴趣的位!MOV AL,’6’ ;(AL)=00110110AND AL,0FH;(AL)=00000110这种指令可将0~9的ASCII码转换为非压缩型BCD码!(2)测试指令TEST(TESTornon-destructivelogicalAND)指令格式及操作:TESTdst,src ;(dst)∧(src)操作与AND指令,但是不把相与的结果送回目的操作数,只反映在状态标志位上!结果反映在SF、PF、ZF上,CF、OF清零!TESTBH,7;寄存器''与''立即数(结果不回送,下同)TESTSI,BP;寄存器''与''寄存器TEST[SI],CH ;存储器''与''寄存器TEST[BX][DI],BYTEPTR6AH;存储器''与''立即数

IN AL,PORT ;从端口PORT输入数据 TEST AL,00101010B ;测试第1、3、5位 JNZ NEXT ;任一位不为0,则转移到NEXTNEXT:

进行位测试,与条件转移指令一起完成对特定位的测试!(3)逻辑“或”指令OR(logicalinclusiveOR)指令格式及操作: ORdst,src ;(dst)←(dst)∨(src)目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器ORBL,0F6H ;寄存器''或''立即数ORAX,BX ;寄存器''或''寄存器ORCL,BETA[BX][DI];寄存器''或''存储器ORGAMMA[SI],DX ;存储器''或''寄存器ORMEM_BYTE,80H;存储器''或''立即数

大写、小写英文字母的相互转换!大写字母小写字母'A'=41H=01000001B'B'=42H=01000010B…'Z'=5AH=01011010B'a'=61H=01100001B'b'=62H=01100010B…'z'=7AH=01111010B用AND指令可将小写字母变为大写字母;用OR指令可将大写字母变为小写字母。MOVAX,DATA ;(AX)←DATAORAX,AX ;影响标志(用ANDAX,AX指令亦可)JZ ZERO ;如为零,转移到ZERO… ;否则,…ZERO:…不能同时为存储器(4)逻辑“异或”指令XOR(logicaleXclusiveOR)指令格式及操作: XOR dst,src ;(dst)←(dst)

(src)目的操作数:寄存器、存储器源操作数:立即数、寄存器、存储器将寄存器或存储器中某些特定位“求反”MOVAL,0FH ;(AL)=00001111BXORAL,0AAH;(AL)=10100101B(0A5H)将寄存器的内容清空XORAX,AX ;AX清零XORCX,CX ;CX清零

LEA BX,TABLE ;(BX)←数据表地址指针 MOVCL,100 ;(CL)←数据块长度 XOR AX,AX ;清AL、AH,并清进位CFLOOPER:ADD AL,[BX] ;加一个数到ALJNC GOON ;如(CF)=0,转移到GOONINC AH ;否则,AH加1GOON:INC BX ;地址指针加1

DEC CL ;计数值减1

JNZ LOOPER ;如(CL)≠0,转移到LOOPER MOV SUM,AX ;否则,(SUM)←(AL),(SUM+1)←(AH) HLT ;停止从偏移地址TABLE开始的内存区中,存放着100个字节型数据,要求将这些数进行累加,并将累加和的低位存SUM字节单元,高位存SUM+1字节单元在多字节累加程序中:将一个累加器清零,同时将进位标志清零!(5)逻辑“非”运算NOT(logicalNOT)指令格式及操作:NOTdst ;(dst)←0FFH−(dst)(字节求反) ;(dst)←0FFFFH−(dst)(字求反)操作数可以是8位或16位寄存器或存储器,但不可以是立即数!NOT AH ;8位寄存器操作数求反NOT CX ;16位寄存器操作数求反NOT BYTEPTR[BP] ;8位存储器操作数求反NOT WORDPTRCOUNT ;16位存储器操作数求反不影响状态标志位!2)移位指令逻辑左移SHL算术左移SAL逻辑右移SHR算术右移SAR移位操作可以一次移动移位,也可以一次移动多位(必须存放在CL中)(1)逻辑左移/算术左移指令SHL/SAL(SHiftlogicalLeft/ShiftArithmeticLeft)指令格式: SHLdst,1/SALdst,1 或SHLdst,CL/SALdst,CLCFdst0若移位次数等于1,且移位以后目的操作数新的最高位与CF不相等,则OF=1,否则,OF=0;若移位次数不为1,则OF值不确定。OF表示移位操作是否改变了符号位!SHLAH,1 ;寄存器左移1位SALSI,CL;寄存器左移(CL)位SALWORDPTR[BX+5],1;存储器左移1位SHLBYTEPTRDATA,CL;存储器左移(CL)位可以用乘法指令实现之!但是FACTOR

10=(FACTOR

8)+(FACTOR

2),故可用左移指令实现以上乘法运算将一个16位无符号数乘以10。该数原来存放在以FACTOR为首地址的两个连续的存储单元中(低位在前,高位在后)。MOV AX,FACTOR ;(AX)←被乘数SHL AX,1 ;(AX)=FACTOR

2MOV BX,AX ;暂存BXSHL AX,1 ;(AX)=FACTOR

温馨提示

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

评论

0/150

提交评论