微机原理与汇编语言第06章_第1页
微机原理与汇编语言第06章_第2页
微机原理与汇编语言第06章_第3页
微机原理与汇编语言第06章_第4页
微机原理与汇编语言第06章_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

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

文档简介

第6章汇编语言程序设计及应用举例本章重点:进一步熟悉理解8086/8088微处理器的指令。掌握二进制及十进制算术运算指令及程序设计的方法,掌握XLAT转换指令及查表程序设计,理解位运算指令包括逻辑运算指令和移位指令及应用.了解串处理指令的功能,掌握常用的DOS功能调用和BIOS中断调用指令的使用方法,能综合应用汇编指令编写格式正确的汇编源程序等。第6章汇编语言程序设计及应用举例6.1算术运算程序设计6.2数码转换6.3查表程序设计6.4逻辑运算6.5字符串处理6.6系统的功能调用6.7综合编程应用举例6.1算术运算程序设计四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算请注意算术运算类指令对标志的影响掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD6.1.1加法类指令1.加法指令ADD功能:OPRD1←OPRD1+OPRD2完成两个操作数相加,结果送至目的操作数OPRD1。目的操作数可以是累加器,通用寄存器及存储器操作数。ADD指令影响所有标志位CF、DF、PF、SF、ZF和AF。

MOVAX,2;(AX)=2 MOVBX,4;(BX)=4 ADDAX,BX;(AX)=6例6.1.1:加法运算moval,0fbh ;al=0fbhaddal,07h ;al=02hmovwordptr[200h],4652h;[200h]=4652hmovbx,1feh ;bx=1fehaddal,bl

;al=00haddwordptr[bx+2],0f0f0h;[200h]=3742hADD1.加法指令ADD例如:ADDAL,30;累加器与立即数相加ADDBX,[3000H];通用寄存器与存储单元内容相加ADDDI,CX;通用寄存器之间ADDDX,DATA[BX+SI];通用寄存器与存储单元内容相加ADDBUFF[SI],DX;存储器操作数与寄存器相加6.1算术运算程序设计2.加进位的加法指令ADC格式:ADCOPRD1,OPRD2功能:OPRD1←OPRD1+OPRD2+CF这条指令与上—条指令类似,只是在两个操作数相加时,要把进位标志CF的现行值加上去,结果送至目的操作数。这条指令对标志位的影响与ADD相同。[例]:计算13579BDFH十02468ACEH的值。MOVDX,1357HMOVAX,9BDFHADDAX,8ACEH;CF=1,(AX)=26ADHADCDX,0246H;(DX)=159EH例6.1.2:双字加法movax,4652h ;ax=4652haddax,0f0f0h ;ax=3742h,CF=1movdx,0234h ;dx=0234hadcdx,0f0f0h ;dx=f325h,CF=0;DX.AX=02344652H

+F0F0F0F0H

=F3253742HADC6.1算术运算程序设计格式:INCOPRD功能:OPRD←OPRD+1完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。INC指令执行的结果不影响CF位,而对其它5个标志位AF、OF、PF、SF和ZF有影响。例如:

