版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章80×86及Pentium指令系统3.1基本概念3.2寻址方式3.38086寻址方式3.48086指令系统§3.1基本概念
机器语言
用机器码表示,例如B8H、C3H。
汇编语言
用指令助记符表示机器码,例如对应于机器码B8H、C3H的助记符为MOVAX,BX。
CPU不同,机器码不同,助记符也不同。
高级语言
语言规范,可移植。3.1.1各种计算机语言3.1.2汇编语言与汇编程序1、汇编语言
汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址。特点:能直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理;能直接使用CPU指令系统和指令系统提供的各种寻址方式;程序占用内存空间少,而且执行速度快。
2、汇编程序
汇编:用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编。汇编程序:完成汇编任务的程序称为汇编程序。分为基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。汇编程序的主要功能:
检查源程序。测出源程序语法错误,并给出错误。
产生目标程序,并可给出列表文件。
展开宏指令。3.1.3汇编语言指令操作码:指明操作动作和操作数存放位置的描述方法。每一种操作唯一对应一个操作码。例:加法操作助记符ADD;数据传送操作助记符MOV;比较操作助记符CMP操作数:指令中要处理的操作数据或操作数所在位置的一些信息。寻址方式:寻找操作数(操作数地址)的方式;操作码助记符:与动作一一对应例: MOVAX,BX目/源操作数:可能有多种组合1、操作码
16位指令格式
前缀0-1字节操作码1-2字节MOD-REG-R/M0-1字节位移量0-2字节立即数0-2字节在操作码中有一些特征位,具体为:1)W位:1位,操作数宽度标志位。W=1,操作数为16位。W=0,操作数为8位。2)D位:1位,指明目标操作数描述标志。D=1,表示目标操作数用REG编码。D=0,表示目标操作数用R/M表示。3)S位:1位,符号扩展位,与W连用。SW=00,操作数为8位立即数。SW=01,操作数为16位立即数。SW=11,指令中给出的是8位立即数,实际是字操作,需要将8位数据符号扩展到16位数据。SW=10,非法。4)V位:1位,在移位循环指令中用作确定移位次数。V=0,移1位。V=1,由CL内容决定移多少位。5)MOD:2位,有效地址计算方法选择。MOD=00,无位移量的存储器寻址。MOD=01,1字节位移量的存储器寻址。MOD=10,2字节位移量的存储器寻址。MOD=11,操作数是寄存器寻址。例:MOVAX,BX;指令机器码位:89D8H=1000100111011000BOPDWMODREGR/M1000100111011000OP=100010:表示数据在寄存器之间传送。D=0:表示目标操作数用R/M编码,源操作数用REG编码描述。W=1:表示字操作。MOD=11:表示两个操作数均为寄存器。REG=011:表示源操作数在BX中。R/M=000:表示目标操作数在AX中。2、操作数8086指令中操作数的个数可以有以下几种情况:无操作数指令,例:等待指令WAIT单操作数指令,例:加1指令INCAL双操作数指令,例:减法指令SUBAL,BL源操作数:后者(BL)目的操作数:前者(AL)
操作数存放地点,可以有以下几种:立即数:操作数直接包含在指令中。
例:MOVAL,50H
寄存器操作数:操作数存放在寄存器中。例:INCAL
内存操作数:操作数存放在内存单元中。例:MOVAL,[2000H]I/O操作数:操作数来自I/O端口。例:INAL,28H§3.28086寻址方式寻址:在指令中给出操作数的值或给出操作数所在位置的信息,寻址方式即寻找操作数的值和描述操作数所在位置信息的方式。给出操作数的可能的方式:由操作码隐含指定由指令直接给出操作数存放于CPU内部的寄存器中存放于存储器单元内来自I/O端口3.2.1寻址方式的定义3.2.2寻址方式分类3)目标地址寻址方式:相对程序寻址、固定程序寻址、间接程序寻址
直接寻址寄存器间接寻址基址寻址变址寻址基址加变址寻址
I/O端口寻址非存储器寻址方式存储器寻址方式
立即数寻址寄存器(直接)寻址实质都是间接寻址
寄存器相对寻址方式1)隐含寻址方式:指令中隐含规定了操作数所在位置。2)数据型操作数寻址方式3.2.3数据型操作数寻址方式1、操作数在指令中(立即数寻址)立即数:操作数直接存放在指令中,在操作码之后,作为指令的一部分存放在代码段里,称为立即数。寻址方法称为立即数寻址。立即数可以为以8位或16位常数的形式直接出现在指令中。一般用于赋值。例:MOVBL,47MOVAX,47HMOVAX,‘AB’MOVCL,11001110BMOVEBX,12340000H
立即数可以用二进制数、八进制数、十进制数以及十六进制数来表示。在非十进制的立即数末尾需要使用字母加以标识。必要情况下,十进制数用字母D加以标识,通常情况下不需要标识。如:
MOVAL,10;十进制数(D)
MOVAL,00100101B;二进制数(B)
MOVAL,0AH;十六进制(H)
2、操作数在寄存器中(寄存器寻址)指令中所需要的操作数在处理器的某寄存器中,称为寄存器寻址。与其它寻址方式相比,该方式执行速度最快。例:MOVAL,BLMOVAX,CXMOVDS,AXMOVESP,EDX
不允许的指令格式有:
MOVES,DSMOVBL,BXMOVCS,AX通用寄存器、段寄存器均可3、操作数在存储器中
操作数地址用逻辑地址描述,段基址:偏移量。段基址存入段寄存器,偏移量用有效地址EA描述。EA=BXBP+SIDI+0n8n16n32EA中的3个分量共有4种组合方式,形成4种寻址方式。(1)直接寻址方式操作数存放在存储器单元中,由指令直接给出该单元的有效地址EA(即16位段内偏移量)。例:MOVAX,[0016H]MOVBX,DS:VARMOVDA+3,CLMOVAX,ES:[100H]MOVEDI,SUM寻址过程示意(2)寄存器间接寻址方式操作数存放在存储器单元中,指令给出的16位寄存器值就是该单元的EA。例:MOV[BX],CLMOVAX,[BX]MOVECX,SS:[EBX]MOVDS:[BP],DL
不允许的格式:MOVAX,[DX];除了BX,BP,SI,DI外,其他寄存器不能进行寄存器间接寻址MOV[DI],[BX];除串操作外,不允许存储器间操作寻址过程示意3、基址寻址方式(寄存器相对寻址方式)使用基址寄存器(BX或BP)、并带位移量的间接寻址。操作数EA=BX或BP值+位移量。例:MOVDL,[BP+2]其它等效写法:
MOVDL,[BP]2MOVDL,2[BP]寻址过程示意
基址寻址过程示意图MOVDL,[BP+2]
(设BP原值为4000H)DS(BX的默认段)值0000ES值0000SS(BP的默认段)值0000CS值0000Bit19430BP:0100000000000000+)位移量:000000000000001020位物理地址……××Memory4、变址寻址方式(寄存器相对寻址方式)使用变址寄存器(SI或DI)、并带位移量的间接寻址。操作数EA=SI或DI值+位移量。例:MOV[SI+10],AH其它等效写法:MOV[SI]10,AHMOV10[SI],AH寻址过程示意变址寻址过程示意图MOV[SI]10,AH(设SI原值为008CH)DS(SI、DI默认段)值0000ES值0000SS值0000CS值0000Bit19430SI:0000000010001100+)位移量:000000000000101020位物理地址……××Memory5、基址加变址寻址方式
使用一个基址寄存器、一个变址寄存器的间接寻址。操作数EA=BX或BP值+SI或DI值(+位移量)。例:MOV[BX+DI+4],CX其它等效写法:MOV[BX+DI]4,CXMOV4[BX+DI],CXMOV[BX][DI]4,CXMOV4[BX][DI],CX寻址过程示意基址加变址寻址过程示意图MOV[BX+DI+4],CX(设BX原值为1000H,DI原值为0300H)DS(BX的默认段)值0000ES值0000SS(BP的默认段)值0000CS值0000Bit19430BX:0001000000000000DI:0000001100000000+)位移量:000000000000010020位物理地址……××××MemoryCHCL比例变址寻址有效地址EA=基址寄存器+变址寄存器*比例因子+位移量=EAXEBXECXEDXESPEBPESIEDI+EAXEBXECXEDXEBPESIEDI*1248+无位移量8位位移量16位位移量32位位移量注意:1)使用比例变址寻址必须同时用处理器伪指令进行说明。2)比例因子只能与第二个寄存器相乘,为1时可不写。
例:MOVEAX,[EBX+4*ECX]MOVARRAY[2*EBX],CXMOVAX,[EBP+2*EDI+6H]
串操作寻址采用隐含规定的变址寄存器SI和DI,SI必须为源操作数的地址指针,DI为目标操作数的地址指针,ES为目标操作数的段基值,DS为源操作数的缺省段基值。例:串操作寻址举例MOVSBYTEPTRES:[DI],DS:[SI]MOVSB;ES:[DI]DS:[SI]MOVSW;ES:[DI]DS:[SI],ES:[DI+1]DS:[SI+1]执行过程示意图所有串操作指令在完成串操作动作时,会自动完成如下工作:1)由SI、DI获得源操作码地址指针和目标操作码地址指针。2)对SI、DI两个地址指针进行修改,使之指向下一个单元。方向由DF决定,DF=1,SI、DI自动减1或2,反之SI、DI自动增1或2。3)可字节操作也可字操作。段寄存器使用规则直接寻址使用BX、SI、DI的间接寻址使用BP的间接寻址堆栈操作源串指针目标串指针指令指针默认段寄存器DSDSSSSSDSESCS可加的段超越前缀ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPSIDIIP4、操作数在IO接口中例:INAL,n8INAX,n8INAL,DXINAX,DXOUTn8,ALOUTn8,AXOUTDX,ALOUTDX,AX注意:1)数据只能由累加器AX和AL通过数据总线传输;2)端口地址为8位时,可以采用直接寻址方式;3)端口地址为16位时,必须采用寄存器间接寻址,而且寄存器只能用DX。1、直接程序寻址(隐含寻址)指令中直接给出指令所需要的目标地址信息。如图所示:3.2.4目标地址寻址方式
操作码偏移量L段基值L偏移量H段基值H例:JMP1000H:A000H指令格式如下图所示:EA00H00HA0H10H例:JMPLP注:目标地址用标号的内存地址名表示。2、相对程序寻址仅用于进行段内直接转移的控制转移指令。指令中的操作数是一个8位或16位带符号的相对偏移量,代表目标地址与正常执行顺序的原地址之差。
目标地址=顺序执行的原地址+相对偏移量编程时一般使用目标地址的标号作为操作数,不需要计算相对偏移量。例:JNZNEXT3、间接程序存储器寻址指令中的目标地址在寄存器或在存储器中。寄存器寻址中的寄存器可以是用任何16位通用寄存器。存储器寻址的描述与操作数的存储器寻址描述相同,均为段基值存入段寄存器,偏移量的有效地址由三个分量合成。例:
JMPAXJMPDWORDPTR[BX]JMPWORDPTR[BX]JMP[DI+2](执行过程示意图)
定义:
指令系统:微处理器所定义的全部指令代码的集合,用户通过选用指令代码构成程序段,完成某种功能。按功能可将指令分成七类:数据传送类指令算术运算类指令逻辑运算类指令位移类指令串操作类指令控制转移类指令处理器控制类指令§3.38086/8088指令系统§3.3.1传送类指令传送指令MOV数据交换指令XCHG换码指令XLAT堆栈操作指令PUSH、POP标志传送指令LAHF、SAHF、PUSHF、POPF地址传送指令LEA、LDS、LES(比较)输入输出指令数据传送指令小结源、目操作数长度必须一致。源、目操作数不能同时是存储器操作数。源、目操作数不能同时是段寄存器。立即数和代码段寄存器CS不能作目的操作数。当目的操作数是段寄存器时,源操作数不能是立即数。可以使用段寄存器的指令:MOV、PUSH、POP。除XCHG指令外,其它数据传送指令仅改变目的操作数,源操作数保持不变。除SAHF、POPF指令外,其它数传指令的执行不影响标志位。对所有指令都适用!§3.3.2算术运算指令加法指令ADD、ADC、INC、AAA、DAA减法指令SUB、SBB、DEC、AAS、DAS、CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小结
算术运算指令可完成加、减、乘、除运算以及在算术运算过程中进行进制及编码调整操作。在进行这些操作时,可针对字节或字运算,也可对带符号数和无符号数进行运算。
(1)加法指令(ADD、ADC)格式:ADDdest,srcADCdest,src
功能:将源操作数与目标操作数相加,结果存放于目标操作数中,源操作数原有内容不变。说明:1)可进行二进制数字操作或字节操作。源操作数和目标操作数可以来自通用寄存器或存储器,源操作数还可以为立即数。2)不允许存储器间相加。目标操作数不可为立即数。3)影响标志寄存器FR中CF、PF、AF、ZF、SF、OF的状态。4)要求源操作数和目标操作数同时为带符号的数或无符号数,且长度相等。
1.加法类指令
举例1:加法指令格式举例ADDAL,BLADDAL,45HADCSI,AXADCBETA[SI],DXADDBYTEPTRES:[BX+SI],100举例2:编程实现将内存中2个3字节数据相加,结果存于内存中。MOVAX,DATAMOVDS,AXMOVAX,DA1ADDAX,DA2MOVDA3,AXMOVAL,DA1+2ADCAL,DA2+2MOVDA3+2,ALMOVAL,0ADCAL,0MOVDA3+3,ALHLT...01H44H44H43HCCHBBHAAH77H88H99H...XXHDA1DATADA2DA3+举例3:编程实现将内存中3个2字节数据相加,结果存于内存中。MOVAX,DATAMOVDS,AXMOVDL,0MOVAX,DA1ADDAX,DA2ADCDL,0ADDAX,DA3ADCDL,0MOVDA4,AXMOVDA4+2,DLHLTDATA...00H01H43H65H44H55H66H77H88H99H...XXHDA1DA2DA3+DA4+(2)加1指令INC(Incrementdestinationby1)格式:INCdest
功能:将目标操作数内容加1。说明:1)可字节操作,也可字操作。操作数可为通用寄存器、存储器,但不能是立即数。2)影响标志寄存器FR中PF、AF、ZF、SF、OF的状态。但不影响CF。举例1:加一指令格式举例INCDLINCBXINCDATA[DI]INCTAB[BP][SI]MOVAX,DATAMOVDS,AXLEABX,DA1MOVAX,[BX]ADDAX,[BX+3]MOV[BX+6],AXINCBXINCBXMOVAL,[BX]ADCAL,[BX+3]MOV[BX+6],ALMOVAL,0ADCAL,0MOV[BX+7],ALHLT举例2:编程实现将内存中2个3字节数据相加,结果存于内存中。要求用指针方式实现。...01H44H44H43HCCHBBHAAH77H88H99H...XXHBXDA1DSDATABX+3DA2BX+6DA3+MOVAX,DATAMOVDS,AXLEABX,DA1LEASI,DA2LEADI,DA3MOVCX,10SUBAL,ALLP:MOVAL,[BX]ADCAL,[SI]举例3:编程实现将内存中2个10字节数据相加,结果存于内存中。MOV[DI],ALINCBXINCSIINCDILOOPLPMOVAL,0ADCAL,0MOV[DI],ALHLT(1)减法指令(SUB、SBB)格式:SUBdest,srcSBBdest,src
功能:用目标操作数减去源操作数,结果存放于目标操作数,源操作数中原有内容不变。说明:1)可进行二进制数字操作或字节操作。源操作数和目标操作数可以来自通用寄存器或存储器,源操作数还可以为立即数。2)不允许存储器间相减。目标操作数不可为立即数。3)影响标志寄存器FR中CF、PF、AF、ZF、SF、OF。4)要求源操作数和目标操作数同时为带符号的数或无符号数,且长度相等。
2.减法类指令举例1:减法指令格式举例SBBBX,5796HSBBCX,DXSBBBYTEPTR[BP],5AHSUBAX,DATA[DI]SUBDH,7FH(2)减1指令DEC(Decrementdestinationby1)格式:DECdest
功能:对指定操作数减1。说明:
1)可字操作,也可字节操作。操作数可以为通用寄存器或存储器,但不能是立即数。
2)影响标志寄存器FR中PF、AF、ZF、SF、OF,不影响CF。举例:
DECDLDECAXDECWORDPTR[BP](3)求补指令(NEG)格式:NEGdest功能:用零减去目标操作数,并送回目标操作数。对操作数进行求补操作。说明:
1)操作数可以为通用寄存器或存储器,但不能是立即数。
2)影响标志寄存器FR中PF、AF、ZF、SF、OF、CF。举例:
MOVBL,01HNEGBL格式:CMPdest,src功能:将目的操作数减去源操作数,结果不予保存。只是根据结果的状态设置条件标志位,设置状态标志位与SUB指令含义相同。说明:1)使用方法与SUB、SBB相同。2)CMP通常用于比较两个数,其后一般紧跟着条件转移指令以实现不同情况下的分支处理。例:
CMPAL,BL;AL-BL,保持寄存器的值不变
JNZEQUAL;若(ZF)=0(不等),转EQUAL处
……
;(ZF)=1(相等)情况下的处理
(4)比较指令CMP(Comparetwooperands)判断方式:1)不论是无符号数比较还是有符号数比较,若在比较指令后,(ZF)=1,则两者相等,否则不相等。若两者不相等,则可在比较两个数之后,利用其他标志位的状态来确定两者中哪个大。2)如果是两个无符号数比较,则可根据进位标志CF的状态来判断:若(CF)=1,则dest<src;若(CF)=0,则dest>src。3)如果是两个有符号数比较,则要根据SF和OF两个标志的关系来判断:若SF⊕OF=0,则dest>src;若SF⊕OF=1,则dest<src。在程序中,比较指令常用于条件转移之前,条件转移指令根据CMP操作之后的状态标志决定程序转移或不转移。乘法指令包括无符号数乘法、带符号数乘法两种。格式:MULsrcIMULsrc功能:一个乘数一定来自AL或AX,另一个乘数为src,积一定在AX或DX和AX中。当两个8位数相乘得到的是16位乘积,存放在AX中;两个16位数相乘得到的是32位乘积,存放在DX和AX中,其中DX存放高位字,AX存放低位字。说明:1)src为通用寄存器R或存储器M,但不能是立即数。2)对CF、OF有影响,对PF、AF、SF、ZF为不确定。3.乘法类指令乘法指令8位相乘16位相乘CF、OF状态无符号乘法指令当AH=0当DX=0CF=OF=0当AH非零当DX非零CF=OF=1有符号乘法指令正数当AH=0当DX=0CF=OF=0当AH非零当DX非零CF=OF=1负数当AH=0FFH当AH=0FFFFHCF=OF=0当AH不等于0FFH当AH不等于0FFFFHCF=OF=1举例1:编制程度段实现5×(-9)=?MOVAL,5MOVBL,-9IMULBLHLT举例2:编制程序段实现将2000H:0531H和2000H:0631H两字单元内容相乘,积存于2000H:0731H字单元中。MOVAX,2000HMOVDS,AXMOVBX,0531HMOVAX,[BX]MULWORDPTR[BX+100H]MOV[BX+200H],AXMOV[BX+202H],DXHLT
(1)除法指令DIV、IDIV
格式:DIVsrcIDIVsrc
功能:执行除法运算时,除数必须为被除数的一半字长。当16位数除以8位数时,16位的被除数一定放在AX中,除数放在指令中给出的8位通用寄存器R或8位存储器M中,商在AL中,余数在AH中。当32位数除以16位数时,32位的被除数一定放在DX和AX中,DX中放高16位,AX中放低16位,而除数放在指令中给出的16位寄存器R或16位存储器M中,商在AX中,余数在DX中。说明:1)src为通用寄存器或存储器,不能为立即数;2)对于有符号数,当被除数与除数符号相同时,商为正;反之,商为负。余数符号与被除数符号一致;3)当除数=0或商大于0FFH,CPU会自动产生一个内部中断。4.除法运算指令(DIV、IDIV、CBW、CWB)(2)转换指令(CBW、CWD)格式:CBW;将AL中的符号位扩展到AH中
CWD;将AX中的符号位扩展到DX中说明:1)对于CBW:如果AL小于80H,扩展为AH=00H;如果AL大于80H,扩展为AH=FFH;2)对于CWD:如果AX小于8000H,扩展为DX=0000H;如果AL大于8000H,扩展为DX=FFFFH;3)两条指令对FR无影响。
(1)加法十进制调整指令(AAA、DAA)格式:AAA;对非压缩型BCD码加法操作进行BCD码调整
DAA;对压缩型BCD码加法操作进行BCD码调整说明:
1)AAA,DAA一般用在ADD、ADC指令之后。
2)AAA指令要求入口:AL、AF,出口:AH、AL、AF、CF。指令调整过程如下:①当(AL)的低4位为0~9H之间,且AF为“0”,则执行③;②当(AL)的低4位为A~FH之间,或AF为“1”,则(AL)←(AL)+06,(AH)←(AH)+1,AF置“1”;③AL寄存器的高4位被清除;④将AF的值送CF标志位。5.十进制调整指令3)DAA指令要求入口:AL、AF、CF,出口:AL、AF、CF。调整过程如下:①当辅助进位标志AF=1或者AL寄存器的低4位为A~FH时,AL寄存器的内容加上06H,并将标志AF置“1”(调整低4位)。②当CF=1或者AL寄存器的高4位为A~FH时,AL寄存器的内容加上60H,并将标志CF置“1”(调整高4位)。例1:当(AX)=0008H,(BL)=09H时执行下列指令:
ADDAL,BL;(AX)=0011H,(BL)=09HAAA;(AL)=07H,(AH)=01H,
或(AX)=0107H,(CF)=1例2:当(AL)=26,(CL)=26时,执行以下指令:
ADDAL,CL;(AL)=4CH,(CF)=0,(AF)=0DAA;(AL)=52,(CF)=0,(AF)=1
可以看到DAA指令是将(AL)←(AL)+06,得到(AL)=52,使结果调整为正确的BCD码,并将标志AF置“1”。加法的十进制调整指令1、非压缩BCD码调整指令AAA(无操作数)何时使用?两个非压缩BCD码相加,想得到非压缩BCD码结果自动调整AL中的和,非压缩BCD码的结果存在AL中,进位反映在AH上两个压缩BCD码相加,希望得到压缩BCD码结果自动调整AL中的和,结果在AL中产生一个压缩BCD码的和对什么进行调整?2、压缩BCD码调整指令DAA(无操作数)何时使用?对什么进行调整?(2)减法十进制调整指令AAS、DAS
格式:AASDAS
说明:
1)指令用在SUB、SBB指令之后;
2)AAS指令调整过程如下:①当(AL)的低4位为0~9H时,且(AF)=0,则执行③;②当(AL)的低4位为A~FH时,或(AF)=1,则(AL)←(AL)-06H,(AH)←(AH)-1,AF置“1”;③AL寄存器高4位被清除;④将AF的值送CF标志位。
AAA指令和AAS指令对AF、CF标志位产生影响,其它标志位均无定义。3)DAS指令的执行过程:①当辅助进位标志(AF)=1或者AL寄存器的低4位为A~FH时,AL寄存器的内容减06H,并将AF置“1”。②当CF=1或者AL寄存器的高4位为A~FH时,AL寄存器的内容减60H,并将标志CF置“1”。格式:AAM;对AL调整,调整后结果存于AH,AL中功能:将存放在寄存器AL中的积调整为非压缩的BCD码。AAM指令用在MUL指令对两个非压缩BCD码的数进行乘法之后。其调整方法是将AL寄存器中的内容除以0AH,商放在AH寄存器中,余数放在AL寄存器中。(3)乘法十进制调整指令AAM
例如,当(AL)=08H,(CL)=08H时执行下列指令:
MULCL;(AL)=80HAAM;(AH)=06H,(AL)=04H
由此可见,调整后的结果是非压缩BCD码乘积结果。由于非压缩的BCD码占一个字节,因此结果被分别存放在AH、AL中。应用举例:
MOVAL,4MOVCL,9MULCL ;04H×09H=0024H→AX
AAM ;(AL)÷10=3→(AH)
;(AL)mod10=6→(AL)AX:非压缩BCD码AAM实现了16进制数→十进制数的转化!只能进行非压缩BCD码乘法调整。;(SF)=0,(ZF)=0,(PF)=1格式:AAD
功能:将AX寄存器中非压缩的BCD码形式的被除数调整为二进制数,并存放在AL寄存器中。AAD指令的使用要求与加法调整AAA、减法调整AAS、乘法调整AAM不同,它是放在除法DIV指令的前面来使用的,其调整方法是将(AH)的内容乘10H,并与AL寄存器内容相加送到AL寄存器中,AH寄存器清零。
AAM和AAD指令将根据AL寄存器结果设置SF、ZF和PF标志位,CF、OF及AF无定义。(4)除法十进制调整指令AAD举例:
MOVAX,0306H;AX中是两个非压缩BCD码
MOVBL,9
AAD ;(AH)×10+(AL)=0024H→(AX)
;(SF)=0,(ZF)=0,(PF)=1DIVBL ;(AL)=4,(AH)=0AAD指令进行的是AAM的逆操作AAD必须在DIV之前,与其它调整指令不同!只能进行非压缩BCD码除法调整。算术运算指令小结加、减法的运算结果与两个操作数的长度相等,进、借位反映在标志位上。乘、除法运算仅由指令指定一个操作数,另一个操作数固定为累加器。除了除法指令和符号扩展指令外,其它算术运算指令均影响状态标志,不同指令对标志位的影响也各不相同。允许使用BCD码进行算术运算。为了得到正确的BCD码运算结果,应使用相应的十进制调整指令。所有的十进制调整均对累加器进行。加、减、乘法的调整在运算之后进行,只有除法必须先调整,后运算。直接寻址过程示意图DS(默认段)值0000ES值0000SS值0000CS值0000Bit19430+)0016H:000000000001011020位物理地址……××××MemoryMOVAX,[0016H]AHAL寄存器间接寻址过程示意图MOV[BX],CL(设BX原值为2010H)DS(BX、SI、DI默认段)0000ES0000SS(BP的默认段)0000CS0000Bit19430+)BX:001000000001000020位物理地址……××Memory1000H2000H0100H0100HSIDIDSES××++10H10H3AH06HE6HB2H78H52H10000H10100H10101H10102H20000H20100H20101H20102H1500H0300HDIDS××++10H10HFFH65HXX02H02H1500H:0300H0301H0302H0A02H:1800H:0102H0103H0AH1800H.....0100H操作码位移量CSIP..JMP[DI+2]传送指令MOV(Movement)
格式:MOVdest,src
功能:将源操作数内容复制到目操作数中。举例:MOVDX,BP ;MOVAX,ES ;MOVSP,1800H ;MOVBL,[2480H] ;MOVDS,[BX+DI] ;MOVBYTEPTR[SI],0FH;说明:1)操作数存放位置可以是通用寄存器、段寄存器,也可在内存中。2)数据传输方向:通用寄存器立即数;内存立即数;通用寄存器之间;通用寄存器与段寄存器之间;寄存器与内存之间。3)不允许使用MOV的情况:内存之间传送数据;立即数直接给段寄存器传送数据;段寄存器之间传送数据;CS做目标操作数;IP、FR参加MOV操作。5)MOV执行过程不影响标志位。说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。
MOVsreg,sreg;错误
MOVmem,mem;错误
(2)立即数不能传送到段寄存器中。
MOVsreg,imm ;错误(3)目的操作数不允许使用CS段寄存器。(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定内存操作数的类型,需要用byteptr和wordptr明确指出是字节或字类型。关于PTR的详细介绍见第5章。只要其中一个操作数的类型确定即可。例:错误的MOV指令如下所示:MOVAX,BL;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOV[BX],[SI];不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数例:设B是已定义的字节变量,以下是一些错误和正确的指令。MOVAX,B;错误,类型不匹配MOVAL,0;正确,MASM可以判断出要送字节0交换指令XCHG(Exchange)格式:XCHGdest,src;功能:将寄存器的内容与寄存器或存储单元的内容交换。可使用的操作数类型组合:
XCHGCL,DH ;通用寄存器通用寄存器
XCHGAX,[BP] ;通用寄存器存储器
具体指令形式:
XCHGreg,reg;reg←→regXCHGmem,reg;mem←→regXCHGreg,mem;reg←→mem
说明:1)交换数据可以是字节,也可以是字。2)交换可以在通用寄存器之间,或通用寄存器与存储器之间。3)不允许参加交换的情况:存储器之间;立即数与存储器或寄存器之间;段寄存器之间;CS、IP和FR作为操作数;4)交换指令不影响FR。例:XCHGBX,[BP+SI]如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4254H,目标操作数的物理地址=2F000H+0200H+0046H=2F246H则指令执行后:(BX)=4254H,
指令格式:XLATXLATOPRD;AL←[BX+AL]指令功能:完成一个字节的查表转换。它将数据段中偏移地址为BX与AL寄存器之和的存储单元的内容送入AL寄存器。在使用该指令时,应首先在数据段中建立一个长度小于256B的表格,表的首地址置于BX中,AL中存放查找对象在表中的下标。指令执行后,所查找的对象存于AL中,BX内容保持不变。查表指令XLAT(Translate)查表指令XLAT(Translate)指令形式XLAT[数据表首地址标号]应用举例TABDB0,1,4,9,16,25,36,49,64,81 ;数据段中以TAB为首地址定义的字节表,数目≤255……MOVBX,OFFSETTABMOVAL,4XLATTAB指令执行后,(AL)=16。实现什么功能?堆栈的概念
堆栈——以“先进后出”原则组织起来的连续的内存空间。堆栈操作以字为单位。固定以SS:SP为指针指示栈顶,出、入堆栈的操作均针对栈顶单元进行。8086的堆栈生长方向为“向下增长”。入栈,指针减出栈,指针加堆栈操作入栈:先修改栈顶指针(SP减1),将入栈数据的高字节存入栈顶;再次修改指针(SP减1),将低字节存入栈顶。出栈:先将栈顶单元的内容存入目标字的低字节中,修改栈顶指针(SP加1);再将当前栈顶单元的内容存入目标字的高字节中,并修改指针(SP加1)。指令格式:PUSHOPRDPOPOPRD
指令功能:进栈指令PUSH使(SP)-2→(SP),然后将16位的源操作数压入堆栈,先高位后低位。源操作数可以是通用寄存器、段寄存器和存储器。
POP退栈指令的执行过程与PUSH相反。它从当前栈顶弹出16位操作数到目标操作数,同时(SP)+2→(SP),使SP指向新的栈顶。目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。进栈和退栈的操作数要求以字为单位。PUSH和POP指令不影响标志位。堆栈操作指令1、入栈指令PUSH可使用的操作数类型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSHWORDPTR[0040H]
;存储器目操作数隐含为栈顶单元指令执行后SP减2入栈过程示意2、出栈指令POP可使用的操作数类型:POPSI ;通用寄存器POPES ;段寄存器POPWORDPTR[BX]
;存储器源操作数隐含为栈顶单元指令执行后SP加2出栈过程示意不能用CS!入栈操作示例设有(SS)=3200H,(SP)=0800H,(AX)=105CH。(SP)=0800H→32800H……StackPUSHAX(SP)=(SP)-1→327FFH(SP)=(SP)-1→327FEH(SP)=07FEH5CHAL10HAH出栈操作示例设有(SS)=3200H,(SP)=07FEH(SP)=(SP)+1→32800HPOPAX(SP)=(SP)+1→327FFH(SP)=07FEH→327FEH……Stack10H5CH(SP)=0800H(AX)=105CHAHAL
具体指令形式:
PUSHreg16;(SP)←(SP)-2,[SP]←reg16POPreg16;reg16←[SP],(SP)←(SP)+2PUSHSreg;(SP)←(SP)-2,[SP]←Sreg16POPSreg16;Sreg16←[SP],(SP)←(SP)+2PUSHmem16;(SP)←(SP)-2,[SP]←mem16POPmem16;mem16←[SP],(SP)←(SP)+2标志传送指令标志装入指令LAHF(LoadAHfromflags)(Flags)L→AH标志存储指令SAHF(StoreAHontoflags)AH→(Flags)L标志入栈指令PUSHF(Pushflagsontostack)将标志寄存器压入堆栈。标志出栈指令POPF
将栈顶字单元的内容弹到标志寄存器中。全部隐含源、目操作数唯一可改变TF的指令!POPF(Popflagsoffstack)
标志字传送指令用于对标志寄存器(PSW)的保护和更新操作。指令的操作数由隐含方式给出。(1)标志字读写指令LAHF/SAHF。指令格式:LAHFSAHFLAHF指令可将标志寄存器的低字节(含符号标志SF、零标志ZF、辅助进位标志AF、奇偶标志PF和进位标志CF)传送到AH寄存器中。这条指令不影响标志位。
SAHF指令的功能与LAHF相反,它将寄存器AH的内容传送到标志寄存器的低字节中。标志传送指令
(2)标志进栈/出栈指令PUSHF/POPF。指令格式:PUSHFPOPFPUSHF指令把标志寄存器的内容压入堆栈,同时堆栈指针(SP)←(SP)-2。
POPF指令将堆栈指针SP所指的一个字传送到标志寄存器中,同时堆栈指针(SP)←(SP)+2。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年卷材贴合机项目投资价值分析报告
- 2024年缝合机项目可行性研究报告
- 2024年园林工艺品项目可行性研究报告
- 2024年减带器壳总成项目可行性研究报告
- 2024年3,4-二氯苯基异氰酸酯项目可行性研究报告
- 师生,中国健康班会方案
- 幼儿园大班母亲节的活动方案
- 2024年电子变压器项目综合评估报告
- 2024年连续玻璃纤维原丝毡项目成效分析报告
- 2024年蜗杆项目综合评估报告
- 2024年水利工程行业技能考试-水利部质量检测员笔试历年真题荟萃含答案
- (新版)三级物联网安装调试员技能鉴定考试题库大全-上(单选题汇总)
- 2024年室内装饰设计师(高级工)考试复习题库(含答案)
- 教育培训行业2024年生产与制度改革方案
- 快消行业品牌分析
- 口腔新技术护理课件
- 社交电商的供应链管理和优化
- 题材05乡土小说专题精练-2024年高考语文二轮复习三点突破讲解专练
- 南京理工大学2015年613物理化学(含答案)考研真题
- 舆情处置培训课件
- 卡仕达dvd导航一体机说明书
评论
0/150
提交评论