还剩27页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第二章微处理器指令系统第一节8088的寻址方式8088的指令一般由两部分组成第一部分是指令的操作码部分,规定指令执行何种操作;第二部分是指令的操作数部分,指出操作数存放的地方(寄存器、存储器或本指令中)操作数部分一般分为目的操作数和源操作数,该指令称为双操作数指令也有单操作数指令和无操作数指令,而其操作数常常是隐含的8088的指令首先要用某种寻址方式找到源操作数存放的地方,然后才能从这些地方取出操作数,进行指令所规定的操作,操作的结果也将按某种寻址方式被存放到指令所规定的目的操作数的存放处根据寻找操作数的不同方式,可将8088的寻址方式分为三类即立即寻址寄存器寻址存储器寻址8088设置了16位的偏移地址,又称有效地址EA物理地址(20位)二段地址X16D+EA段地址则存放在数据段段寄存器DS、附加数据段段寄存器ES或堆栈段段寄存器SS里由于EA的形成方式不同,存储器寻址方式又可分为直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式相对基址变址寻址方式以上所述为与数据有关的寻址方式另外,还有与转移地址有关的寻址方式在以下的叙述中,“寄存器的内容”用(寄存器)表示,如(AX)、(DS)等等;“存储器的内容”用(存储器的地址)表示,如(21000H)
一、与数据有关的寻址方式L立即寻址方式操作数直接存放在指令中,作为指令的一部分存放在代码段中,可以是8位的或是16位的数据例
2.1MOV AL,5其中源操作数5是8位的立即数,是指令的一部分执行该指令的操作是将5传送到寄存器AL中去,执行的结果是AL的内容为05H例
2.2MOV AX,309AH其中源操作数309AH是16位的立即数,是指令的一部分执行该指令的操作是将309AH传送到寄存器AX中去,执行的结果是AX的内容为309AH要注意的是,立即数一定是源操作数程序段如下ADD AX,CXADC DX,BXOF用来表示带符号数加法的结果溢出与否规则两加数符号相同,而运算结果的符号与加数的符号相反,则0X1;否则,0X0例
2.30ADD AX,BX执行前AX=4652H,BX二OFOFOH,判断指令执行后AX,BX寄存器的内容和SF、ZF、CF与OF的设置情况执行两个16位二进制数的相加,即4652H+0F0F0H=13742H运算结果中最前面的1是运算时最高位相加产生的进位,由于8088的字长为16位,所以被自然丢失,AX=3742H,BX=OFOFOHo将两加数看成是无符号数,由于有进位,故CF二1;将两加数看成是带符号数,另外,易见ZF=0,SF=0o可见一为正数,一为负数,结果不SBB、DEC、NEG、CMP减法指令格式:SUB DST,SRC执行操作:DST-DST-SRC2SBB Subtractwith borrow带借位减法指令会溢出,故0F=
02.减法指令SUB、1SUB Subtract格式SBB DST,SRC执行操作DST-DST-SRC-CF3DEC Decrement减1指令格式DEC OPR执行操作OPR-OPR-14NEG Negate求补指令格式NEG OPR执行操作OPR--OPR亦即将操作数按位取反后末位加1,因此执行的操作也可以表示为OPR一全0—OPR可见,操作的实质是取一个数的相反数5CMP Compare比较指令格式CMP OPRI,0PR2执行操作OPRI-0PR2本指令的操作虽然是作减法运算,实质是两数的比较,结果并不回送,仅影响标志位说明1以上各指令都可以作字或字节操作;2显而易见,指令DEC和NEG的操作数不允许为立即数;3以上各指令除DEC不影响CF标志位外,都影响条件标志位减法指令对CF和0F的设置情况1SUB、SBB、CMP CF表示当两操作数被看成无符号数时,被减数的最高位是否向高位有借位规则被减数减数,CF=1;否则,CF=00F表示当两操作数被看成带符号数时,其运算结果是否超出补码表示范围规则被减数与减数符号相反,而运算结果的符号与减数的符号相同,则0F=l;除此以外,0F=0如果0F=l,说明运算的结果已超出补码表示范围溢出,结果是错误的2NEG CF当操作数为0时,求补后CF=O;其余情况CF=1OF当字节运算对-128求补或者字运算对-32768求补后,OF=1;其余情况0F=0例
2.31SUB[DI+14H],0136H指令执行前DS3000H,DI=0040H,30054H=4336H二指令执行的操作是4336H-0136H=4200H作为无符号数相减,最高位没有借位情况,CF=O;作为带符号数相减,被减数与减数的符号相同,0FR;ZF=O,SF=Oo结果30054H=4200H,是正确的例
2.32SUB DH,[BP+4]指令执行前DH=41H,SS=OOOOH,BP=00E4H,000E8H=5AH指令执行的操作是41H-5AH=-19H作为无符号数相减,被减数〈减数,有借位情况,CF=1;作为带符号数相减,被减数与减数的符号相同,所以0F=0要说明的是,机内运算是以补码的形式进行的,按其减法的运算规则,上述运算为[41H][5AH]原-=[41H]+1-5AH]原补补01000001B+10100110B二=11100111B=0E7H=[-19H]补结果DH=OE7H,是正确的例
2.33x、y、z均为双精度数,分别存放在以X、X+2;Y、Y+2;Z、Z+2为地址的存储单元中,求W―1+24—z的低位字;W+2―V+24-的高位字程序段如下MOV AX,XMOV DX,X+2ADD AX,YADC DX,Y+2ADD AX,24ADC DX,0SUB AX,ZSBB DX,Z+2MOV W,Z IXMOVW+2,DX分析时应注意进位加指令ADC与借位减指令SBB的用法3乘法指令MUL、IMUL1MUL UnsignedMultiple无符号数乘法指令格式MUL SRC执行操作字节操作AX-AL XSRC字操作DX:AX-AX XSRC2IMUL SignedMultiple带符号数乘法指令格式IMUL SRC执行操作与MUL相同,但操作数必须是带符号数说明1乘法指令中,目的操作数是隐含的,但必须为累加器AL或AX,在执行乘法指令之前被乘数应先存放于AL或AX中2源操作数不允许为立即数,其他寻址方式都是可以的3乘法指令的执行只对CF和OF有影响,对其他的条件标志位无定义MUL如果乘积的高一半为全0,即字节操作结果的AH或字操作的DX为全0,则CF二0F=0,否则CF=0F二1;IMUL如果乘积的高一半是低一半的符号扩展,则CF=OF=0,否则CF=0F=1MUL指令和IMUL指令的使用条件是由数据的格式决定的例
2.34AL=11111111B,BL=11111111B,试决定使用何种乘法指令若将两操作数看成是无符号数时,使用乘法指令MUL BL执行的操作llinillBXinillHB==65025D执行的结果AX=FE01H当将该两操作数看成是带符号数时,使用乘法指令IMUL BL执行的操作llllllllBXlllllinB=-lDX-lD=+1D执行的结果AX=0001H
4、除法指令DIV、IDIV1DIV UnsignedDivide无符号数除法指令格式DIV SRC执行操作字节操作AL-AX/SRC的商AH-AX/SRC的余数字操作AX-DX:AX/SRC的商DX一DX:AX/SRC的余数2IDIV SignedDivide带符号数除法指令格式IDIV SRC执行操作与DIV相同但操作数必须是带符号数,商和余数都是带符号数,且余数的符号与被除数相同说明1除法指令的寻址方式和乘法指令相同,其目的操作数被除数必须放在AX字节操作或者放在DX:AX字操作里,源操作数可以使用除立即数以外的任一种寻址方式2除法指令对所有条件标志位均无定义3当被除数的高8位或高16位的绝对值三除数的绝对值时,商溢出3CBW ConvertByte toWord字节转换为字指令格式CBW执行操作将AL的符号扩展到AH,即AL7=0,则AH=00H;AL7=1,则AH二OFFH执行带符号数的除法指令,要求被除数为16位字节操作或32位字操作,如果被除数原为8位或16位,则应该预先进行符号扩展4CWD ConvertWord toDouble word字转换为双字指令格式CWD执行操作将AX的符号扩展到DX,即AX15=0,则DX R000H;AL=1,则DX=0FFFFHo15这两条指令都不影响条件标志位例
2.35设AX=0400H,BL=0B4H,分析单独执行下面两条指令的操作的结果DIV BLIDIVBL将AX=0400H看成是无符号数或带符号数都是1024D;BL寄存器里的数据0B4H看成是无符号数是180D,看成是带符号数是-76DDIV BL;AX/BL=05H5D…7cH124DI IAL AHIDIV BL;AX/BL=OF3H-13D……24H36DI!ALAH例
2.36计算v-x*y+z-540/x,式中数据均为16位带符号数,分别装入X、Y、Z、AX结果的商存入DX寄存器,余数存入寄存器下面的程序段可以实现上式的运算MOV AX,XIMUL YMOVex,AXMOV BX,DXMOV AX,ZCWDADD ex,AXADC BX,DXSUB ex,540SBB BX,0MOV AX,VCWDSUB AX,exSBB DX,BXIDIV X分析时注意CWD、ADC、SBB指令的用法5进制调整指令DAA、DAS、AAA、AAS8088提供了两组十进制数调整指令,以便在二进制数运算的基础上,给予十进制的调整,可以直接得到十进制的结果BCD码Binary CodedDecimal是一种用二进制编码的十进制数,又称二-------------------十进制数它是用四位二进制数表示一位十进制数的,由于这四位二进制数的权为8421,所以BCD码又称8421码十进制数
0、
1、
00010010、.......、1001c压缩的BCD码用四位二进制数表示一位十进制数,一个字节可以表示二位十进制数;非压缩的BCD码用一个字节来表示,其中低四位表示BCD码,高四位没有意义1DAA DecimalAdjust forAddition压缩BCD码加法的十进制调整指令格式DAA执行操作在执行本指令前必须要用ADD或ADC指令实现两个压缩BCD码的相加操作其结果必须放入AL寄存器然后执行本指令的操作为AL-AL中的和调整为压缩的BCD码格式调整的规则当AL的低四位二A F或AF=1,则AL+06H-AL,1-AF;〜当AL的高四位二A F或CF=1,则AL+60Hf AL,1-CF〜2DAS DecimalAdjust forSubtraction压缩BCD码减法的十进制调整指令格式DAS执行操作在执行本指令前必须要用SUB或SBB指令实现两个压缩BCD码的相减操作其结果必须放入AL寄存器然后执行本指令的操作为AL-AL中的差调整为压缩的BCD码格式调整的规则当AL的低四位二A F或AF=1,则AL-06H-AL,l-AF;〜当AL的高四位二A F或CF=1,则AL-60H-AL,1-CF〜DAA和DAS指令对OF标志位无定义,但影响其它条件标志位例
2.37若AL=28H,BL=68H,均为BCD码,表示十进制数28和68下面的程序段即可实现两个BCD码的相加并调整ADD AL,BL;28H+68H=90H-AL,结果显然不对DAA;显见AF=1,作调整,90H+06H=96H一AL,结果正确例
2.38若AL=86H,AH=07H,均为BCD码,表示十进制数86和7下面的程序段即可实现两个BCD码的相减并调整SUB AL,AH;86H-07H=7FH-AL,结果显然不对DAS;AL的低四位二F,又AF=l,作调整,7FH-06H=79H-AL,结果正确3AAA ASCIIAdjust forAddition非压缩BCD码加法的十进制调整指令格式AAA执行操作在执行本指令前必须要用ADD或ADC指令实现两个非压缩BCD码的相加操作其结果必须放入AL寄存器然后执行本指令的操作为AL-AL中的和调整为非压缩的BCD码格式;AH-AH+调整产生的进位值调整的规则1AL的低四位二09且AF=0,则转3;〜2当AL的低四位二A F或AF=1,则AL+0611-AL,AH+l-AH,l-AF;〜3清AL高四位;4AF位的值送CF4AAS ASCIIAdjust forSubtraction非压缩BCD码减法的十进制调整指令格式AAS执行操作:在执行本指令前必须要用SUB或SBB指令实现两个非压缩BCD码的相减操作其结果必须放入AL寄存器然后执行本指令的操作为AL-AL中的和调整为非压缩的BCD码格式;AH-AH-调整产生的进位值调整的规则1AL的低四位二09且AF=0,则转3;〜2当AL的低四位二A F或AF=L则AL-06H-AL,AH-1-AH,1-AF;〜3清AL高四位;4AF位的值送CFAAA和AAS指令除影响AF和CF标志位外,对其余标志位均无定义
三、逻辑指令逻辑指令包括逻辑运算指令和移位指令L逻辑运算指令AND、OR、NOT、XOR、TEST逻辑运算指令可以对字或字节执行逻辑运算逻辑运算是按位操作的1AND逻辑与指令格式AND DST,SRC执行操作DST-DST ASRC2OR逻辑或指令格式OR DST,SRC执行操作DST-DST VSRC3NOT逻辑或指令格式NOT OPR执行操作OPR一伺而4XOR逻辑异或指令格式XOR DST,SRC执行操作DST-DST¥SRC5TEST测试指令格式TEST OPRI,OPR2执行操作OPRI AOPR2两个操作数相与的结果不保存,只根据其特征设置条件标志位说明1以上五条指令中,NOT不允许使用立即数,其它四条指令除非源操作数是立即数,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式;2对条件标志位的设置情况是NOT指令不影响标志位,其它四条指令将使CF和OF为0,AF位无定义,而SF、ZF、和PF位则根据运算结果设置这些指令对处理操作数的某些指定位很有用,例如可屏蔽某些位将这些位置0,或使某些位置1或测试某些位等例
2.39要求屏蔽第
0、4位,可用AND指令并设常数OEEHMOV AL,5311AND AL,OEEH执行操作为01010011BA11101110B=01000010B执行结果为AL=4211,注意到第
0、4位已经被屏蔽了例
2.40要求第5位置1,可用0R指令并设置常数20HMOV AL,43HOR AL,20H执行操作为0100001lBV00100000B=0110001IB执行结果为AL=63H,注意到第5位已经被置1了例
2.41要测试操作数的某些位是否为0或1,可用TEST指令并设置常数作为源操作数,在被测位上置1,其余为0IN AL,4TEST AL,80H测试最高位是否为1结果为0ZF=1,则从外设接口上读入的数据的最高位为0;结果为非0ZF=O,则最高位为
12.移位指令1SHL ShiftLogical Left逻辑左移指令执行的操作如图2-3a所示2SAL ShiftArithmetic Left算术左移指令执行的操作与SHL指令相同3SHR ShiftLogical Right逻辑右移指令执行的操作如图2-3b所示4SAR ShiftArithmetic Right算术右移指令执行的操作如图2-3c所示5ROL RotataeLeft循环左移指令执行的操作如图2-3d所示6ROR RotataeRight循环右移指令执行的操作如图2-3e所示7RCL RotataeLeft throuthCarry带进位循环左移指令执行的操作如图2-3f所示8RCR RotataeRight throuthCarry带进位循环右移指令执行的操作如图2-3g所示说明下面以逻辑左移指令为例,介绍移位指令的格式和注意事项SHL OPR,CNT1指令中0PR为被移位的操作数,可以使用除立即数以外的任意寻址方式;2CNT表示移位的次数,若为1,则直接写1;若大于1,则移位次数必须预先存存放在CL寄存器中,指令格式为SHL OPR,CL3条件标志码的设置OF位在CNT=1时有效,当移位后最高位有变化,则OF=1,否则,0F=0;CF、SF、ZF、PF根据操作结果设置;AF位不定义例
2.42MOV CL,5SAR[DI],CL如指令执行前DS=0F800H,DI=180AH,0F980AH=0064H指令执行后0F980AH=0003H,CF=0
四、串处理指令
1.与REP相配合使用的MOVS、LODS、STOS指令1REP Repeat重复串操作直至CX二0为止格式REP串处理指令其中,串处理指令可以是MOVS、LODS、STOS指令执行操作1如CX=0则退出REP,否则往下执行;2CX-CX-1;3执行其后的串处理指令;4返回12MOVS MoveString串传送指令格式可有三种MOVS DST,SRCM0VSB字节M0VSW字MOVS的寻址方式是隐含的,不允许用其它寻址方式来确定操作数执行操作1DI一SD;2字节操作SI-SI±1,DI-DI±1;3字操作SI-SI±2,DI-DI±2当PSW中的方向标志位DF=0时,用“+”;当DF=1时,用f该指令不影响条件标志位在使用串处理指令时,SI、DI作为指针,分别指向数据段和附加数据段,当MOVS指令与REP连用时,可以实现把数据段的整串数据传送到附加数据段REP MOVS指令前的准备工作用程序实现:1存放于数据段中的源串首/末址一SI;2将要存放数据段的附加数据段中的目的串首址/末址一DI;3数据串的长度字节传送时为字节的个数,字传送时为字的个数一CX;4建立方向标志“首址”对应于正向传送;“末址”则对应于反向传送方向标志位指令:CLD Cleardirection flagDF清方向标志位DF指令该指令使DF=0,正向传送STD Setdirection flagDF置方向标志位DF指令该指令使DF=1,反向传送例
2.43在数据段里有一个字符串其长度为17,要求把它们传送到附加数据段中的一个缓冲区中程序如下,其中SEGMENT、ENDS为段定义的伪操作,DB为定义字节数据的伪操作DATA SEGMENTMESSI DB4personal computerDATAENDSEXTRA SEGMENTMESS_2DB17DUP EXTRAENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,ES:EXTRAMOV AX,DATAMOV DS,AXMOV AX,EXTRAMOV ES,AXLEA SI,MESS_1;作串传送前的准备工作LEA DI,MESS_2MOV CX,17CLDREP MOVSB;执行串传送CODE ENDS3STOS Storeinto String存入串指令格式有三种STOS DSTSTOSB字节STOSW字执行操作字节操作DI-AL,DI-DI±1字操作DI-AX,DI一DI±2当与REP联用时,可把AL或AX的内容存入一个长度为CX的缓冲区中,常常用于初始化一个缓冲区例
2.44初始化某一个缓冲区MOV DI,0500hMOV AL,20hMOV CX,5CLDREP STOSB4LODS Loadfrom String从串取指令格式有三种LODS SRCLODSB字节LODSW字执行操作字节操作AL一SI,SI-SI±1字操作AX-DI,SI-SI±2该指令一般不跟REP联用,有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令
2.与EPE/REPZ和REPNE/REPNZ配合使用的CMPS、SCAS指令1REPE/REPZRepeat whileEqual/Zero当相等/为零时重复串操作格式REPE/REPZ串处理指令CMPS或SCAS执行操作1CX=0或却某次比较的结果两个操作数不等则退出,否则往下执行;2CX-CX-l;3执行其后的串处理指令;4返回12REPNE/REPNZ Repeatwhile NotEqual/Not Zero当不相等/不为零时重复串操格式REPNE/REPNZ串处理指令CMPS或SCAS执行操作1CX=0或妇某次比较的结果两个操作数相等则退出,否则往下执行;2CX-CX-l;3执行其后的串处理指令;4返回13CMPS CompareString串比较指令格式CMPS DST,SRCCMPSB字节CMPSW字执行操作1SI-DD;2字节操作SI-SI±1,DI-DI±1;字操作SI-SI±2,DI-DI±2o相应单元的内容相减,但结果不保存,只根据结果设置条件标志位指令的其它规定与MOVS指令相同4SCAS ScanString串扫描指令格式SCAS DSTSCASB字节SACSW字执行操作1字节操作AL-DI,DI-DI±1;2字操作AX-DI,DI-DI±2o指令把AL或AX的内容与DI指向的附加数据段中的一个相应单元的内容进行比较,但结果不保存,只根据结果设置条件标志位指令的其它规定与MOVS指令相同以上两条指令和REPE/REPZ或REPNE/REPNZ相结合可以比较两个数据串.或从一个数据串查找一个指定的字符例
2.45要求比较两个字符串以确定是否匹配程序段如下LEA SLSTR ING1LEA DI,STRING2MOV CX,COUNTCLDREPZ CMPSBJNZUNMATMOV AL,0JMP OUTPUTUNMATMOV AL,OFFHOUTPUTMOV RESULT,AL例
2.46要求从一个字符串中查找字符“空格”ASCH码20H,并指出其位置程序段如下LEA DI,BLOCKMOV CX,COUNTMOV AL,20HCLDREPNZ SCASBJZFOUNDMOV DI,0JMP DONEFOUNDDEC DI;找到后,该字符的地址放指针单元,并计算;该地址对首地址的偏移量,以确定位置MOV POINTER,DILEA BX,BLOCKSUB DI,BXDONEHLT
五、控制转移指令包括无条件转移指令、条件转移指令、循环指令、子程序调用及返回指令和中断指令及中断返回指令
1.条件转移指令格式JMP目标地址执行操作无条件地转移到指令所指定的目标地址,去执行从该地址开始的指令序列段内转移时,只须改变IP的值,便可达到转移的目的;段间转移时,不但要改变IP的值,还要改变CS的值,方可达到转移的目的
2.件转移指令条件转移指令只能使用段内寻址方式相对寻址,且转移的地址范围为-128+127这类指〜令根据在它前面的指令序列中最后一条能影响条件标志位的指令执行的结果来决定转移与否下文中OPR为转向地址的标号符号地址
3.寄存器寻址方式操作数存放在指令所指定的寄存器里例
2.3MOV AX,BX假定,指令执行以前,AX=3064H,BX=1234H,执行指令的操作是将BX中的16位数据,传送到AX中去,执行的结果是AX=1234HO例
2.4MOV AL,BL
4.直接寻址方式有效地址EA在指令中操作码的后面,操作数一般在数据段里其物理地址的计算如下物理地址二D物X16D+EA例
2.5MOV AX,[1200H]指令中的1200H即为有效地址假定指令执行前DS=3000H,则物理地址为物理地址二3000H X16D+1200H=31200H假如31200H=5030H,此为字数据的表示方法,即31200H=30H,31201H=50H该指令执行的操作是从物理地址为31200H的存储器中把字数据5030H取出,传送至AX,结果是AX果是0H注意事项是1允许使用已定义的符号地址,如MOV AX,[VALUE]=MOV AX,VALUE2允许使用段跨跃前缀如果VALUE在附加数据段里,那么指令可为MOV AX,ES:VALUE指令中“ES:”就是段跨跃前缀,表示源操作数在附加数据段里物理地址的计算如下物理地址二ES X16D+VALUE3规定在双操作数指令中,除源操作数的寻址方式为立即寻址方式外,两操作数的寻址方式必须有一个为寄存器寻址方式,因此指令MOV VALUE,1234H是正确的;MOV[2000H],[1000H]是错误的
5.寄存器间接寻址方式操作数的有效地址EA在基址寄存器BX、BP或变址寄存器SI、DI中操作数则在存储器中1如指令中指定的寄存器为BX、SI或DL则操作数在数据段里,其物理地址的计算如下物理地址二DS X16D+BX|SI|DI例
2.6MOV AX,[BX]在执行以前,DS=200011,BX=100011,则物理地址二2000H X16D+100011=21000H,而21000II=50A0H则执行后,AX二50A0H2如指令中指定的寄存器为BP,则操作数在堆栈段里,其物理地址的计算如下物理地址二SS X16D+BP3允许段跨跃前缀,以便取得其它段中的数据,如MOV AX,ES:[BX]物理地址计算如下物理地址二ES X16D+BX
6.寄存器相对寻址方式
(1)根据单个条件标志位的设置,决定转移与否这种指令一般适用于测试某一次运算的结果并根据不同的特征产生程序分支作不同处理的情况指令格式操作测试条件T7成TF OPR结果为零.成者相等皿1结稔_7F=1JNZ或JNE OPR结果为非零,或者不相等则转移ZF=OJS OPR结果为负则转移SF=1JNS OPR结果为非负则转移SF=OJO OPR结果溢出则转移0F=lJNO OPR结果不溢出则转移0F=0JP OPR结果中1的个数为偶数则转移PF二1JNP OPR结果中1的个数为奇数则转移PF=0JB或JNAE,或JC OPR低于,或者不高于或等于,或者进位为1则转移CF=1JNB或JAE,或JNC OPR不低于,或者高于或等于,或者进位为0则转移CF=0例
2.47根据一次加法的结果来决定不同的数据处理程序段如下ADD4X,TEMPTO ACTTCMCJ,AC1lOlN2;ACTION_1的处理ACTION_2::J;ACTI0N_2的处理r
(2)根据两个无符号数的比较结果,决定转移与否前两条指令与第一组指令中的最后两条指令完全相同指令格式测试条件JB(或J\AE,或JC)~~——3第一组中的硼-条指■令操作完全相同JNB(或JAE,或JNC)OPR与第一组中的这两条指令操作完全相同CFVZF=1JBE(或JNA)OPR低于或等于,或者不高于则转移CFVZF=OJNBE(或JA)OPR不低于或等于,或者高于则转移
(3)根据两个带符号数的比较结果,决定转移与否指令格式操作测试条件JL JNgUFK小于,或者不大于或等于则转移SF^ZOF=1JNL JGEOPR不小于,或者大于或等于则转移SFV0F=0JLE JNGOPR小于或等于,或者不大于则转移SBVOF VZF=1JNLE JGOPR不小于或等于,或者大于则转移ZRVOF VZF=0
(4)测试CX的值,为零训M⑸11个--------------------------------------------------------格式JCXZ OPR测试条件(CX)二0例
2.48在X、Y两单元里放有两数(16位),判断X50若是,则转到TOO_HIGH去执行,否则做X-Y,如溢出,转到OVERFLOW去执行,否则计算|X-Y|,结果存入RESULT中去程序如下MOV AX,XCMP AX,50JG TOOHIGHSUB AX,YJO OVERFLOWJNSNONNEGNEG AXNONNEGMOV RESULT,AXJMP EXITTOO_HIGH OVERFLOW例
2.49a,B为两个带符号的双精度数,分别存储于DX、AX与BX、CX中要求编制一程序使aB时转向X执行,否则转向Y执行双精度数,即双字比大小,应比较高位字,在高位字相等的情况下,才比低位字程序如下CMP DX,BXJG XJLYCMP AX,CXJA XYX:5环指令LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE循环结构是程序的基本结构之一,其实现方法是MOV CX,N;设置循环次数AGAIN:];循环体DEC CXJ;循环次数-1JNZ AGAIN;循环次数不为零,则转AGAIN重复循环循环程序的基本流程图如图2-4所示8088指令系统为简化循环程序的设计,设置了一组循环指令1LOOP Loop循环指令格式LOOP OPR测试条件CXWO2LOOPZ/LOOPE Loopwhile Zero,or Equal当为零或相等时循环指令格式LOOPZ/LOOPE OPR测试条件CX W0且ZF=13LOOPNZ/LOOPNE Loopwhile NotZero,or NotEqual当不为零或不相等时循环指令格式LOOPNZ/LOOPNE OPR测试条件CX W0且ZFR这三条指令执行的操作步骤为1CX-CX—1;2检查是否满足测试条件,如满足则重复循环,否则则退出循环指令中OPR为转向地址的标号其转移地址的范围为-128+127〜循环指令不影响条件标志位例
2.50有M个字的数组,首地址为Array,要求将数组各元素之和存入TOTAL中去程序如下例
2.51在长度为L、首地址为ASCII_STR的存储区里寻找一个字符“空格”20H,找到继续执行,未找到转NOT_FOUND程序如下MOV CX,LMOV SI,-1MOV AL,20HNEXTINC SICMPAL,ASCII_STR[SI]LOOPNE NEXTJNZNOT_FOUND:〕;相等,做“找到”处理NOT FOUND:JMOVMex,MOVAX,0MOVSI,AXSTART_LOOP:ADD ADDAX,Array[SI]LOOP MOV SI,2START LOOP6序调用及返回指令CALL、RET在模块化程序设计中,往往把程序中某些具有独立功能的部分编写成独立的程序模块,称之为子程序使用时可由主程序调用子程序,而在子程序执行完后又返回到主程序在调用和返回的过程中,需要用到堆栈,以便保存或恢复返回地址CALL和RET指令都不影响条件标志位TOTAL,AX1CALL Call子程序调用指令1段内直接调用格式CALL DST执行操作SP一SP-2;SP+1,SP-IP;IP-IP+Di6o这条指令的第一步是将返回地址压栈,以便子程序返回主程序时使用,第二步则是转移到子程序的入口地址去继续执行指令中DST给出转向地址,昧是机器指令中的位移量,它是转向地址和返回地址之间的差值2段内间接调用格式CALL DST执行操作SP一SP-2;SP+1,SP—IP;IP-EA o这条指令的转移地址在存储单元中,而EA是该存储单元的偏移地址,它是由指令中DST的寻址方式决定的例如CALL[BX]3段间直接调用格式CALL DST执行操作SP一SP-2;SP+1,SP-CS;SP-SP-2;SP+1,SP7IP;IP-EA;cs一段地址EA和段地址分别是所转向子程序入口地址中的偏移地址和段地址段间调用时,由于主程序与子程序不在同一段里,因此返回地址的保存和转向地址的设置都必须把偏移地址和段地址一并考虑在内4段间间接调用格式CALL DST执行操作SP一SP-2;SP+1,SP7CS;SP-SP-2;SP+1,SP-IP;IP一EA;CS-EA+2o这条指令的转移地址在存储单元中,而EA存储单元的偏移地址,存储单元的前两个字节内容是所转向子程序的偏移地址,而后两个字节内容是所转向子程序的段地址,它门是由指令中DST的寻址方式决定的例如CALL DWORD PTR[BX]2RET Return返回指令RET指令一般放在子程序的末尾,其操作是返回地址出栈送IP寄存器段内或段间和CS段间1段内返回格式RET执行操作IP一SP+1,SP;SP-SP+2o2段内带立即数返回格式RET表达式执行操作:IP一SP+1,SP;SP-SP+2;SP-SP+D|6格式中的表达式在汇编时计算得到的常数成为机器指令中的位移量O读者可以阅读相关参考书籍了解这种用法3段间返回格式RET执行操作IP-SP+1,SP;SP-SP+2;CS一SP+1,SP;SP-SP+204段间带立即数返回格式RET表达式执行操作:IP一SP+1,SP;SP-SP+2;CS一SP+1,SP;SP-SP+2;SP-SP+D
165.中断指令INT及中断返回指令有时当系统运行或者程序运行期间遇到某些特殊情况时,需要计算机自动执行一组专门的例行程序来进行处理这种情况称为中断Interrupt,所执行的这组程序称为中断例行程序或中断子程序中断分为内部中断软中断和外部中断硬中断内部中断包括象除法运算中遇到除以0时所产生的中断,或者程序中为了作某些处理而设置的中断指令等外部中断则主要用来处理I/O设备与CPU之间的通信中断例行程序的入口地址称为中断向量在以8088为CPU的IBM PC/XT机里,存储器的最低地址区的1024个字节地址范围为00000H003FFH为中断向量表见图2-5,其中可以存放256个〜中断向量,每个中断向量占四个字节,前两个字节内容为中断例行程序入口地址中的偏移地址,后两个字节内容为中断例行程序入口地址中的段地址1TNT Interrupt中断指令格式INT N1NT执行操作SP一SP-2;SP+1,SP-PSW;SP-SP-2;SP+1,SP-CS;SP-SP-2;SP+1,SP-IP;IP-NX4;CS-NX4+2°指令格式中的N是中断类型号,其范围为0-255;每一个中断类型号对应一个特定的中断例行程序最后两步操作就是为了获得一个中断向量,即中断例行程序的入口地址,其过程是……指令INT的隐含中断类型号为3,即等同于INT3o2INTO Interruptif Overflow溢出中断指令格式INTO等同于INT4执行操作若0F=l,则SP-SP-2;SP+1,SP-PSW;SP-SP-2;SP+1,SP-CS;SP-SP-2;SP+1,SP-IP;IP-IOH;CS-12Ho3I RETReturn fromInterrupt中断返回指令格式I RET执行操作:IP一SP+1,SP;SP-SP+2;CS一SP+1,SP;SP-SP+2;PSW-SP+1,SP;SP-SP+2
六、处理机控制指令
1.标志处理指令这一组指令只影响本指令指定的标志位,而不影响其它的标志位1CLC CLearCarry清进位标志位指令CF£2CMC CoMplementCarry进位标志位取反指令CF-CF3STC SeTCarry置进位标志位指令CF-14CLD ClearDirection清方向标志位指令DF-05STD SeTDirection置方向标志位指令DF-16CLI ClearInterrupt清中断标志位指令IF-07STI SeTInterrupt置中断标志位指令IF-
12.其它处理机控制指令空操作指令1NOP NoOperation停机指令等2待指令换码HLT Halt指令封锁指3WAIT Wait令4ESC Escape5LOCK Lock也称直接变址寻址方式操作数的有效地址EA是一个基址寄存器或变址寄存器的内容和指令中指定的8位或16位的位移量之和1如指令中指定的寄存器为BX、SI或DI,则操作数在数据段里,其物理地址的计算如下物理地址二DS X16D+BX|SI|DI+8位116位位移量例
2.7MOV AX,COUNT[SI]执行以前DS=3000H,SI=2000H,COUNT=3000H,则物理地址二3000H X16D+2000H+3000H=35000H,而35000H=5678H,故执行以后,AX=5678H2如指令中指定的寄存器为BP,则操作数在堆栈段里,其物理地址的计算如下物理地址二SS X16D+BP+8位|16位位移量3允许段跨跃前缀,以便取得其它段中的数据如MOV DL,ES:STRING[BX]4以上指令也可以写成如下形式MOV AX,[SI+COUNT]MOV DL,ES:[BX+STRING]6址变址寻址方式操作数的有效地址EA是」个基址寄存器和一个变址寄存器的内容之和1如指令中指定的基址寄存器为BX,则操作数在数据段里,其物理地址的计算如下:物理地址二DS X16D+BX+SI|DI例
2.8MOV AX,[BX][DI]执行以前DS=2100H,BX=0158H,DI=10A5H,则物理地址=2100HX16D+0158H+10A5H=221FDH,而221FDH=1234H执行以后,AX=1234H2如指令中指定的基址寄存器为BP,则操作数在堆栈段里,其物理地址的计算如下物理地址二SS X16D+BP+SI|DI3允许段跨跃前缀,以便取得其它段中的数据如MOV AX,ES:[BX][SI]4以上指令也可以写成如下形式MOV AX,[BX+DI]MOV AX,ES:[BX+SI]7对基址变址寻址方式操作数的有效地址EA是一个基址寄存器、一个变址寄存器的内容与8位或16位的位移量之和1如指令中指定的基址寄存器为BX,则操作数在数据段里,其物理地址的计算如下:物理地址二DS X16D+BX+SI|DI+8位116位位移量例
2.9MOV AX,MASK[BX][SI]执行以前DS=300011,BX=200011,SI=100011,MASK=0250H,则物理地址二3000IIX16D+2000H+1000H+0250I仁33250IHL而3325011=77AFH执行以后,AX=77AFH2如指令中指定的基址寄存器为BP,则操作数在堆栈段里,其物理地址的计算如下物理地址二SS X16D+BP+SI|DI+8位|16位位移量3允许段跨跃前缀,以便取得其它段中的数据,如MOV AX,ES:MASK[BX][SI]4以上指令也可以写成如下形式MOV AX,[BX+SI+MASK]MOV AX,ES:[BX+SI+MASK]
二、与转移地址有关的寻址这种寻址方式用来确定转移指令及子程序调用指令的转向地址
1.段内直接寻址方式转向的有效地址EA直接在指令所在的代码段中,并在助记符形式的指令中指明,是指令寄存器IP中的当前内容和机器指令中指定的8位或16位的位移量之和这种寻址方式也称相对寻址方式,其相对位移量即为转向的有效地址EA与IP中的当前内容之差,存放在机器指令的操作码后面的字节中,是指令的一部分在程序执行的过程中,这种转移指令的本身不会发生变化这种寻址方式既适用于条件转移指令,也适用于无条件转移指令当它用于条件转移指令时,其位移量只允许是8位,其转移范围为-128+127;〜当它用于无条件转移指令时,其位移量既可以是8位,也可以是16位,而位移量为16位时,其转移范围为-32768+32767〜其指令的汇编语言助记符格式为JMP SHORTQUESTJMP NEARPTR PROG其中,QUEST和PROG是转向的有效地址,这里以符号地址表示,在机器指令中用位移量表示SHORT和NEAR PRT是操作符,表示位移量是8位的还是16位的,并可以相应地被称为短转跳和长转跳
2.段内间接寻址方式转向的有效地址EA是一个寄存器或是一个存储单元的内容这个寄存器或存储单元的内容可以用数据寻址方式中除立即寻址方式外的任何一种寻址方式取得,所得到的有效地址用来取代IP寄存器的内容物理地址二CS X16D+IP这种寻址方式只适用于无条件转移指令,而不适用于条件转移指令条件转移指令只能使用段内直接寻址方式举例说明在段内间接寻址方式的转移指令中,转移的有效地址的计算方法假设DS=2000H,BX=1256H,SI=528FH,TABLE=2OA1H位移量232F7H=3280H,264E5H=2450Ho例
2.10JMP BX执行该指令后,IP=1256H例
2.11JMP TABLE[BX]执行该指令后,IP=DSX16D+BX+TABLE二2000HX16D+1256H+20A1H二232F7H-3280H例
2.12JMP[BXJ[SIJ则指令执行后,IP=DSX16D+BX+SI=2000HX16D+1256H+528FH二264E5H=2450H
3.段间直接寻址方式指令中直接提供了转向段地址和偏移地址(有效地址),只要用指令中指定指偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作指令的汇编语言助记符格式可表示为JMP FAR PTR NEXTROUTINE其中,NEXTROUTINE为转向的符号地址,FARPTR则是表示段间转移的操作符
4.段间间接寻址方式用存储器中的二个相继字的内容分别取代IP寄存器和CS寄存器的当前内容,以达到段间转移的目的这里存储单元的地址是由指令指定的除立即寻址方式和寄存器寻址方式以外的任何一种数据寻址方式取得O汇编语言助记符格式可表示为JMP DWORDPTR[INTERS+BX]其中,[INTERS+BX]说明数据寻址方式为寄存器相对寻址方式,DWORDPTR为双字操作符,表明转向地址需取双字,以便实现段间转移第二节8088的指令系统六组指令数据传送指令、算术指令、逻辑指令、串处理指令、控制转移指令和处理机控制指令
一、数据传送指令四种数据传送指令负责把数据、地址或立即数传送到寄存器或存储器单元中去L通用数据传送指令MOV、PUSH、POP、XCHG1MOV Move传送指令格式MOV DST,SRC执行操作DST-SRC其中,DST表示目的操作数,SRC表示源操作数说明MOV指令有六种格式,分别是1MOV mem,reg2MOV reg,mem3MOV regl,reg24MOV mem/reg,data5MOV segreg,mem/reg6MOV mem/reg,segregmem存储器单元,实际给出存储器单元的偏移地址,reg寄存器data立即数segreg表示段址寄存器“/”表示“或者”一般在双操作数指令中,除了使用立即数寻址方式以外,两操作数中必定有一个使用寄存器寻址方式如下面的指令就是错误的MOV[2040H],[3040H]另外,在双操作数和单操作数指令中也不允许使用代码段的段址寄存器CSo例
2.13MOV AX,DATA_SEGMOV DS,AX以上指令中,DATA.SEG是程序中该指令前已定义数据段的段地址,这里表示为符号地址8088规定,段地址送段址寄存器必须经过累加器AX例
2.14MOV AL,E字符E的ASCII码45H送8位寄存器AL,执行结果是AL二45H例
2.15MOV BX,TABLETABLE是程序中该指令前已定义的存储单元的符号地址,指令执行的过程是将以TABLE为地址的存储单元的内容送到寄存器BX中去例
2.16MOV BX,OFFSET TABLE通过操作符OFFSET将TABLE的偏移地址即有效地址EA送BX例
2.17MOV AX,Y[BP][SI]通过基址变址相对寻址方式,从堆栈里取出一个字数据送AX2PUSH Pushonto thestack压栈指令格式PUSH SRC执行操作SP-SP-2;SP+1,SP-SRC3POP Popfrom thestack退栈指令格式POP DST执行操作DST一SP+1,SP;SP-SP+2说明1堆栈是一个存储区,它必须存在于堆栈段中,因而其段地址存放于SS寄存器中2使用这两条指令时,堆栈是以“先进后出”的方式工作的3堆栈指针SP的内容始终都指向当前的栈顶,而栈顶地址,就是相应的物理地址所以PUSH和POP指令的操作都是针对栈顶的4字操作5可以使用除立即数以外的所有寻址方式指令也可以指定段址寄存器作为操作数,但不允许使用CS寄存器例
2.18PUSH AX例
2.19POP AX指令执行情况如图2T与图2-2所示4XCHG Exchange交换指令格式XCHG OPRI,OPR2执行操作OPR1----OPR2说明1两操作数均不能使用立即数;2两操作数中至少有一个必须为寄存器寻址方式;3两操作数不允许使用段址寄存器;4允许字节或字操作例
2.20XCHG BX,[BP+SI]BX里的内容与SS X16D+BP+SI为物理地址的字单元内容进行交换以上四条指令的执行不影响PSW的标志位.累加器专用传送指令IN、OUT、XLAT2这组指令只限于使用累加器AX或AL在CPU与外部设备I/O端口之间传送信息1IN Input输入指令长格式IN AL,PORT字节执行操作:AL一PORTIN AX,PORT字执行操作:AX-PORT+1,PORT短格式IN AL,DX字节执行操作:AL一DXIN AX,DX字执行操作:AX-DX+1,DX输出2OUT Output指令长格式OUTPORT,AL字节执行操作:PORT—ALOUTPORT,AX字PORT+1,执行操作:PORT-AX短格式OUTDX,AL字节执行操作:DX-ALOUT执PORT,AX字行操DX+1,DX-AX在8088系统中,作所:有外设I/O端口与CPU之间的通信都由IN和OUT指令来完成,其中IN指令完成从I/端口到CPU的信息传送,而OUT指令完成从CPU到I/O端口的信息传送CPU只能使用累加器AX或AL接收和发送信息在上面的指令格式中,PORT表示8位I/O端口地址,如24H,0AFH等,在指令中直接指定,而16位I/O端口地址则必须先存放于DX寄存器中,才能使用短格式输入、输出指令例
2.21IN AL,2811执行的操作是将端口地址为2811的I/O端口上的8位信息传送到AL累加器例
2.22IN AX,28H执行的操作是将端口地址为28H的I/O端口上的16位信息传送到AX累加器实际上是将端口地址为28H的I/O端口上的8位信息传送到AL累加器,而将端口地址为29H的I/O端口上的8位信息传送到AH累加器例
2.23MOV DX,120AHOUT DX,AL执行的操作是将AL累加器中的8位信息传送到端口地址为120AH的端口上去33XLAT Translate换码指令格式XLAT执行操作AL一BX+AL经常需要把一种代码转换成另一种代码,例如把字符的扫描码转换成ASCII码或者把数字09转换成7段数码管所需要的显示码等,XLAT就是为这种用途所设置的指令在使用这条指〜令以前,应先建立一个字节表格,表格的首地址提前存入BX寄存器,需要转换的代码应该是相对于表格首地址的位移量,也应该提前存放在AL寄存器中,表格的内容则是所要换取的代码,该指令执行后,就可在AL寄存器中得到转换后的代码例
2.24数字09对应的格雷码为18H、34H、05H、06H、09H、OAH、OCH、11H.12H、14H,〜存在表首地址为TABLE的表格里,下面的程序段完成的任务是将某一个数字转换为相对应的格雷码MOV BX,OFFSET TABLEMOVAL,4XLAT给定一个十进制数4,执行后AL寄存器的内容即为相应的格雷码09Ho
3.地址传送指令LEA、LDS、LES这一组指令完成把地址送到指定寄存器的功能1LEA LoadEffective Address有效地址送寄存器指令格式LEA REG,SRC执行操作REG-SRC指令把源操作数的有效地址即偏移地址送到指定的寄存器例
2.25LEA BX,TABLE执行的操作是将符号地址TABLE的偏移地址送到BX寄存器去这条指令与下面这条指令的功能是相同的MOV BX,OFFSET TABLE例
2.26LEA SI,[1200H]该指令中1200H就是偏移地址,执行后,SI二1200H例
2.27LEA BX,[BX+SI+0F62H]执行的操作是将源操作数的偏移地址BX+SI+0F62H送BX寄存器要注意的是,指令MOVSI,OFFSET[BX+SI+0F62H]是错误的2LDS LoadDS with Pointer指针送寄存器和DS指令格式LDS REG,SRC执行操作REG-SRCDS-SRC+2定SI寄存器SL[10H]例
2.28LDSDS=C000H,C0010H=018011,C001211=200011如指令执行前SI=018011,DS=2000H则指令执行后withPointer指针送寄存器和ES指令3LES LoadES格式:LES REG,SRC把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中该指令常指执行操作:REG-SRCES-SRC+2把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中该指令常指定DI寄存器说明1以上三条指令指定的寄存器不能使用段址寄存器;2源操作数必须使用除立即数和寄存器寻址方式外的其它寻址方式;3这些指令不影响标志位
4.标志寄存器传送指令LAHF、SAHF、PUSHF、POPF1LAHF LoadAH withFlags标志送AH指令格式LAHF执行操作AH一PSW7〜2SAHF StoreAH intoFlags AH内容送标志寄存器指令格式SAHF执行操作PSW7o-AH〜3PUSHF Pushthe Flags标志压栈指令格式PUSHF执行操作SP-SP-2;SP+1,SP-PSW4POPF Popthe Flags标志出栈指令格式POPF执行操作:PSW+作SP+1,SP;SP-SP+2说明以上四条指令中LAHF、PUSHF指令不影响标志位;SAHF、POPF指令影响标志位
二、算术指令包括二进制运算和十进制运算指令算术指令用来执行算术运算双操作数指令的两个操作数中除源操作数为立即数的情况外,必须有一个操作数在寄存器中单操作数指令不允许使用立即数寻址方式L加法指令ADD、ADC、INC1ADD Add加法指令格式ADD DST,SRC执行操作DST-DST+SRC2ADC Addwith Carry进位加指令格式ADC DST,SRC执行操作DST-DST+SRC+CF3INC Increment增1指令格式INC OPR执行操作OPROPR+1说明1以上三条指令都可作字或字节操作;2除INC指令不影响进位标志位CF外,它们都影响条件标志位主要是CF、ZF、SF、0F四位加法指令对CF和0F的设置情况CF用来表示无符号数加法的溢出与否规则是当最高位有向高位进位时,CF=1;反之,CF=0利用CF的设置,可以实现双字长数据的加法例
2.29执行两个无符号双精度数双字长的加法一个加数放在AX:BX中另一个加数放在CX:DX中。
个人认证
优秀文档
获得点赞 0