MOVAL,-2;(AL)=-2 ADDAL,1;(AL=-1,CF=0 ADDAL,1;(AL)=0,CF=1 ADCAL,4;(AL)=5,CF=0 MOVAL,-2;(AL)=-2 ADDAL,1;(AL)=-1,CF=0 INCAL;(AL)=0,CF=0 ADCAL,4;(AL)=4,CF=03.加1指令INC6.1算术运算程序设计1.减法指令SUB格式:SUBOPRD1,OPRD2功能:OPRD1←OPRD1-OPRD2完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。例如:

SUBCX,BX SUB[BP],CL6.1.2减法类指令例6.1.3:减法运算moval,0fbh ;al=0fbhsubal,07h ;al=0f4h,CF=0movwordptr[200h],4652h;[200h]=4652hmovbx,1feh ;bx=1fehsubal,bl

;al=0f6hsubwordptr[bx+2],0f0f0h;[200h]=5562h,CF=1SUB6.1算术运算程序设计格式:SBBOPRD1,OPRD2功能:OPRD1←OPRD1-OPRD2-CF这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值。本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。同ADC指令一样,本指令主要用于多字节操作数相减。[例6.1.3]:计算13579BDFH-02468ACEH的值。

MOVAX,9BDFH SUBAX,8ACEH;CF=0,(AX)=1111H MOVDX,1357H SBBDX,0246H;(DX)=1111H2.带借位的减法指令SBB例6.1.3b:双字减法movax,4652h ;ax=4652hsubax,0f0f0h ;ax=5562h,CF=1movdx,0234h ;dx=0234hsbbdx,0f0f0h ;dx=1143h,CF=1;DX.AX=02344652H

-F0F0F0F0H

=11435562HSBB6.1算术运算程序设计格式:DECOPRD功能:OPRD←OPRD-1对指令的操作数减1,然后送回此操作数。在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF和ZF,但对CF标志不影响(即保持此指令以前的值)。例如: CLC;CF=0 MOVAX,0;(AX)=0,CF=0 DECAX;(AX)=-1,CF=0 SBBAX,3;(AX)=-4,CF=03.减1指令DEC

INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志6.1算术运算程序设计格式:NEGOPRD功能:OPRD←0-OPRD对操作数取补,即用零减去操作数,再把结果送回操作数。求补运算属于减法运算,只不过被减数为0。例:假设AL=4,执行NEGAL后,(AL)=11111100=[-4]补4.求补指令NEG例:MOVAH,5NEGAH;AH=11111011B,是-5(补码)MOVAX,-6NEGAX;AX=0006H,是+6注:操作数为0,结果不变;操作数为-128或-32768,结果数值不变,但置OF=1;NEG指令影响所有标志位。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。例: MOVAL,3;(AL)=3,CF=0NEGAL;(AL)=-3,CF=1NEGAL;(AL)=3,CF=1例6.1.4:求补运算movax,0ff64hnegal;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1subal,9dh;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1negax;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1decal;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1negax;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0NEG6.1算术运算程序设计格式:CMPOPRD1,OPRD2功能:OPRD1-OPRD2比较指令完成两个操作数相减,使结果反映在标志位上,但不送回结果。例如: CMPAL,100 CMPDX,DI CMPCX,COUHT[BP] CMPCOUNT[SI],AX5.比较指令CMP例6.1.4:比较AL与100

cmpal,100

;al-100

jbbelow

;al<100,跳转到below执行

subal,100

;al≥100, al←al-100 incah ;ah←ah+1below: ...执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等CMP6.1算术运算程序设计格式:MULOPRD;OPRD为源操作数完成字节与字节相乘、字与字相乘,且默认的一个操作数放在AL或AX中,而源操作数由指令给出。8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。注意:源操作数不能为立即数。6.1.3乘法指令1.无符号乘法指令MUL例如: MOVAL,FIRST;FIRST、SECOND定义为字节变量MULSECOND;结果为AX=FIRST*SECONDMOVAX,THIRD;THIRD定义为字变量MULAX;结果DX:AX=THIRD*THIRD[例6.1.5]:计算255×2的值MOVAL,-1;(AL)=255MOVBL,2MULBL;(AX)=510,CF=OF=1例6.1.5:乘法运算moval,0b4h ;al=b4h=180movbl,11h ;bl=11h=17mul

bl

;ax=Obf4h=3060;OF=CF=1,AX高8位不为0moval,0b4h ;al=b4h=-76movbl,11h ;bl=11h=17imul

bl

;ax=faf4h=-1292;OF=CF=1,AX高8位含有效数字6.1算术运算程序设计格式:IMULOPRD;OPRD为源操作数这是一条带符号数的乘法指令,同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。2.带符号乘法指令IMUL[例6.1.6]:计算-1×2的值MOVAL,-1MOVBL,2IMULBL;(AX)=-2,CF=OF=0从例子中可以看出,到底一个数是有符号数还是无符号数,由用户编程决定。例:假设AL=0FFh,BL=0FFh执行MULBL;则有AX=255×255=65025执行IMULBL;则有AX=(-1)×(-1)=16.1算术运算程序设计除法指令包括无符号除法指令(DIV)和带符号除法指令(IDIV)两类。1.无符号除法指令DIV

格式:DIVOPRD;OPRD为源操作数2.带符号除法指令IDIV

格式:IDIVOPRD;OPRD为源操作数6.1.4除法指令MOVAX,13MOVBL,3DIVBL[例6.1.7]:计算-2÷2的值MOVAX,-2MOVBL,2IDIVBL;(AL)=-1,(AH)=0注意:余数的符号和被除数一致。-5/3=-1…-2=-2…+1,但计算机上,商为-1,余数是-2。例4.1.6:除法运算movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=180divbl

;商al=05h=5

;余数ah=7ch=124movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=-76idiv

bl

;商al=f3h=-13

;余数ah=24h=366.1算术运算程序设计3.字节扩展指令CBW格式:CBW;为无操作数指令CBW指令对AL中的带符号数进行符号扩展;当AL<0时,AH被赋值为0FFH,否则AH被置为0。该指令不影响所有标志位。例如: MOVAL,-2;(AL)=0FEHCBW;(AX)=0FFFEHCBW指令一般与IDIV指令配合使用。当程序中需要用一个字节型带符号数去除以另一个字节型带符号数时,按IDIV指令的要求,必须把被除数(字型)放在AX中。为此,就需要用CBW指令,把存放在AL中的字节型被除数进行符号扩展变成字型带符号数。然后,才能用IDIV指令进行除法运算。4.字转换成双字指令CWD格式:CWD;为无操作数指令CWD指令将AX中的符号扩展到DX中。若AX的内容为正数,则扩展以后将0000送入DX;若AX的内容为负数,则扩展以后将0FFFF送入DX。CBW指令和CWD指令格式中不带操作数,隐含对AL、AX中的内容进行操作。例如: MOVAL,-1;(AL)=0FFFFH,(DX)=0CWD;(AX)=0FFFFH,(DX)=0FFFFH例如: MOVAL,91hCBW;AH=0FFhCWD;DX=0FFFFhMOVAL,71hCBW;AH=0CWD;DX=0CWD指令的用法同CBW指令相同,与IDIV指令配合使用。不同之处是将16位的带符号数变换成32位的带符号数。例6.1:符号扩展moval,80h ;al=80hcbw

;ax=ff80haddal,255 ;al=7fhcbw

;ax=007fh例6.1.4:AX÷BXcwd

;DX.AX←AXidiv

bx

;AX←DX.AX÷BX利用符号扩展指令得到除法指令所需要的倍长于除数的被除数对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数[例6.1.8]:在X1、X2、X3字节型变量中,分别存有8位带符号数Y、Z、W,写出实现(Y×Z十W)/Y的指令序列。解:程序如下:MOVAL,X1;(AL)←—YIMULX2;实现(AX)←Y*ZMOVCX,AX;(CX)←(AX)MOVAL,X3;(AL)←WCBW;扩展符号位至AH中ADDAX,CX;(AX)←(AX)+(CX),完成Y*Z+WIDIVX1;完成(Y*Z+W)/Y,商→(AL),余数→(AH)[例6.1.9]:计算两个16位无符号数X=0E659H和Y=8DE0H的乘法运算,并将结果送DS:4000H的存储单元中(低位字放低地址,高位字放高地址)程序清单为:MOVAX,0E659H;取被乘数MOVCX,8DE0H;取乘数MULCX;(AX)=92E0H,(DX)=7FA8HMOVBX,4000H;取目标地址MOV[BX],AX;乘积的低位字送目标地址INCBXINCBXMOV[BX],DX;乘积的高位字送目标地址INT3;程序终止若为有符号数,则执行IMUL,结果为(AX)=92E0H,(DX)=0B6FH[例6.1.10]写出实现计算[W-(X×Y+Z-150)]/R的指令序列。假定X、Y、Z、W、R都为字变量,要求上式计算结果的商存入AX,余数存入DX寄存器。MOVAX,XIMULY;(DX:AX)=X×YMOVBX,AXMOVCX,DX;(保护结果)MOVAX,Z;加ZCWDADDBX,AX;低位相加ADCCX,DX;高位相加SUBBX,540SBBCX,0;处理借位MOVAX,WCWDSUBAX,BXSBBDX,CX;计算W-(X×Y+Z—150)IDIVR;(AX)=商,(DX)=余数6.2数码转换1.压缩BCD码的调整指令DAA;加法的十进制调整指令功能:必须跟在ADD或ADC后使用,将存于AL寄存器中的2位压缩型BCD码加法运算的结果进行调整,调整后结果仍保留在AL中。调整办法:①调整个位。若AF=1或AL低4位>9,则(AL)+6→AL,1→AF。②调整十位。若CF=1或AL高4位>9,则(AL)+60H→AL,1→CF

6.2.1十进制调整指令表6-1十进制调整指令指令格式指令说明DAA压缩的BCD码加法调整DAS压缩的BCD码减法调整AAA非压缩的BCD码加法调整AAS非压缩的BCD码减法调整AAM乘法后的BCD码调整AAD除法前的BCD码调整BCD码(BinaryCodedDecimal),是用4位二进制数表示1位十进制数的编码方式,也称为二一十进制数,或称8421码。所以在计算机中人们用BCD码表示十进制数,对BCD码计算机中有两种表示方法:一类为压缩BCD码,即规定每个字节表示两位BCD数;另一类称为非压缩BCD码,即用一个字节表示一位BCD数,在这字节的高四位用0填充。例如,十进制数25,表示为压缩BCD数时为:25H;表示为非压缩BCD数时为:0205H,用两字节表示。相关的BCD转换指令见表6-1。6.2.1十进制调整指令压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为0十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果分成压缩BCD码和非压缩BCD码调整[例6.2.1]:设(BCD1)=1234H,(BCD2)=6789H。求(BCD1)十(BCD2)的值。结果存BCD3中。如图6-2所示。MOVAL,BCD1;(AL)=34HADDAL,BCD2;(AL)=BDH,AF=0,CF=0DAA;(AL)=23H,AF=1,CF=1MOVBCD3,ALMOVAL,BCDl+1;(AL)=12HADCAL,BCD2+1;(AL)=7AH,AF=0,CF=0DAA;(AL)=80H,AF=1,CF=0MOVBCD3+1,AL6.2数码转换2.DAS指令格式:DAS功能:必须跟在SUB或SBB后使用,将存于AL寄存器中的2位压缩型BCD码减法运算的结果进行调整,调整后结果仍保留在AL中。调整办法:①调整个位。若AF=1或AL低4位>9,则(AL)-6→AL,1→AF。②调整十位。若CF=1或AL高4位>9,则(AL)-60H→AL,1→CF。例:计算85-57的值。MOVAL,85HSUBAL,57H;(AL)=2EH,AF=1,CF=0DAS;(AL)=28H,AF=1,CF=0例6:压缩BCD减法movax,1234hmovbx,4612hsubal,bldas ;34-12=22,CF=0xchgal,ahsbb

al,bhdas ;12-46=66,CF=1xchgal,ah ;11234-4612=66226.2数码转换非压缩BCD码的调整指令AAA;加法的ASCⅡ调整指令AAS;减法的ASCⅡ调整指令AAM;乘法的ASCⅡ调整指令AAD;除法的ASCⅡ调整指令例6:非压缩BCD加movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9addal,bl;二进制加法:al=08h+09h=11haaa;十进制调整:ax=0707h;实现非压缩BCD码加法:68+9=77例6b:非压缩BCD减movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9subal,bl;二进制减法:al=08h-09h=ffhaas;十进制调整:ax=0509h;实现非压缩BCD码减法:68-9=59例6c:非压缩BCD乘movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9mul

bl;二进制乘法:al=08h×09h=0048haam;十进制调整:ax=0702h;实现非压缩BCD码乘法:8×9=72例6d:非压缩BCD除movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9aam;二进制扩展:ax=68=0044hdivbl;除法运算:商al=07h,余数ah=05h;实现非压缩BCD码初法:

68÷9=7(余5)[例6.2.2]:十进制ASCⅡ数相加。设(BCD1)=‘234’,(BCD2)=‘789’,(BCD3)=‘0000’。求解(BCD1)十(BCD2)的值。结果存BCD3中,如图6-4所示。CLCLEASI,BCD1+2;初始化LEADI,BCD2+2LEABX,BCD3+3MOVCX,03H;循环3次LOP:MOVAH,0MOVAL,[SI];(AL)=34HADCAL,[DI];带进位加AAA;ASCⅡ码调整MOV[BX],AL;存放和DECSIDECDIDECBXLOOPLOP;循环3次MOV[BX],AH;保存进位[例6.2.3]:计算96/6=24…1。MOVAX,0906H;(AX)=(96)BCDMOVBL,06H;(BL)=(03H)BCDAAD;(AX)=0060HDIVBL;(AL)=10H,(AH)=0MOVDL,AH;存余数AAM;(AX)=(0106H)BCD应当注意的是,调整指令都隐含着AX或AL,都在AX或AL中进行。BCD码进行乘除法运算时,一律使用无符号数形式,因而AAM和AAD应固定地出现在MUL之前和DIV之后。但除法的调整不同于加法、减法和乘法,除法的调整在除法操作之前进行。[例6.2.4]:已知字变量W1和W2分别存放着两个压缩BCD数,编写程序求两数之和,并将其和送到SUM字节变量中。分析:①定义字变量A1和A2的4位数应为BCD数,其后要加H,只有这样定义装入内存中的数据才是4位BCD数。②BCD数的加减运算只能做字节运算,不能做字运算。这是因为加减指令把操作数都当作二进制数进行运算,运算之后再用调整指令进行调整,而调整指令只对AL作为目的操作数的加减运算进行调整。解:STACKSEGMENTSTACK‘STACK’DW32DUP(0)STACKENDSDATASEGMENTA1DW3456HA2DW6789HSUMDB3DUP(0)DATAENDSCODESEGMENTASSUMESS:STACK,CS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVAL,BYTEPTRA1;AL=31HADDAL,BYTEPTRA2;AL=A9H,CF=0,AF=0DAA;AL=09H,CF=1MOVSUM,ALMOVAL,BYTEPTRA1+1;AL=89HADCAL,BYTEPTRA2+1;AL=0EOH,CF=0,AF=1DAA;AL=46H,CF=1MOVSUM+1,ALMOVSUM+2,0;处理向万位的进位RCLSUM+2,1;也可用指令ADCSUM+2,0MOVAX,4C00H;返回DOSINT21HCODEENDSENDBEGIN6.3查表程序设计格式:XLAT;AL=(DX)×16+(BX)+(AL))功能:完成一个字节的查表转换。AL←(BX+AL)要求:①编程时BX指向表首地址。②AL存放待查数据相对于表首地址的偏移量,表的大小不能超过256个字节。③转换后的结果存放在AL中.1.转换指令XLAT6.3查表程序设计例:内存的数据段有一张16进制数的ASCⅡ码表,首地址为Tab1,如图所示,欲查出表中第10个元素(元素序号从0开始),即‘A’的ASCⅡ码,则可用以下几条指令实现:

