




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
母亲卡第3章
宏汇编语言3.1宏汇编语言中的表达式3.2常用的机器指令语句3.3伪指令语句3.4常用的dos系统功能调用3.5MASM汇编程序的功能<自学>作业3.1宏汇编语句中的表达式3.1.1常量3.1.2数值表达式3.1.3变量3.1.4标号3.1.5地址表达式返回本章首页23.2.1常量1.数值常量2.符号常量返回本节31.数值常量表3.1各种形式数字常量格式对照表<汇编语言大小写不敏感>数值类型常量有二进制、八进制、十进制和十六进制数字形式和字符串形式的常量。4字符串常量是用单引号或双引号引起来的一个或多个字符,或以各字符的ASCⅡ码表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。返回本节字符串形式的常量52.符号常量
对经常使用的数值常量可以先为它定义一个名字,然后在语句中用名字来表示该常量。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。
符号常量需要用等价伪指令EQU和等号伪指令“=”来定义。6等价伪指令的基本格式为:
符号名EQU表达式例:
VALEQU100;表达式为一个常数
NUMEQUVAL+50;表达式为一个数值表达式
OPEEQUADD;表达式为一个指令助记符7等号伪指令的基本格式为:
符号名=常数表达式返回本节例:COUNT=50MOVBX,COUNT;等价于MOVBX,50思考:源操作数采用的什么寻址方式。注意:EQU语句不能重复定义;而“=”伪指令可以重复定义,其作用域从定义点开始到重新定义结束。立即寻址8数值表达式算术表达式(利用算术运算符)逻辑表达式(利用逻辑运算符)关系表达式(利用关系运算符)
数值表达式一般是指由运算符连接的各种常数所构成的表达式。汇编程序在汇编过程中计算表达式,最终得到一个数值,所以,程序运行速度没有变慢,且增强程序的可读性。3.1.2数值表达式返回本节9算术运算符包括:+(加)、-(减)、*(乘)、/(除)、MOD(求模)、SHR(右移)、SHL(左移)几种。1.算术运算符注:1、加+和减-运算符还可以用于地址表达式
2、除加、减外,其他运算符的参数必须是整数10 ┆NUM1 EQU 25*4–50 NUM2 EQU NUM1/7 NUM3 DB NUM1MOD7 VAR1 DB 1,2,3,4,5VAR2 DB ‘12345’NUM4 EQU VAR2-VAR1 ;NUM5 EQU 0FHMOV AL,NUM5SHL4MOV BL,NUM5SHR4 ┆【例3.1】用算术运算符进行数值表达式运算。结果:NUM1=50;NUM2=7;NUM3=1;NUM4=5;
(AL)=11110000B;(BL)=00000000B11逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。2.逻辑运算符12MOV AL,34HAND0FH MOV BL,05HOR30H MOV CX,NOT00FFH MOV DX,789AHXOR000FH NUM5EQU0FH【例3.2】用逻辑运算符进行运算。结果:(AL)=04H;(BL)=35H;(CX)=0FF00H(DX)=7895H;NUM5=0FH13关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。运算结果:若关系不成立,结果为0;否则为0FFFFH。3.关系运算符结果:NUM1=0;NUM2=0FFH;(AX)=0FFFFH;(BX)=0【例3.3】用关系运算符进行数值表达式运算。
NUM1 DB 10LT5 NUM2DB 0AAAAHGT7FFFHMOVAX,‘A‘EQ41H MOV BX,NUM2LTNUM1143.1.3变量1.变量2.变量的定义返回本节15(1)段属性(2)偏移地址属性(3)类型属性1.变量变量是一个数据存储单元的名字。由于汇编语言中存储单元是分段使用的,所以变量具有三个属性:16变量定义伪指令:为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化。2.变量的定义格式:[变量名]变量定义伪指令表达式在汇编语言中变量的主要类型有字节(BYTE)、字(WORD)、双字(DWORD)、四字(QWORD)和十字节(TBYTE),对应的变量定义伪指令即有:DB、DW、DD、DQ、和DT。17表达式项是给变量或指定存储单元赋予初值,它有以下几种形式:(1)数值表达式(2)字符串表达式(3)地址表达式(只适用DW和DD两个伪指令)(4)?表达式(5)带DUP的表达式表达式:18变量定义伪指令可以为一个或连续的存储单元设置数值初值。【例3.4】为数据段分配存储单元。
DATA SEGMENTA DB 11H,12H,13HB DW 1122H,3344HC DD 12345678HDATA ENDS上述变量的存储单元分配及初始化情况如下图3.1所示。(1)数值表达式19图3.1数据段中数据存储分配图20
字符串表达式中的字符串必须用引号引起来。DB、DW、DD伪指令将字符串中的各字符均以ASCⅡ码形式存放在相应的存储单元,但表示形式各不相同。【例3.5】为字符串分配存储单元。
DATA SEGMENTSTR1 DB ‘1234’STR2 DW ‘AB’,‘CD’,‘A’STR3 DD ‘AB’DATA ENDS其存储单元分配如下图3.2所示。(2)字符串表达式21图3.2数据段存储分配图22如果该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。例如:变量定义:BUF1DW A;(A地址为1A89:000A)BUF2DD B;(B地址为1A89:0107)
执行语句:MOVAX,BUF1MOVBX,BUF2MOVCX,BUF1+1AX、BX、CX的内容分别是什么?源操作数是什么寻址方式?(3)地址表达式(只适用DW和DD两个伪指令)→该语句错误(AX)=000AH,(BX)=?,(CX)=0700H直接寻址注意:1、定义该变量的段必须是当前段,即该段的段首址一定要在某一段寄存器中,否则,该变量不能被访问;2、变量的类型必须与指令的要求相符。23
在表达式中使用重复数据操作符DUP,可以为连续的存储单元提供重复数据,其格式为:
NDUP(表达式)其中N为重复因子,只能取正整数,表示定义了N个重复数据存储单元,其类型由它前面的数据定义伪指令确定,而每个数据存储单元中的初值由DUP后面圆括号中的表达式给定。例如:BUFDB100DUP(0)以上语句定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。(5)带DUP的表达式24综合举例思考:以下数据段在内存中的存储情况。DATASEGMENTADWMBUFDB‘AB’,0DH,0AHCONEQU500HBDW0FFAAHDDDBUFMDB2DUP(1),4DUP(2,’B’),’123’,1,2,3DATAENDS253.1.4标号
标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。【例3.6】符号地址表示。 ┆NEXT:MOVAL,[SI] ;带标号NEXT的指令 ┆
DECCXJNENEXT
;标号NEXT作转移指令的操作数261.段属性2.偏移地址属性3.类型属性(有near和far两种类型,凡属near类型的标号只能在定义该标号的段内使用,而far类型的标号却无此限制。)标号也具有三种属性返回本节例如:LOOP1:MOVAL,[SI];定义近标号LOOP1SUB1PROCFAR;定义过程名SUB1为远标号
SUB2PROC;定义过程名SUB2为近标号273.1.5地址表达式地址表达式即表示存储器操作数地址的表达式,由变量、标号、常量、寄存器(BX、BP、SI、DI)中的内容(如[BX])和运算符组成的有意义的式子。地址表达式的值描述一个地址,因此也具有段属性、偏移地址属性和类型属性。地址表达式的特殊算符有属性定义算符、属性分离算符和其它字符。28(1)PTR运算符格式:类型PTR地址表达式功能:指定该地址表达式的类型类型:BYTE、WORD、DWORD、NEAR、FAR等注:
PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。例2:DATASEGMENTABADW1122H,3344H字字节
BEQUBYTEPTRADATAENDS属性定义运算符11H22H33H44H例如:MOV[SI],100;改进为:MOVWORDPTR[SI],100错误,两个操作数没有明确的类型29(2)THIS运算符格式:
THIS类型功能:指定下一个分配的存储单元的类型,通常与EQU或“=”连用,为当前存储单元定义一个指定类型的变量和标号。例:
DATASEGMENTAEQUTHISBYTEABBDW3355H字节字
DATAENDS55H33H30(1)SEG运算符格式:SEG变量或标号功能:分离出其后变量或标号所在段的段首址。例如:MOV AX,SEGARRMOV DS,AX(2)OFFSET运算符格式:OFFSET变量或标号功能:分离出其后变量或标号的偏移地址。例如:MOVBX,OFFSETBUF属性分离算符31(3)TYPE运算符格式:TYPE变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见表3.2所示。32其它算符:(1)LENGTH运算符格式:LENGTH变量功能:该算符返回该变量数据定义伪指令后面第一个表达式的元素的个数,如果为dup表达式则取重复因子n,否则为1。【例3.7】指出分配给指定变量的元素的个数。DATA SEGMENTA DB ‘ABCDEF’B DW 10DUP(1,2DUP(2))D DB 3,20 DUP(0)DATA ENDS ┆ MOV AX,LENGTHA ;
MOV BX,LENGTHB ;
MOV CX,LENGTHD ; ┆结果:
AX=1BX=10CX=133(2)SIZE运算符格式:SIZE变量功能:LENGTH变量*TYPE变量例如:上例中A、B、C三变量:SIZEA=1SIZEB=20SIZED=134(3)字节分离符HIGH和LOW格式:HIGH常量或地址表达式
LOW常量或地址表达式功能:HIGH取高字节数据作运算结果
LOW取低字节数据作运算结果例如:HIGH0FFCCH;结果0FFHLOW0FFCCH;结果0CCH35运算符的优先级表3.3运算符的优先级返回本节363.2常用的机器指令语句1、数据传送类指令2、算术运算类指令3、位操作类指令4、串操作类指令5、控制转移类指令6、处理机控制类指令。8086CPU的指令系统的基本指令返回本章首页37●大多数数据传送类指令、算术运算类指令、位操作类指令及串操作类指令,其双操作数指令有相同的语句格式和操作规定。语句格式:[标号:]操作符OPD,OPS[;注释]操作规定:
a、OPS和OPD应有相同类型;
b、OPD一定不能是立即操作数;
c、操作结束后,OPS不变;
d、OPD和OPS不能同时为存储器操作数。8086CPU的指令的共同的规律38●算术运算和位操作类指令的部分单操作数指令有相同的语句格式和操作规定。
语句格式:[标号:]操作符OPD[;注释]操作规定:
a、操作对象为目的地址中的操作数,操作结束后,将结果送入目的地址中;
b、操作数不能为立即操作数。39对于每一条指令操作,程序员应注意的问题:
a、指令的汇编格式
b、指令的功能
c、适应于指令的操作数寻址方式
d、指令对标志位的影响
e、指令的特殊要求(如默认使用哪些寄存器)403.2.1数据传送类指令一、通用数据传送指令二、地址传送指令返回本节首页注意:数据传送类指令不影响标志位。411.传送指令MOV2.数据交换指令XCHG3.查表转换指令
XLAT一、通用数据传送指令421.传送指令MOV语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。下图2.1描述了MOV指令在传送数据时允许传送的路径及类型。43图2.1MOV指令所允许的数据传送路径及类型注意:1、源和目的操作数不能同时为段寄存器;2、CS不能作为目的操作数;3、IP既不能作为源操作数也不能作为目的操作数;4、立即数不能送到段寄存器。442.数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。注意:1、OPD和OPS都不能是段寄存器;
2、OPD和OPS都不能是立即数。【例3.8】寄存器之间数据交换。MOV AX,5678H ;MOV BX,0FFFFH ;XCHG AX,BX ;结果:(AX)=0FFFFH,(
BX)=5678H453.查表转换指令XLAT语句格式:XLATOPS或XLAT功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。【例3.9】阅读以下程序。
DATASEGMENTTABDB‘0123456789ABCDEF’DATAENDS
……MOVBX,OFFSETTAB;取变量TAB的EA→BXMOVAL,4;TAB表中第五项的偏移量4→AL
XLATTAB;([BX+AL])=(TAB+4)=34H→AL
……返回本节首页461.传送偏移地址指令LEA2.传送偏移地址及数据段首址指令LDS3.传送偏移地址及附加数据段首址指令LES二、地址传送指令471.传送偏移地址指令LEA语句格式:LEAOPD,OPS功能:将操作数OPS的偏移地址传送给操作数OPD。注意:1、OPD一定要是一个十六位的通用寄存器;
2、OPS所提供的一定是一个存储器地址;【例3.10】主存偏移地址的获取。MOVBX,0100H ;MOVSI,0210H ;LEABX,1234[BX+SI] ;结果:(BX)=1544H482.传送偏移地址及数据段首址指令LDS语句格式:LDSOPD,OPS功能:(OPS)→OPD,(OPS+2)→DS注意:1、OPD一定要是一个16位的通用寄存器(通常用SI)
2、OPS所提供的一定要是一个存储器地址,且类型为DD【例3.11】
DATA1SEGMENTT1DDFDATA1ENDS
DATA2SEGMENTFDW70HDATA2ENDS
CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXLDSSI,T1MOVAX,DS:[SI]
…思考:(AX)=?DS:可不可以不要493.传送偏移地址及附加数据段指令LES语句格式:LESOPD,OPS功能:与LDS指令的操作类似,(OPS)→OPD,(OPS+2)→ES。注意:1、OPD一定要是一个16位的通用寄存器(通常用DI)
2、OPS所提供的一定要是一个存储器地址,且类型为DD返回本节首页503.2.2算术运算类指令一、加法指令二、减运算指令三、乘运算指令四、除运算指令五、符号扩展指令返回本节首页511.加1指令
INC2.加指令ADD3.带进位加指令ADC一、加运算指令521.加1指令INC语句格式:INCOPD功能:(OPD)+1→OPD,影响ZF、SF、OF、PF和AF标志,不影响CF标志,可用于对计数器和地址指针进行调整。2.加指令ADD语句格式:ADDOPD,OPS功能:(OPD)+(OPS)→OPD,影响所有条件标志位。3.带进位加指令ADC语句格式:ADCOPD,OPS功能:(OPD)+(OPS)+CF→OPD,影响所有条件标志位。多用于实现多精度加法运算。53【例2.20】无符号双字加法运算。MOVBX,100;INCBX;MOV AX,4652H ;ADD AX,0F0F0H ;MOV DX,0234H ;ADC DX,0F0F0H ;返回本节首页(AX)=4652H,标志位无影响(AX)=3742HOF=0,SF=0,ZF=0,AF=0,PF=1,CF=1(DX)=0234H,标志位无影响(DX)=0F325HOF=0,SF=1,ZF=0,AF=0,PF=0,CF=0(BX)=65H,ZF=0,SF=0,OF=0,PF=1,AF=0(BX)=64H,标志位无影响541.减1指令DEC2.减指令SUB3.求补指令NEG4.带借位减指令
SBB5.比较指令
CMP二、减运算指令551.减1指令DEC语句格式:DECOPD功能:(OPD)-1→OPD,影响ZF、SF、OF、PF、AF标志,不影响CF标志。用于对计数器和地址指针的调整。2.减指令SUB语句格式:SUBOPD,OPS功能:(OPD)-(OPS)→OPD,影响所有条件标志。3.求补指令NEG语句格式:NEGOPD功能:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。影响所有条件标志位。56【例2.22】求补运算。
MOV AX,0FF64H;NEG AX ;
SUB AL,9DH;
NEG AL ;
DEC AL ;
NEG AL ;(AX)=FF64H,标志位无影响(AX)=009CH,OF=0,SF=0,ZF=0,AF=1,PF=1,CF=1(AL)=0FFH,OF=0,SF=1,ZF=0,AF=1,PF=1,CF=1(AL)=01H,OF=0,SF=0,ZF=0,AF=1,PF=0,CF=1(AL)=00H,OF=0,SF=0,ZF=1,AF=0,PF=1,CF=1(AL)=00H,OF=0,SF=0,ZF=1,AF=0,PF=1,CF=0574.带借位减指令SBB语句格式:SBBOPD,OPS功能:(OPD)―(OPS)―CF→OPD,影响所有条件标志,主要用来实现多精度减法运算。例:DATASEGMENTSUB1DW4257H,3412HSUB2DW12A5H,2F65HDSUBDW0,0DATAENDS……MOVAX,SUB1SUBAX,SUB2MOVDSUB,AX;(DSUB)=2FB2HMOVAX,SUB1+2
SBB
AX,SUB2+2;(DSUB+2)=04ADHMOVDSUB+2,AX该程序功能是什么?585.比较指令CMP语句格式:CMPOPD,OPS功能:(OPD)-(OPS),影响所有条件标志位。【例3.12】比较AL的内容数值大小。MOVAL,80H;CMP AL,50H;JB BELOW ;SUB AL,50H;BELOW:…(AL)<50,即CF=1且ZF=0,转到BELOW处执行(AL)=80H,不影响标志位(AL)=80H,OF=1,SF=0,ZF=0,AF=0,PF=1,CF=0(AL)=30H,OF=1,SF=0,ZF=0,AF=0,PF=1,CF=059例:阅读下列程序段,指出它所实现的功能。
CMPAX,0JGEEXIT;如果(AX)大于或等于0转EXITNEGAX;如果(AX)小于0,求其补EXIT:……
该程序段可实现求(AX)绝对值的运算。
60例:x、y、z均为双精度数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,并用W,W+2单元存放w。
MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0
;x+y+24SUBAX,Z
SBBDX,Z+2
;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元返回本节首页611.无符号数乘法指令MUL2.有符号乘指令IMUL三、乘法运算指令621.无符号数乘法指令MUL语句格式:MULOPS功能:字节乘法:(AL)*(OPS)→(AX)
字乘法:(AX)*(OPS)→(DX,AX)注:OPS不能为立即操作数。只影响CF、OF条件标志,若乘积的高位(字节相乘指AH,字相乘指DX)不为0,则CF=1,OF=1;否则CF=0,OF=0。【例2.25】无符号数0A3H与11H相乘。MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H,CF=1,OF=1632.有符号乘指令IMUL语句格式:IMULOPS功能:字节乘法:(AL)*(OPS)→(AX)
字乘法:(AX)*(OPS)→(DX,AX)。注:OPS不能为立即操作数。只影响CF、OF条件标志,若乘积的高位(字节相乘指AH,字相乘指DX)不是低位的符号扩展,则CF=1,OF=1;否则CF=0,OF=0。【例2.26】有符号数48与4相乘。MOV AL,48 ;(AL)=48MOV BL,4 ;(BL)=4IMUL BL ;(AX)=00C0H,OF=1,CF=1返回本节首页641.无符号除指令DIV2.有符号除指令IDIV四、除运算指令651.无符号除指令DIV语句格式:DIVOPS功能:字节除法:(AX)/(OPS)→AL(商)AH(余数)字除法:(DX,AX)/(OPS)→AX(商)DX(余数)注:①OPS不能为立即操作数;②不影响标志位;③如果除数为0或运行结果溢出(即除数为字节或字,商超过8位或16位),则会产生溢出中断,立即中止程序运行。【例2.27】写出实现无符号数1000H/10H运算的程序段。MOV AX,1000H ;(AX)=1000HMOV BL,10H ;(BL)=10HDIV BL ;结果为100H,高出8位,则产生溢出中断662.有符号除指令IDIV语句格式:IDIVOPS功能:字节除法:(AX)/(OPS)→AL(商)AH(余数)字除法:(DX,AX)/(OPS)→AX(商)DX(余数)注:①
OPS不能为立即操作数;②不影响标志位;③如果除数为0或运行结果溢出(即除数为字节或字,商超过8位或16位),则会产生溢出中断,立即中止程序运行;④相除后,商的符号与数学上规定相同,但余数与被除数同号。【例2.28】写出实现有符号数0400H/0B4H运算的程序段。MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HIDIV BL ;(AL)=0F3H,(AH)=24H返回本节首页671.字节转换成字指令CBW2.将字转换成双字指令CWD五、符号扩展指令681.字节转换成字指令CBW
语句格式:CBW功能:将AL中的符号位数据扩展至AH,形成字数据。注:不影响标志位,用于在两个有符号字节相除之前产生一个被除数。【例2.29】将两个有符号数0A5H与15H相除。MOV AL,0A5H;(AL)=0A5HCBW ;(AX)=0FFA5HMOV BL,15H ;(AL)=15HIDIVBL ;692.将字转换成双字指令CWD
语句格式:CWD功能:将AX中的符号位数据扩展至DX,形成双字数据。注:不影响标志位,用于在两个有符号字相除之前产生一个被除数。【例2.30】将字数据扩展成双字数据。MOV DX,0 ;(DX)=0MOV AX,0FFABH ;(AX)=0FFABHCWD ;(DX)=0FFFFH(AX)=0FFABH70MOVAX,XIMULY;x*yMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DX;x*y+zSUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWDSUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIV
X;(v-(x*y+z-540))/x例:x,y,z,v均为16位带符号数,计算(v-(x*y+z-540))/x。返回本节首页713.2.3位操作类指令一、逻辑运算指令二、移位指令
返回本节首页721.求反指令NOT2.逻辑乘指令AND3.测试指令TEST4.逻辑加指令OR5.按位加指令XOR一、逻辑运算指令→不影响标志位CF=0OF=0PF:反映运算结果ZF:反映运算结果SF:反映运算结果AF:未定义注意:逻辑运算指令和逻辑运算符的区别。731.求反指令NOT语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。【例】逻辑非运算。MOV AX,878AH ;(AX)=878AHNOT AX ;(AX)=7875H742.逻辑乘指令AND语句格式:ANDOPD,OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。应用:1)用于将目的操作数中与源操作数置0的对应位清零。【例】将AL中第3位和第7位清零。
MOV AL,0FFHAND AL,77H2)用于提取(或分离)出某些位。【例】MOVAL,00111011BANDAL,00001111B;清除了高四位,保留低四位75【例】AND指令提供了一种将小写字母转换为大写字母的简单方法。如字母‘a’=01100001B
‘A’=01000001B
实现:MOVAL,’a’ANDAL,11011111B注意:AND指令与逻辑运算符AND区分开来.
例:ANDAL,0B6HAND0FDH763.测试指令TEST语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。应用:主要用于检测与源操作数中为1的位相对应的目的地址中的那几位是否为0。【例】测试AX中的第12位是否为0,不为0则转L。
TEST AX,1000HJNE L774.逻辑加指令OR语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。应用:1)该指令用于将目的操作数中与源操作数对应位置1。【例】将AL寄存器中第3位和第7位置1。
MOV AL,0FFHOR AL,88H782)将数字自身进行“或”运算以获取关于其值的某些信息。同时影响标志位以形成某种条件。【例】ORAL,AL则有ZFSF(AL)的值00(AL)>010(AL)=001(AL)<03)可以将数字0-9转换为对应的ASII码。【例】MOVDL,5ORDL,30H795.按位加指令XOR语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。应用:1)该指令用于将目的操作数中与源操作数置1的对应位取反。【例】将AL的第0、4、5位取反。
MOV AL,45H ;(AL)=45HXOR AL,31H ;(AL)=74H2)进行简单数据加密。(利用XOR操作的特性:如果某个操作数与同样的操作数执行两次异或运算后,其值保持不变。)
【例】KEY=239XORAL,KEY80思考题:给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。MOVAX,1470H;ANDAX,AX;ORAX,AX;XORAX,AX;NOTAX;TESTAX,OFOFOH;返回本节首页(AX)=1470H,标志无影响(AX)=1470H,CF=OF=SF=ZF=PF=0(AX)=1470H,CF=OF=SF=ZF=PF=0(AX)=0H,CF=OF=SF=0,ZF=PF=1(AX)=0FFFFH,CF=OF=SF=0,ZF=PF=1(AX)=0FFFFH,CF=OF=ZF=0,SF=PF=181移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式:
[标号:]操作符OPD,1[标号:]操作符OPD,CL功能:为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。二、移位操作指令821.算术左移和逻辑左移指令SAL(SHL)语句格式:SALOPD,1或SHLOPD,1SALOPD,CL或SHLOPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。<影响除AF外的所有条件标志>
CF0【例】算术左移或逻辑左移指令
MOVAL,22HSALAL,1;(AL)=44H,(或SHLAL,1)说明:该指令可以实现数的乘法运算,假设运算结果没有溢出,每移动一位相当于乘以2;若有溢出,仍要使用乘法指令。832.算术右移指令SAR语句格式:SAROPD,1或SAROPD,CL功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。<影响除AF外的所有条件标志>
CF【例】算术右移运算。MOV BH,0F4H ;(BH)=0F4HMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH,CF=0,OF=0说明:用SAR指令可以实现对有符号数除以2的n次方的运算(n为移位次数)。843.逻辑右移指令SHR语句格式:SHROPD,1或SHROPD,CL功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。<影响除AF外的所有条件标志>
0CF【例】逻辑右移指令。
MOVAL,22HSHRAL,1;(AL)=11H,CF=0,OF=0说明:该指令可以实现无符号数的除法运算,每右移一位相当于除以2,移动n次可以实现除以2的n次方的运算。思考题:如何将压缩BCD码(AL中内容)的分解到字节变量A、B中(即变成非压缩BCD码)?854.循环左移指令ROL语句格式:ROLOPD,1或ROLOPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。<只影响CF、OF标志>
CF【例】循环左移指令。
MOVDL,0FAHMOVCL,4ROLDL,CL;(DL)=10101111B,CF=1说明:可以使用ROL指令交换一个字节的高4位和低4位。865.循环右移指令ROR语句格式:ROROPD,1或ROROPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。<只影响CF、OF标志>
CF【例】循环右移指令。
MOVDL,0FAHMOVCL,4RORDL,CL;(DL)=10101111B,CF=1说明:可以使用ROL指令交换一个字节的高4位和低4位。876.带进位的循环左移指令RCL语句格式:RCLOPD,1或RCLOPD,CL功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。<只影响CF、OF标志>
CF【例】要求将AL中的高四位移至DL的低四位中。
MOVCX,4NEXT:SALAL,1RCLDL,1DECCXJNENEXT
思考:以下语句序列能够实现吗?
MOVCL,4SALAL,CLRCLDL,CL887.带进位的循环右移指令RCR语句格式:RCROPD,1或RCROPD,CL功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。<只影响CF、OF标志>
CF例:(AX)=0012H,(BX)=0034H,把它们装配成(AX)=1234H。
MOVCL,8ROLAX,CLADDAX,BX89例:设(BX)=84F0H(1)(BX)为无符号数,求(BX)/2
SHRBX,1
;(BX)=4278H(2)(BX)为带符号数,求(BX)/2
SARBX,1
;(BX)=0C278H(3)把(BX)中的16位数每4位压入堆栈
MOVCH,4;循环次数
MOVCL,4;移位次数
NEXT:ROLBX,CLMOVAX,BXANDAX,000FHPUSHAXDECCHJNZNEXT00080004000F0000
(SP)返回本节首页903.3伪指令伪指令-即告诉汇编程序如何进行汇编工作的命令3.3.1数据定义伪指令3.3.2符号定义伪指令3.3.3段定义伪指令SEGMENT/ENDS3.3.4假定伪指令ASSUME3.3.5置汇编地址计数器伪指令ORG3.3.6源程序结束伪指令返回本章首页913.3.1数据定义伪指令常用的数据定义伪指令有DB,DW,DD,DQ,DT。格式:[变量名]数据定义伪指令表达式[,…]功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。返回本节923.3.2符号定义伪指令1.等价伪指令2.等号伪指令3.定义符号名伪指令返回本节931.等价伪指令格式:符号名EQU表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。用途:①用符号表示常量、数值表达式,即定义符号常量。②EQU与属性运算符PTR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。③利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。注意:EQU定义的符号不得与本程序中的其它符号名同名。942.等号伪指令格式:符号名=表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。【例3.8】定义等价符号名。 ┆LOST=20LOST=LOST+10 ;30→LOST ┆953.定义符号名伪指令格式:变量名或标号LABEL类型功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号EQUTHIS类型”。【例3.9】定义新类型的变量。 ┆DDBUF LABELDWORDBUF DB 200DUP(0) ┆A LABEL FARB:LEA DX,BUF ┆思考:如何用EQU和THIS实现963.3.3段定义伪指令SEGMENT/ENDS格式:段名SEGMENT[定位类型][组合类型][‘类别’]...
段名ENDS功能:定义一个以SEGMENT伪指令开始,以ENDS伪指令结束,以段名命名的存储段。段名:该段的名字,用来指出汇编程序为该段分配的存储区起始位置。注:当段名作为符号被引用时,表示对应段的段值。97【例3.10】分析下面程序的内存分布情况。┆DATASEGMENTAADW10H,-20HDATAENDS┆CODESEGMENT┆DATASEGMENTBUFDB‘ABC’DATAENDS┆CODEENDS┆10H00H0E0H0FFH41H42H43H………………………………AABUFDATACODE返回本节983.3.4假定伪指令ASSUME格式:ASSUME段寄存器:段名[,段寄存器:段名]功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。注意:1、ASSUME语句只是将当前段的设置方案告诉了宏汇编程序如何翻译成目标程序,但并没有将段首址置入对应的段寄存器,cs和ss段寄存器运行时由系统自动设置,ds和es必须由用户程序自行置入。2、如果程序中ASSUME重建了ds和es的对应关系,也一定要紧跟着将这个新段首址送入ds和es中。3、不在当前段的变量和存储单元均是不可访问的。99【例3.11】用ASSUME伪指令建立段与段寄存器之间的对应关系。DATA1 SEGMENTA DB1,2,3DATA1 ENDSSTACK SEGMENTSTACKDB 200DUP(0)STACK ENDSDATA2 SGEMENTB DB‘123ABC’DATA2 ENDSDATA3 SEGMENTC DB?,?,?DATA3 ENDS100CODE SEGMENT ASSUME DS:DATA1,ES:DATA2,CS:CODE,SS:STACKSTART:MOV AX,DATA1 MOV DS,AX ;DATA1→DS MOV AX,DATA2 MOV ES,AX ;DATA2→ES …
ASSUMEES:DATA3MOV AX,DATA3 MOV ES,AX ;DATA3→ES…Q1:MOV AL,AQ2:MOV C,AL
ASSUMEDS:DATA2 ; MOV AX,DATA2 MOV DS,AX MOV AL,B MOV C,AL ┆CODE ENDS END START返回本节1013.3.5置汇编地址计数器伪指令ORG汇编地址计数器:用$符号表示,用来记录正在被汇编程序翻译的语句的地址,也就是说其内容标出了汇编程序当前的工作位置。例如:DATASEGMENTBUFDB‘123456789ABCDEFGHI’COUNTEQU$-BUF;DATAENDS102置汇编地址计数器伪指令格式:ORG数值表达式功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0~65535之间的非负整数。【例3.12】给汇编地址计数器赋值。DATA SEGMENTORG 10 ;置$值为10VAR1 DW100H,200HORG $+5 ;置$的值为14+5,即为19VAR2 DB1,2,$+1,$+2N EQU$-VAR2 ;($)=23DATA ENDS返回本节1033.3.6源程序结束伪指令格式:END[表达式]功能:该语句标志整个程序的结束,是源程序的最后一条语句。P72例2返回本节1043.4DOS系统功能调用一、系统功能调用方法二、常用的DOS系统功能调用返回本章首页105一、系统功能调用方法DOS系统功能调用的方法一般可分为以下几步:①设置所要调用功能的入口参数。②在AH寄存器中存入所要调用功能的功能号。③INT21H指令自动转入中断子程序入口。④相应中断子程序运行完毕,可按规定取得出口参数。(将出口参数放入AL中)当调用成功返回时CF置0,否则CF置1,并自动在寄存器AX中置错误返回码。106二、常用的DOS系统功能调用1.单字符输入(1号调用)2.单字符显示(2号调用)3.打印输出(5号调用)4.结束调用(4CH号调用)5.控制台输入字符(8号调用)6.显示字符串(9号调用)7.字符串输入(10号调用)1071.单字符输入(1号调用)格式:MOV AH,1
INT 21H功能:接受从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。
2.单字符显示(2号调用)格式:MOVDL,待显示字符的ASCII码
MOVAH,2
INT21H功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。1083.打印输出(5号调用)格式:MOV DL,待打印字符的ASCII码
MOV AH,5
INT 21H功能:将DL寄存器中的字符送打印机打印。4.结束调用(4CH号调用)格式:
MOV AH,4CH
INT 21H功能:终止当前程序并返回调用程序。1095.控制台输入字符(8号调用)格式:MOVAH,8INT21H功能:与1号调用相似,接受从键盘输入字符的ASCII码送入寄存器AL中,但不送显示器显示。6.显示字符串(9号调用)格式:LEA DX,待显示字符串首偏移地址
MOV AH,9
INT 21H功能:将当前数据区中以‘$’结尾的字符串送显示器显示。1107、字符串输入(10号调用)格式:LEA DX,缓冲区首偏移地址
MOV AH,10INT 21H功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。10号系统功能调用的输入缓冲存储区的定义:缓冲区名DB缓冲区大小;规定输入缓冲区的大小
DB0;实际输入字符的个数
DB缓冲区大小DUP(0);键盘输入的字符存放在该输入缓冲区中例:BUFDB80DB0DB80DUP(0)111DATA SEGMENTSTR DB0DH,0AH,‘Exampleofstringdisplay!$’DATA ENDSSTACKSEGMENTSTACKDB 100DUP(0)STACKENDSCODE SEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK【例3.13】若要在屏幕上显示字符串“Exampleofstringdisplay!”,则程序如下:
112BEGIN: MOV AX,DATA MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,4CH INT 21HCODE ENDS END BEGIN113DATA SEGMENTINFO1 DB 0DH,0AH,‘INPUTSTRING:$’
INFO2 DB 0DH,0AH,‘OUTPUTSTRING:$’
BUFA DB 81 DB ?
DB 81DUP(0)
BUFB DB 81DUP(0)DATA ENDSSTACK SEGMENTSTACK DB 200DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE【例3.14】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。114START:MOV AX,DATA MOV DS,AX
LEA DX,INFO1 MOV AH,9 ;9号调用,显示输入提示信息
INT 21H
LEA DX,BUFA MOV AH,10 ;10号调用,键盘输入字符串到缓 冲区BUFA INT 21H
LEA SI,BUFA+1 MOV CH,0 ;取字符长度→CX MOV CL,[SI]
ADD SI,CX ;SI指向字符串尾部
LEA DI,BUFB ;DI指向字符串变量BUFB115NEXT:MOV AL,[SI] MOV [DI],AL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年项目管理关键指标设计的考点试题及答案
- 玻璃制品安全生产与应急预案考核试卷
- 生物农药在病虫害防治中的综合评价考核试卷
- 证券从业资格证考试心理准备试题及答案
- 磷肥工艺优化与节能减排考核试卷
- 2025年【金属非金属矿山支柱】模拟考试题及答案
- 机械加工中的智能供应链管理考核试卷
- 油田投球机安装施工方案
- 复述上面已经提到的主题以下是新的个主题名称考核试卷
- 园艺师参与科研项目的必要性试题及答案
- 婚礼执事单模板
- 《红色旅游线路设计》
- DB4102-T 025-2021海绵城市建设施工与质量验收规范-(高清现行)
- 冷链产品运输记录表
- 导线的连接精品课件
- 二年级美术下册课件-第14课 虫虫虫(一)2-苏少版(共22张PPT)
- 儿童保健学课件:绪论
- 中小学校园安全稳定工作岗位责任清单
- 论提高行政效率的途径 开题报告
- 浓缩机的选择与计算
- 沪教版六年级下册单词表
评论
0/150
提交评论