MOVBX,OFFSETTable;(BX)←表首址

MOVAL,0AH;(AL)←序号

XLATTable;查表转换 结果‘A’的ASCⅡ码在AL中,即(AL)=41H。2.应用举例[例6.3.1]:将16进制数转换为ASCⅡ码并显示出来,变量TAB1定义如图DATASEGMENTTAB1DB‘0123456789ABCDEF’;0~9,A~F的ASCⅡ码HEXDB5DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLEMOVAL,HEXXLAT;AL=35H,为5的ASCⅡ码MOVDL,AlMOVAH,02HINT21HMOVAX,4C00H;返回DOSINT21HCODEENDSENDSTART

XLAT指令中没有明确指明操作数,而是默认采用BX和AL寄存器。XLAT指令也可用在数制转换、函数表查表、代码转换等场合。

[例6.3.2]:以BUF为首地址的内存中存有1~15的平方表。查表求X单元中数(在1~15之间)的平方值,并送回X单元。DATASEGMENTQTabDB1,4,9,16,25,36,49,64DB81,100,121,144,169,196,255;平方表XDB12DATAENDSSTACKSEGMENTSTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK;段地址说明START:MOVAX,DATAMOVDS,AX;数据段地址装填(堆栈段地址由系统装填)MOVSI,OFFSETQTab

;取QTab的偏移量XORAX,AX;AX清0MOVAL,X;取XDECALADDSI,AX;X平方值的地址MOVAL,[SI];取X的平方值MOVX,AL;保存在X单元MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART 填入适当指令,实现AX中十六进制数转换为ASCII码.

MOVAX,1A78HANDAL,0FHADDAL,30HCMPAL,3AHJLNEXT——————NEXT:MOV[DI],AL 执行程序段后,

寄存器

AL和

AH的内容分别是——,

——MOVAL,20HMOVBL,ALADDAL,BLSBBAL,10HCBWDIVBL

MOVAX,0FFFFHMOVBX,-1IMULBXJMPDX执行下列程序段后,AX及IP的值分别为—

程序段分析,执行程序后,AX和DX的内容分别是——MOVCL,4MOVDX,248AHMOVAX,8103HROLDX,CLMOVBH,AHSARBH,CLSHLAX,CLORDL,BH6.4逻辑运算逻辑运算指令(1)ANDOPRD1,OPRD2;按位与操作(2)OROPRD1,OPRD2;按位或操作(3)XOROPRD1,OPRD2;按位异或操作(4)NOTOPRD;按位取反操作(5)TESTOPRD1,OPRD2;按位与操作,不送回结果逻辑运算指令除NOT指令不影响标志位外,其它指令影响SF/ZF/PF标志位,且总是使CF=0,OF=0,AF无定义。逻辑运算指令也称位操作指令.位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握注意:这些指令对标志位的影响1、逻辑运算指令AND

OR

XOR

NOT

TEST2、移位指令SHL

SHR

SAR3、循环移位指令ROL

ROR

RCL

RCR6.4逻辑运算移位指令SAL/SHLDST,CNT;算术左移/逻辑左移SHRDST,CNT;逻辑右移SARDST,CNT;算术右移移位次数CNT可以是1,若移位次数大于1时,必须放在CL中,移位结束后,CL值不变。影响AF以外的各标志位,而AF不定。1、逻辑与指令AND对两个操作数执行逻辑与运算,结果送到目的操作数AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义ANDreg,imm/reg/mem

;reg←reg∧imm/reg/memANDmem,imm/reg

;mem←mem∧imm/reg只有相“与”的两位都是1,结果才是1;否则,“与”的结果为02、逻辑或指令OR对两个操作数执行逻辑或运算,结果送到目的操作数OR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义ORreg,imm/reg/mem

;reg←reg∨imm/reg/memORmem,imm/reg

;mem←mem∨imm/reg只要相“或”的两位有一位是1,结果就是1;否则,结果为03、逻辑非指令NOT对一个操作数执行逻辑非运算NOT指令是一个单操作数指令NOT指令不影响标志位NOTreg/mem

;reg/mem←~reg/mem按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”4、逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送到目的操作数XOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义XORreg,imm/reg/mem

;reg←reg⊕imm/reg/memXORmem,imm/reg

;mem←mem⊕imm/reg只有相“异或”的两位不相同,结果才是1;否则,结果为05、逻辑测试指令TEST对两个操作数执行逻辑与运算,结果不回送到目的操作数AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义TESTreg,imm/reg/mem

;reg∧imm/reg/memTESTmem,imm/reg

;mem∧imm/reg只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0例6.4:测试为0或1testal,01h ;测试AL的最低位D0jnzthere ;标志ZF=0,即D0=1

;则程序转移到there... ;否则ZF=1,即D0=0,顺序执行there:...

TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况TEST例6.4:逻辑指令应用;AND指令可用于某几位复位(同0相与),不影响其他位:将BL中D3和D0位清0,其他位不变andbl,11110110B;OR指令可用于置位(同1相或),不影响其他位:将BL中D3和D0位置1,其他位不变orbl,00001001B;XOR指令可用于求反(同1相异或),不影响其他位:将BL中D3和D0位求反,其他不变xor

bl,00001001B小结 对某些位清零,用与指令AND,操作时用‘0’与; 对某些位置1,用或指令OR,用‘1’或; 对某些位取反,用异或指令XOR,用‘1’异或。6.4逻辑运算ROLDST,CNT;循环左移RORDST,CNT;循环右移RCRDST,CNT;带进位循环右移RCLDST,CNT;带进位循环左移只影响CF和OF,同样只有当CNT=1时,OF才有意义。操作数同移位指令。6.4.2循环移位指令移位指令(shift)将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作SHLreg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0SHRreg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0SALreg/mem,1/CL;算术左移,最高位进入CF,最低位补0SARreg/mem,1/CL;算术右移,最低位进入CF,最高位不变SAL与SHL相同演示图示移位指令的功能移位指令的操作数移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元后一个操作数表示移位位数,该操作数为1,表示移动一位;当移位位数大于1时,则用CL寄存器值表示,该操作数表达为CL例6.4.5:移位指令movcl,4moval,0f0h ;al=f0hshlal,1 ;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shral,1 ;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1saral,1 ;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0sar

al,cl

;al=03h;CF=1,SF=0、ZF=0、PF=1例6.4.6移位乘法mov

si,axshlsi,1 ;si←2×axaddsi,ax

;si←3×axmov

dx,bxmovcl,03hshl

dx,cl

;dx←8×bxsubdx,bx

;dx←7×bxadddx,si

;dx←7×bx+3×ax逻辑左移一位相当于无符号数乘以2

逻辑右移一位相当于无符号数除以2[例6.4.6]:设AX=9234H,CF=0,根据要求写出指令并求出执行指令后AX的内容。①AX逻辑左移1位SHLAX,1;结果为AX=2468H,CF=1②AX逻辑右移2位MOVCL,02SHRAX,CL;结果为AX=248DH,CF=0③AX算术右移2位MOVCL,02SARAX,CL;结果为AX=E48DH,CF=02、循环移位指令ROLDST,CNT;循环左移RORDST,CNT;循环右移RCRDST,CNT;带进位循环右移RCLDST,CNT;带进位循环左移只影响CF和OF,同样只有当CNT=1时,OF才有意义。操作数同移位指令。①循环左移指令ROLDST,CNT功能:将目标操作数DST循环左移若干位。每左移一位,左移前的最高位都送最低位及CF。例如:MOVCL,4MOVAL,11011010B;(AL)=0DAHROLAL,CL;(AL)=0ADH,AL中高4位和低4位内容交换②循环右移指令RORDST,CNT功能:将目标操作数DST循环右移若干位。每右移一位,右移前的最低位都送最高位及CF。例如:MOVBL,01110011B;(BL)=73HRORBL,1;(BL)=10111001B,CF=1③带进位循环左移指令RCLDST,CNT功能:将目标操作数DST连同CF循环左移若干位。每左移一位,左移前的最高位都送CF,左移前的CF送最低位。例如:STCMOVBL,01111100B;(BL)=7CHRCLBL,1;(BL)=11111001B,CF=0④带进位循环右移指令RCRDST,CNT功能:将目标操作数DST连同CF循环右移若干位。每右移一位,右移前的CF送最高位,右移前的最低位送CF。例如:CLCMOVAL,11110011B;(L)=0F3HRCRAL,1;(AL)=01111001B,CF=1又如:BX=1234H,AX=0,则执行指令RCRBX,CL移位前:BX=0001001000111100B移位后:BX=1000000100100011B;结果BX=8123H3、移位指令的应用[例6.4.7]:将一个16位无符号数乘以10。该数原来存放在以FACTOR为首址的两个连续的存储单元中(低位在前,高位在后)。无符号数左移1位,只要左移以后的数未超出一个字节或一个字的表达范围相当于乘以2,右移1位相当于除以2,所以可用移位指令实现无符号数的乘法和除法,移位指令执行的时间比乘法和除法执行的时间短。因为FACTOR×10=(FACTOR×8)+(FACTOR×2),故可用左移指令实现以上乘法运算。编程如下:MOVAX,FACTOR;(AX)——被乘数SHLAX,1;(AX)=FACTOR×2MOVBX,AX;暂存BXSHLAX,1;(AX)=FACTOR×4SHLAX,1;(AX)=FACTOR×8ADDAX,BX;(AX)=FACTOR×10在数的输入输出过程中乘10的操作是经常要进行的。而X×10=X×2+X×8,也可以采用移位和相加的办法来实现乘10。为保证结果完整,先将AL中的字节扩展为字。MOVAH,0SALAX,1;X×2MOVBX,AX;移至BX中暂存SALAX,1;X×4SALAX,1;X×8ADDAX,BX;X×106.5字符串处理1.方向标志位DF清0指令CLD格式:CLD功能:DF←0。DF=0,则控制串操作指令地址指针自动增量,指向下一个要处理的数。2.方向标志位DF置1指令STD格式:STD功能:DF←1。DF=1,则控制串操作指令地址指针自动减量,指向下一个要处理的数。6.5.1控制位DF一个串传送指令-MOVSB执行movsb相当于(1)((es)*16+(di))=((ds)*16+(si))(2)如果DF=0,则si=si+1

di=di+1

如果DF=1,则si=si-1

di=di-1一个串传送指令-MOVSB使用语法进行功能描述(1)mov

es:[di],byte

ptr

ds:[si];仅用于描述,CPU不支持此类指令(2)如果DF=0,则incsi

incdi

如果DF=1,则dec

si

dec

di结论:movsb将ds:si指向的内存单元中的字节送入es:di中,根据df的值,将si和di递增或递减一个串传送指令-MOVSW使用语法进行功能描述(1)mov

es:[di],word

ptr

ds:[si];仅用于描述,CPU不支持此类指令(2)如果DF=0,则addsi,2

adddi,2

如果DF=1,则subsi,2

subdi,2结论:movsw将ds:si指向的内存单元中的字节送入es:di中,根据df的值,将si和di递增2或递减26.5.2串处理指令1.重复指令前缀串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。

Movsb和movsw进行串传送操作中的一个步骤,一般都和rep配合使用,格式如下:

repmovsb6.5.2串处理指令

用汇编语法来描述repmovsb的功能就是:

s:movsbloops

可见rep的作用是根据cx的值,重复执行后面的串传送指令。

repmovsb可以循环实现(cx)个字符的传送。Movsw功能同理。6.5.2串处理指令

编程举例:用串传送指令,将data段中的第一个字符串复制到它后面的空间中。

datasegment db‘welcometomasm!’ db16dup(0) dataends需要提供必要信息???传送的原始位置ds:si传送的目的位置es:di

传送的长度cx传送的方向6.5.2串处理指令传送的原始位置ds:si传送的目的位置es:di

传送的长度cx传送的方向传送的原始位置data:0传送的目的位置data:16 传送的长度16传送的方向df=0常用datasegment db‘welcometomasm!’ db16dup(0)dataends6.5.2串处理指令明确以上信息,代码编写如下

mov

ax,data

mov

ds,ax

mov si,0

mov

es,ax

mov di,16

mov cx,16

cld rep movsb6.5.2串处理指令

编程举例:用串传送指令,将F000H段中的最后16个字符复制到data段中。

datasegment db16dup(0) dataends需要提供必要信息???

要传送的字符位于F000H段的最后16个单元,因此最后一个字符地址位置:F000:FFFF。逆向传递更好(高地址向低地址)传送的原始位置ds:si传送的目的位置es:di

传送的长度cx传送的方向6.5.2串处理指令传送的原始位置ds:si传送的目的位置es:di

传送的长度cx传送的方向传送的原始位置F000:FFFF传送的目的位置data:15 传送的长度16传送的方向df=1datasegment db16dup(0)dataends6.5.2串处理指令明确以上信息,代码编写如下

mov ax,0f000h

mov

ds,ax

mov si,0ffffh

mov

es,ax

mov di,15

mov cx,16 std rep movsb注:实验五:思考题参考以上思路进行答题。6.5字符串处理表6-2重复前缀汇编格式执行过程影响指令REP(1)若(CX)=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)MOVS,STOS,LODSREPE/REPZ(1)若(CX)=0或ZF=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)CMPS,SCASREPNE/REPNZ(1)若(CX)=0或ZF=1,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)CMPS,SCAS重复串传送(例6.5.1)

mov

si,offsetsource

mov

di,offsetdestination

movcx,100 ;cx←传送次数

cld repmovsbagain: movsb

;传送一个字节

dec

cx

;传送次数减1

jnzagain ;判断传送次数cx是否为0

;不为0(ZF=0),则转移again位置执行 ;否则,结束演示例6.5.1b:比较字符串

mov

si,offsetstring1

mov

di,offsetstring2

mov

cx,count

cld

repz

cmpsb

;重复比较两个字符

jnz

unmat

;字符串不等,转移

moval,0 ;字符串相等,设置00h

jmpoutput ;转向outputunmat: moval,0ffh ;设置ffhoutput: movresult,al ;输出结果标记解释重复比较的解释指令repz

cmpsb结束重复执行的情况①ZF=0,即出现不相等的字符②CX=0,即比较完所有字符:这种情况下,如果ZF=0,说明最后一个字符不等;而ZF=1表示所有字符比较后都相等,也就是两个字符串相同所以,重复比较结束后,jnz

unmat指令的条件成立ZF=0,表示字符串不相等6.5字符串处理串指令共有五种,具体见表6-3。对串指令要注意以下几个问题:(1)MOVS目标串,源串;串传送指令(2)CMPS目标串,源串;串比较指令(3)SCAS目标串;串扫描指令(4)LODS源串;串读取指令(5)STOS目标串;串存储指令①.一个串都有首地址和串长度。源串首地址是DS:SI,目的串首地址是SE:DI;串长度放CX,存取或搜索的默认值放AL中。②.源串默认在数据段DS,可以有段超越,但目的串必须在附加段ES,不允许段超越。2.串指令例6.5.3:字节串传送

mov

si,offsetsource

mov

di,offsetdestination

movcx,100 ;cx←传送次数

cld

;置DF=0,地址增加again: movsb

;传送一个字节

dec

cx

;传送次数减1

jnzagain

;判断传送次数cx是否为0

;不为0,则到again位置执行指令 ;否则,结束offset是汇编操作符,求出变量的偏移地址演示例6.5:串存储

movax,0

movdi,0

movcx,8000h

;cx←传送次数(32×1024)

cld

;DF=0,地址增加again: stosw

;传送一个字

dec

cx

;传送次数减1

jnzagain ;传送次数cx是否为0可将CLD改为STD吗?如何改用STOSB?

可不用给DI赋值吗?DI为偶数即可6.5字符串处理[例]:数据段(符号地址mess1开始)中有一字符串(10B),要求传送到附加段(符号地址mess2开始)中的一个缓冲区。解:编程如下:DATASEGMENTMESS1DB‘0123…789’DATAENDSEXTASEGMENTMESS2DB10DUP(?)EXTAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:EXTA6.5.3串处理应用举例BEGIN:MOVAX,DATAMOVDS,AXMOVAX,EXTAMOVES,AXCLDMOVCX,5MOVSI,0MOVDI,0REPMOVSWCODEENDSENDBEGIN[例6.5.7]:在存储器的数据段中有100个字节构成的数组,要求从该数组中找出“$”字符,然后将“$”字符前的所有元素相加,结果保留在AL寄存器中。解:编程如下:CLDMOVCX,100MOVSI,0FFHINCSILOP1:CMPBYTEPTR[SI],‘$’LOOPNELOP1SUBSI,0100HMOVCX,SIMOVSI,0100HMOVAL,[SI]DECCXINCSILOP2:ADDAL,[SI]LOOPLOP2;累加‘$’字符前的字节HLT;停机6.6系统的功能调用6.6.1DOS功能调用DOS的中断类型号20H~3FH设置了DOS中断,其中INT21H为DOS系统功能调用,它是DOS的核心功能。该功能向用户提供了一套子程序号组成的系统功能,子程序号随着DOS版本的提高而增多。DOS系统功能调用的子程序号为00H~63H。这些功能独立于硬件。一共84个子程序给汇编语言程序提供了极大方便,用户不必编写这些繁杂程序,也不必搞清有关的设备、电路、接口等,只需通过软件中断指令直接调用这些功能模块(称为中断调用)。调用时,也有如下三个方面的内容:①入口参数;②子程序功能号送入AH或AX中;③DOS系统功能调用INT21H。1.返回DOS●AH=00H,程序终止功能:退出用户程序并返回操作系统。其功能与INT20H指令相同。注意:执行该中断调用时,CS必须指向程序段前缀PSP的起始地址。PSP是DOS装入可执行程序时,为该程序生成的段前缀数据块,当被装入程序取得控制权时,DS、ES便指向PSP首地址。通常,结束用户程序并返回操作系统,需要如下4句指令来完成。

PUSHDS MOVAX,0 PUSHAX;保存PSP入口地址(DS:00)进栈 ┆

RET;弹出PSP入口地址至CS6.6系统的功能调用●AH=4CH,进程终止。功能:结束当前执行的程序,并返回父进程DOS或DEBUG(加载并启动它运行的程序)。返回时,AL中保留返回的退出码。需要如下2句指令。MOVAX,4C00H或MOVAH,4CH;终止当前程序,返回调用它的程序DOSINT21H6.6系统的功能调用功能号AH=1例:MOVAH,1等待从键盘输入一个字符INT21H;中断返回时,输入字符的ASCⅡ码存放在AL中,该字符也显示在屏幕上。3.键盘输入但不显示输入字符功能号AH=8说明:该功能输入一字符,其ASCⅡ码存放在AL中,但不显示。这种功能往往在设置口令时使用。2.键盘输入并显示3、键盘输入但不显示输入字符功能号AH=8说明:该功能输入一字符,其ASCⅡ码存放在AL中,但不显示。这种功能往往在设置口令时使用。例:MOVAH,8;等待从键盘输入一个字符INT21H;中断返回时,输入字符的ASCⅡ码存放在AL中,该字符不显示6.6系统的功能调用功能号AH=2入口参数:DL=待显示字符的ASCⅡ码功能:将DL中的字符输出到屏幕。例:MOVDL,‘A’;DL中装入待显示的字符MOVAH,2;调用结果,在屏幕上显示字符“A”INT21H4.显示一字符5、在打印机上打印一字符功能号AH=5;输出一个字符到打印机入口参数:DL=待打印字符的ASCⅡ码功能:将DL寄存器的字符输出到打印机。6、显示以“$”结尾的字符串功能号AH=9入口参数:DS:DX指向字符串的首地址功能:把DS:DX所指单元内容作为字符串首字符,将该字符串逐个显示在屏幕上,直到遇到串尾标志'$’为止。例:LEADX,BUFF;待显示的字符串的首地址装入DXMOVAH,9;在屏幕上显示由DS:DX所指向的以'$'结尾的字符串INT21H6.6系统的功能调用功能号AH=0AH入口参数:DS:DX指向输入缓冲区。功能:从键盘接收字符串到DS:DX所指内存缓冲区。要求内存缓冲区的格式为:首字节指出计划接收字符个数,第二个字节留作机器自动填写实际接收字符个数,从第三个字节开始存放接收的字符。若实际输入字符数少于指定数,剩余内存缓冲区填零;若实际输入字符数多于指定数,则多出的字符会自动丢失。7.字符串输入(回车——字符串输入结束符)6.6.2DOS功能调用应用举例[例6.6.1]:在显示器上显示“Howareyou?”,然后读一个字符,但不显示此字符,若读入字符是‘y’,则显示‘ok’。DSEGSEGMENTDAT1DB‘Howareyou?’,0DH,0AH,‘$’DAT2DB‘OK’,0DH,0AH,‘$'DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART: MOVAX,DSEG

温馨提示

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

评论

0/150

提交评论