《《汇编语言程序设计》-相伟-电子教案第2章.pptx》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》-相伟-电子教案第2章.pptx(114页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、21世纪高等院校规划教材汇编语言程序设计相伟主编徐小平李珍香副主编中国水利水电出版社2021/9/121第二章 程序设计基础2021/9/122本章学习目标通过本章学习,读者应该掌握以下内容:n汇编语言源程序结构及基本概念n各种寻址方式n常用伪指令的格式、功能n常用I/O功能调用的用法2021/9/1232.1 汇编语言源程序结构2.1.1汇编语言源程序结构及分析初学程序设计最有效的方法是阅读源程序并上机调试。通过阅读程序可以掌握程序的一般结构,学习实现程序功能的经典算法。通过对程序进行上机调试,逐渐掌握指令的语法格式、功能,避免编写源程序时出现常见的语法错误,同时训练调试技巧。2021/9/
2、124例2-1显示信息“Howdoyoudo?”DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART2021/9/125例2-2将内存缓冲区中以BUFA开始的一组字数据传送到BUFB开始的内存区。DATASEGMENTBUFADW367BH,2845H,0A78H
3、,9DE3H,0F6BH,6532HCOUNT EQU($-BUFA)/2BUFBDWCOUNTDUP(?DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AX2021/9/126LEASI,BUFALEADI,BUFBMOVCX,COUNTLOP:MOVAX,SIMOVDI,AXINCSIINCSIINCDIINCDIDECCXJNZLOPMOVAH,4CHINT21HCODEENDSENDSTART2021/9/1272.1
4、.2机器指令简介8086/8088指令系统提供的机器指令从功能上可分为7种类型:数据传送指令算术运算指令位运算指令程序控制指令串操作指令处理器控制指令输入/输出指令2021/9/128所有机器指令从格式上看,有3种指令格式:无操作数指令格式:助记符例如:STCCLCCMC2021/9/129单操作数指令格式:助记符操作数例如:PUSHAXPOP BX2021/9/1210双操作数指令格式:助记符目的操作数,源操作数例如:MOVCX,DX2021/9/12112.1.3常量、变量、标号及表达式1常量常量是指汇编语言源程序中以数值常数、字符串常数和符号常数的形式存在的量。注意:当数值常量的值是十六
5、进制形式,并且第一个字符是大写字母AF或小写字母af时,需要在数值前面加一个0,如:0A64DH。2021/9/1212例如:在下面的汇编源程序中,带下画线的量就是常量DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDSSTACK SEGMENTSTACKDB200DUP(?)STACK ENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODE ENDSENDSTART2021/9/1213例如:在下面的数据
6、段中,带下画线的是一个符号常数,它是使用EQU伪指令定义的。DATASEGMENTBUFADW 367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDW COUNTDUP(?)DATAENDS定义符号常数使用EQU伪指令、“”伪指令。2021/9/12142变量变量是指数据存储单元地址的符号表示,变量的值在程序运行过程中可以改变。2021/9/1215(1)变量的定义定义变量使用伪指令DB、DW、DD、DQ、DT。DB用来定义字节变量,字节变量占1个存储单元,可存储一个字节数据。DW用来定义字变量,字变量占2个存储单元,可存储一个字
7、数据。DD用来定义双字变量,双字变量占4个存储单元,可存储一个双字数据。DQ用来定义四字类型变量,四字类型变量占8个存储单元,可存储8字节数据。DT用来定义十字节类型变量,十字节类型变量占10个存储单元,可存储10字节数据。2021/9/1216例如:在数据段DATA中定义字节变量STR。DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDS2021/9/1217例如:在数据段DATA中定义了字变量BUFA和BUFB。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCO
8、UNTDUP(?)DATAENDS2021/9/1218(2)变量的属性变量有三个属性,即段属性、偏移地址属性、类型属性。n段属性:指变量所在段的段地址。n偏移地址属性:指变量所定义的单元到变量所在段的开始位置之间的字节距离。n类型属性:由定义变量使用的伪指令确定。DB定义的变量的类型属性为字节类型(BYTE),DW定义的变量的类型属性为字类型(WORD),DD定义的变量的类型属性为双字类型(DWORD),DT定义的变量的类型属性为四字类型,DQ定义的变量的类型属性为十字节类型。2021/9/12193标号n标号是指机器指令存储单元地址的符号表示。2021/9/1220(1)标号的定义LOP:
9、MOV AX,SIMOV DI,AXINCSIINCSIINCDIINCDIDEC CXJNZLOP2021/9/1221(2)标号的属性标号与变量一样,也具有三个属性,即段属性、偏移地址属性、类型属性。n段属性:指标号所在段的段地址。n偏移地址属性:指标号所定义的单元到标号所在段的开始位置之间的字节距离。n类型属性:标号的类型属性分为近类型NEAR和远类型FAR。NEAR类型的标号称为近标号,近标号只能用于段内转移。FAR类型的标号称为远标号,远标号既可用于段内转移,也可用于段间转移。2021/9/12224表达式由常量、变量、标号、运算符和括号组成的有意义的式子称为表达式。其中运算符又可分
10、为算术运算符、逻辑运算符、关系运算符及其他运算符。表达式的计算结果是一个常数,该常数可以作为指令的操作数使用。2021/9/1223(1)算术运算符 表2-1 算术运算符 算术运算符 功 能加减*乘/除MOD取余2021/9/1224例如:算术表达式的计算219/73186.4/2.633219MOD7的结果为22021/9/1225(2)关系运算符表2-2 关系运算符关系运算符功 能EQ相等NE不相等LT小于GT大于LE小于等于GE大于等于2021/9/1226例如:假设NUM的值为60H。则:NUMGT80HNUMEQ60H2021/9/1227逻辑运算符表2-3 逻辑运算符逻辑运算符功
11、能AND与OR或XOR异或NOT非SHR逻辑右移SHL逻辑左移2021/9/1228例如:假设NUM的值为6BH则:NUMAND87H;表达式的值是03HNUMOR 87H;表达式的值是0EFHNUMXOR87H;表达式的值是0ECHNOT 87H;表达式的值是78HNUMSHR2;表达式的值是1AHNUMSHL2;表达式的值是0ACH2021/9/1229其他运算符属性分离运算符(SEG、OFFSET、TYPE、LENGTH、SIZE)属性定义运算符(PTR、THIS、SHORT、HIGH、LOW、“:”)以及()、MASK、WIDTH。2021/9/1230SEGSEG返回其后变量或标号所
12、在段的段地址。2021/9/1231OFFSETnOFFSET返回其后变量或标号的偏移地址。2021/9/1232DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDSMOVAX,SEGBUFAMOVDS,AXMOVSI,OFFSETBUFAMOVDI,OFFSETBUFB2021/9/1233TYPE返回其后变量或标号的类型。表2-4 TYPE返回值 类 型返回值变量DB1DW2DD4DQ8标号NEAR-1或0FFHFAR-2或0FEH2021/9/1234
13、例如:在下面的数据段中。DATASEGMENTADB87H,45H,92HBDW34D6H,0F67HCDD?DATAENDS若在代码段中有如下指令:MOVAH,TYPEAMOVAL,TYPEBMOVCH,TYPEC则将被汇编成:MOVAH,1MOVAL,2MOVCH,42021/9/1235LENGTH例如:在下面的数据段中。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDS若在代码段中有如下两条指令MOVCX,LENGTHBUFAMOVDX,LENGT
14、HBUFB则将被汇编成:MOVCX,1MOVDX,62021/9/1236SIZE例如:在下面的数据段中。DATA SEGMENTBUFA DW 367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFB DWCOUNTDUP(?)DATA ENDS若在代码段中有如下两条指令MOVCX,SIZEBUFAMOVDX,SIZEBUFB则将被汇编成:MOVCX,2MOVDX,122021/9/1237PTR和THISnPTR用来指明某个变量、标号或地址的类型属性,使它临时具有与原定义所不同的类型属性,但保持他们原来的段属性和偏移属性不变。PTR
15、的使用格式为:类型PTR表达式其中,表达式的类型可以是BYTE、WORD、DWORD、NEAR、FAR等。2021/9/1238例如DATASEGMENTADB87H,45H,92HBDW34D6H,0F67HCDD?DATAENDSMOVAX,WORDPTRAMOVBL,BYTEPTRB2021/9/1239例如:MOVSI,30Hn若将上述指令的操作数改为字操作数,则指令为:MOVWORDPTRSI,30H或者:MOVSI,WORDPTR30Hn若将上述指令的操作数改为字节操作数,则指令为:MOVBYTEPTRSI,30H或者:MOVSI,BYTEPTR30H2021/9/1240SHOR
16、TSHORT表示转移指令的目标地址属性是短转移,即目标地址与本指令之间的字节距离在-128127之间。例如:JMPSHORTLOP22021/9/1241HIGH和LOWHIGH选取表达式计算结果的高8位。LOW选取表达式计算结果的低8位。例如:HIGH0F25AH的值是0F2HLOW0F25AH的值是5AH2021/9/1242段前缀运算符:n运算符“:”用于临时给变量、标号或地址指定一个段属性,且只在所出现的语句中有效,“:”并不改变地址的偏移地址属性和类型属性。例如:MOVSI,AX指令的功能是将AX寄存器的值存放到数据段DS中偏移地址为(SI)的字单元中,假如需要将将AX寄存器的值存放
17、到附加数据段ES中偏移地址为(SI)的字单元中,则要在SI的前面加段前缀ES。指令改为:MOVES:SI,AX2021/9/1243运算符的优先级如表2-5所示。表2-5 运算符的优先级优先级运算符1LENGTH、SIZE、WTDTH、MASK、()、2PTR、OFFSET、SEG、TYPE、THIS、段前缀运算符(:)3HIGH、LOW4*、/、MOD、SHL、SHR5 、-6EQ、NE、LT、LE、GT、GE7NOT8AND9OR、XOR10SHORT2021/9/12442.2 寻址方式在指令中,指定操作数或操作数地址的方法称为寻址方式。操作数的各种寻址方式是汇编语言进行程序设计的基础,
18、必须熟练掌握。2021/9/12452.2.1立即寻址n立即寻址是指操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,立即数紧跟在操作码之后,与操作码一起存放在代码段中。如果立即数为16位,则立即数的存放规则是高字节存放在高地址,低字节存放在低地址。n立即数寻址方式通常用于给寄存器或内存单元赋初值。2021/9/1246例如:阅读以下各条指令,掌握立即寻址方式的用法。MOVAL,80HMOVBX,0A683HMOVX,20H;X是字节变量MOVY,3456H;Y是字变量2021/9/1247n实际上,在汇编语言程序设计中,还经常使用符号常数作为立即操作数。比如,假设COUNT是在程
19、序中定义的一个符号常数,它代表一组数据的个数,则将该组数据的个数送入CX寄存器的指令如下:MOVAX,COUNT上述指令中的源操作数COUNT是立即寻址方式。2021/9/1248n汇编语言规定:在单操作数指令中,立即数不能作为指令中的操作数。在双操作数指令中,立即数只能作为源操作数,不能作为目的操作数。2021/9/12492.2.2寄存器寻址n寄存器寻址是指指令所需要的操作数存放在某一个寄存器中。n指令中使用的寄存器可以是8位寄存器,也可以是16位寄存器。8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL。16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等
20、。n指令中指定的寄存器即可以做为源操作数,也可以做为目的操作数,或同时出现在源操作数和目的操作数的位置上。2021/9/1250例如:阅读以下各条指令的功能,掌握寄存器寻址方式的用法。MOVBH,80hMOVAX,6AB4HMOVMAX,AX;MAX是字变量MOVCX,COUNT;COUNT是符号常数MOVAX,BXMOVDL,BL2021/9/1251n说明:在双操作数指令中,如果源操作数和目的操作数都是寄存器寻址,则它们必须同时是8位寄存器,或同时是16位寄存器。例如,下面的指令是错误的。MOVAX,BL2021/9/12522.2.3存储器寻址存储器寻址是指指令所需要的操作数存放在内存中
21、,在指令中给出操作数地址的方式。存储器寻址根据指令中给出的操作数地址的形式不同又分为直接寻址、寄存器间接寻址、变址寻址、基址加变址寻址、相对基址加变址寻址。2021/9/1253直接寻址n直接寻址方式是指操作数的偏移地址在指令中直接给出。例如:MOVAX,200H假设数据段的段地址DS1500H,(15200H)字单元的值是876AH,问执行指令后,相关寄存器及存储单元的值是什么?答:EA200H。PA(DS)*16EA15000H200H15200H。2021/9/1254指令的执行过程如图2-2所示。操作码代码段00H02H6AH数据段87H8 7 6 A HA X图2-2 直接寻址示意图
22、1 5 0 00 2 0 0D S 1 5 2 0 0 2021/9/12552寄存器间接寻址n寄存器间接寻址是指操作数的偏移地址在BX、BP、SI和DI四个寄存器之一。(1)当以BX、SI或DI寄存器进行间接寻址时,操作数的物理地址由DS中的段地址与BX、SI或DI中的偏移地址构成。(2)当以BP寄存器进行间接寻址时,操作数物理地址由SS中的段地址与BP中的偏移地址构成。2021/9/1256例如:MOVAX,BXn假设该指令执行之前,DS2000H,AX54C8H,BX0300H,存储单元20300H的内容是6A9BH。问执行指令后,相关寄存器及存储单元的值是什么?n源操作数的地址为:EA
23、(BX)0300HPA(DS)*16EA2000H*160300H20300H。2021/9/1257指令的执行过程如图2-3所示。6 A 9 B A X操作码代码段9BH数据段6AH图2-3 间接寻址示意图2 0 0 00 3 0 0D S2 0 3 0 0 B X2021/9/12583变址寻址n变址寻址是指操作数的偏移地址是BX、BP、SI、DI之一的值和一个8位或16位偏移量之和。n指令中给出的8位或16位偏移量用补码表示。在计算操作数的偏移地址时,如果偏移量是8位,则进行符号扩展成16位。(1)当以BX、SI或DI寄存器进行间接寻址时,操作数物理地址由DS中的段地址与BX、SI或DI
24、中的偏移地址构成(2)当以BP寄存器进行间接寻址时,操作数物理地址由SS中的段地址与BP中的偏移地址构成。2021/9/1259例如:MOVBX,SI200Hn假设该指令执行之前,DS2000H,BX6874H,SI1000H,存储单元21200H的内容是1B43H。问执行指令后,相关寄存器及存储单元的值是什么?n指令中的源操作数是变址寻址,源操作数的地址为:EA(SI)200H1000H200H1200HPA(DS)*16EA2000H*161200H21200H。2021/9/1260指令的执行过程如图2-4所示。1 B 4 3 A X操作码 代码段00H02H43H数据段1BH图2-4
25、变址寻址示意图 2 0 0 01 0 0 0D S 2 1 2 0 0 S I 0 2 0 0 2021/9/12614基址加变址寻址n基址加变址寻址是指操作数的偏移地址是一个基址寄存器BX、BP的值和一个变址寄存器SI、DI的值之和。(1)当以BX作为基址寄存器时,操作数物理地址由DS中的段地址与SI或DI中的偏移地址构成。(2)当以BP作为基址寄存器时,操作数物理地址由SS中的段地址与SI或DI中的偏移地址构成。2021/9/1262例如:MOVAX,BXSIn假设该指令执行之前,DS2000H,AX6528H,BX0500H,SI0300H,存储单元20800H的内容是7B46H。问执行
26、指令后,相关寄存器及存储单元的值是什么?由于指令中的源操作数是基址加变址寻址,故源操作数的地址为:EA(BX)(SI)0500H0300H0800HPA(DS)*16EA2000H*160800H20800H。2021/9/1263指令的执行过程如图2-5所示。7 B 4 6 HA X操作码 代码段46H数据段7BH图2-5 基址加变址寻址示意图 0 3 0 0 2 0 0 00 5 0 0D S2 0 8 0 0 B XS I2021/9/12645相对基址加变址寻址n相对基址加变址寻址是指操作数的偏移地址是一个基址寄存器BX、BP的值加上一个变址寄存器SI、DI的值,再加上指令中的一个8位
27、、16位偏移量之和。n指令中给出的8位或16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。(1)当以BX作为基址寄存器时,操作数物理地址由DS中的段地址与SI或DI中的偏移地址构成。(2)当以BP作为基址寄存器时,操作数物理地址由SS中的段地址与SI或DI中的偏移地址构成。2021/9/1265例如:MOVAX,BXSI1000Hn假设该指令执行之前,DS2000H,AX6528H,BX0500H,SI0300H,存储单元21800H的内容是0B874H。问执行指令后,相关寄存器及存储单元的值是什么?源操作数的地址为:EA(BX)(SI)1000H0500H0
28、300H1000H1800HPA(DS)*16EA2000H*161800H21800H。2021/9/1266指令的执行过程如图2-6所示。B 8 7 4 HA X操作码 代码段00H10H74H数据段B8H图2-6 相对基址加变址寻址示意图D S2 1 8 0 0 0 3 0 0 2 0 0 00 5 0 0B XS I 1 0 0 0 2021/9/1267例2-3将内存缓冲区中以BUFA开始的一组字数据传送到BUFB开始的内存区。2021/9/1268DATASEGMENTBUFADW 367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA
29、)/2BUFBDWCOUNTDUP(?)DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AX2021/9/1269MOVSI,0MOVDI,0MOV CX,COUNTLOP:MOV AX,BUFASIMOV BUFBDI,AXINCSIINCSIINCDIINCDIDEC CXJNZLOPMOV AH,4CHINT21HCODEENDSEND START2021/9/1270关于寻址方式的几点说明:对于单操作数指令,操作数可
30、以使用除立即寻址方式之外的各种寻址方式。对于双操作数指令,源操作数可以使用各种寻址方式,目的操作数可以使用除立即寻址方式之外的各种寻址方式,但源操作数和目的操作数不能同时采用存储器寻址方式。2021/9/1271立即寻址和直接寻址在表现形式上的区别是是否带有,寄存器寻址和寄存器间接寻址在表现形式上的区别也是是否带有。带有的操作数属于存储器操作数,内的值表示存储器操作数的偏移地址。2021/9/1272存储器寻址方式有多种等价的书写形式,如表2-6所示。表2-6 寻址方式的等价写法存储器寻址方式等价的书写格式变址寻址200HSI200HSI基址加变址寻址BXSIBXSI相对基址加变址寻址1000
31、HBXSIBXSI1000HBXSI1000H2021/9/1273在存储器寻址方式中,通常根据寄存器BX、BP、SI、DI使用隐含规定的段寄存器,其中使用BX、SI、DI寄存器时段寄存器是DS,使用BP寄存器时段寄存器是SS。2021/9/1274n实际上,操作数也可以存放在其他段中,比如:附加的数据段、堆栈段、代码段。如果操作数存放在其他段,如附加的数据段ES,则计算物理地址时,段寄存器就不能使用DS,而应该使用ES,并通过使用段前缀的方式在指令中给出。例如:MOVES:SUM,AX2021/9/12752.3 常用伪指令n数据定义伪指令:DB、DW、DD、DQ、DTn符号定义伪指令:EQ
32、U、LABELn段定义伪指令:SEGMENTENDS、ASSUME、ENDn过程定义伪指令:PROCENDPn宏定义伪指令:MACROENDM等n条件汇编伪指令:IFENDIF等n模块通信伪指令:PUBLIC、EXTRNn结构定义伪指令:STRUCENDSn记录定义伪指令:RECORDn其他伪指令:NAME、TITLE、ORG、EVEN等2021/9/1276伪指令语句的一般格式:名字伪指令助记符操作数1,操作数2,;注释2021/9/12772.3.1数据定义伪指令n数据定义伪指令可以是:DB、DW、DD、DQ、DT。DB:用来定义字节类型的变量,DB定义的每个操作数都占用1个字节单元。DW
33、:用来定义字类型的变量,DW定义的每个操作数都占用1个字单元。DD:用来定义双字类型的变量,DD定义的每个操作数都占用2个字单元。DQ:用来定义八个字节类型的变量,DQ定义的每个操作数都占用8个字节单元。DT:用来定义十个字节类型的变量,DT定义的每个操作数都占用10个字节单元。2021/9/1278例如:定义数值常数和字符串常数DATASEGMENTCON1DB56H,89H,0A3H,0BCHCON2DW 7865H,0B34DHCON3DD897632BDHCON4DBpleaseinput:DATAENDS2021/9/12792.3.2符号定义伪指令n符号定义伪指令可用来给汇编语言程
34、序中的常数、表达式、变量、标号、指令助记符或寄存器等重新定义一个名字,或者改变变量、标号的属性,从而给程序设计带来更大的灵活性。符号定义伪指令主要有EQU、LABEL。2021/9/12801定义符号常数(1)EQU格式:符号常数EQU表达式(2)格式:符号常数表达式说明:EQU定义的符号常数不能重复定义,而用“”定义的符号常数可以重复定义。2021/9/1281例如:AEQU20BEQUA*25COUNTEQU($-BUFA)/2例如:A20AA*252021/9/12822定义变量或标号(1)定义变量格式:变量LABEL变量类型说明:格式中的变量类型常用BYTE、WORD、DWORD,分别
35、表示字节类型、字类型、双字类型。2021/9/1283(2)定义标号格式:标号LABEL标号类型说明:格式中的标号类型使用NEAR、FAR,分别表示近类型、远类型。功能:给跟在LABEL伪指令后面的指令存储单元定义一个标号,该标号的类型属性在格式中指定,标号的段地址和偏移地址属性与指令存储单元的段地址和偏移地址相同。2021/9/12842.3.3段定义伪指令为了实现程序的分段设计,宏汇编程序MASM提供了按段组织程序的一组伪指令,它们是SEGMENTENDS、ASSUME、END等。2021/9/12851SEGMENT和ENDS、段定义伪指令的格式为:段名SEGMENT定位属性组合属性类别
36、段名ENDS功能:定义程序中的一个逻辑段。2021/9/12862ASSUME格式:ASSUME段寄存器:段名,功能:用来设定段寄存器与逻辑段之间的对应关系。程序中使用ASSUME后,宏汇编程序就将与段寄存器对应的逻辑段作为当前段。ASSUME一般出现在代码段的开始。2021/9/12873END伪指令格式:END标号功能:结束汇编。2021/9/12882.3.3其他常用的伪指令1NAME伪指令格式:NAME程序名功能:将程序名作为源程序目标模块的名字。NAME伪指令通常放在源程序的开始,在输出汇编语言源程序的列表文件中,在每一页的开头输出该程序名。若源程序中省略NAME伪指令,则汇编程序将
37、源文件名作为目标模块的名字。2021/9/12892TITLE伪指令格式:TITLE标题名功能:同NAME伪指令的功能。将标题名作为源程序目标模块的名字。标题名最多60个字符,但汇编程序只将前6个字符作为目标模块名。2021/9/12903ORG伪指令格式:ORG表达式功能:将数据或指令代码从ORG伪指令中指定的偏移地址处开始存放。表达式的值表示偏移地址,取值范围为00FFFFH或065535。当程序中不使用ORG伪指令时,数据或指令代码从段的开始位置连续存放。2021/9/1291DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUN
38、T EQU($-BUFA)/2ORG 100HBUFBDWCOUNTDUP(?)DATAENDS2021/9/12924EVEN伪指令格式:EVEN功能:将数据或指令代码从偶地址处开始存放。DATASEGMENTTAB1DB48H,0A2H,98H,0BEH,87HEVENTAB2DW0B7639H,19F6HDATAENDS2021/9/12932.4 I/O功能调用nDOS操作系统和ROMBIOS分别提供了一系列功能调用,作为汇编语言处理I/O操作的接口,程序员可以很方便的通过调用这些功能实现字符及字符串的输入输出。2021/9/12942.4.1常用的DOS系统功能调用nDOS系统功能调
39、用的方法:AH功能号设置入口参数INT21H2021/9/12951屏幕显示一个字符(2号调用)n调用格式:MOVAH,2MOVDL,字符的ASCII码INT 21H2021/9/1296例如:输出字符9,需要将字符9的ASCLL码39H存放在DL寄存器里。MOVAH,2MOVDL,39HINT21H2021/9/12972打印一个字符(5号调用)n调用格式:MOVAH,5MOVDL,字符的ASCII码INT 21H2021/9/1298例如:打印字符A,需要将字符A的ASCII码41H存放在DL寄存器里。MOVAH,5MOVDL,41HINT21H2021/9/12993屏幕显示一个字符串(
40、9号调用)n调用格式:MOVAH,9MOVDX,字符串的首地址(偏移地址)INT21H2021/9/121004.键盘输入一个字符(1号调用)n调用格式:MOVAH,1INT 21H2021/9/121015.键盘输入一个字符但不回显(8号调用)n调用格式:MOVAH,8INT21H2021/9/121026.键盘输入字符串(10号调用)n格式:MOVAH,10MOVDX,缓冲区的首地址(偏移地址)INT21H2021/9/12103键盘输入缓冲区的格式定义:BUFDB20DB?DB20DUP(?)2021/9/12104例如:从键盘输入字符串并输出该字符串。DATASEGMENTSTRDBp
41、leaseinputastring:$BUFDB20DB?DB20DUP(?)CRLFDB0AH,0DH,$DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AX2021/9/12105LEADX,STRMOVAH,9INT21HMOVAH,10LEADX,BUFINT21HLEADX,CRLFMOVAH,9INT21HMOVCL,BUF1LEASI,BUF2NEXT:MOVDL,SIMOVAH,2INT21HINCSIDECCL
42、JNZNEXTMOVAH,4CHINT21HCODE ENDSENDSTART2021/9/121062.4.2常用的ROMBIOS功能调用nROMBIOS是PC机中存放在ROM中的基本输入输出系统,它提供了系统加电自检、引导装入以及对输入输出接口的控制。nROMBIOS功能调用与DOS功能调用类似,也需要设置功能号、设置入口参数参及执行中断调用。2021/9/121071显示字符n调用格式:MOVAH,1MOVAL,字符的ASCII码INT 10H功能:将AL寄存器中的字符送显示器显示。2021/9/12108例如:显示字符5MOVAH,1MOVAL,35HINT10H2021/9/1210
43、92打印字符n调用格式:MOVAH,0MOVAL,字符的ASCII码MOVDX,打印机号INT 17Hn功能:将AL中的字符送打印机打印。2021/9/12110例如:打印字符$,使用0号打印机。MOVAH,0MOVAL,$MOVDX,0INT 17H2021/9/121113显示字符串n调用格式:MOVAH,6MOVBX,字符串的首地址(偏移地址)INT10H功能:在显示器上输出指定的字符串。该字符串要求在数据段DS中定义,字符串的偏移地址存放在BX寄存器中,且字符串必须以00H作为结束标志。2021/9/121124.从键盘上输入字符n调用格式:MOVAH,0INT 16Hn功能:程序执行到INT16H时,CPU暂停执行,等待从键盘输入一个字符,输入字符的ASCII码送入AL。2021/9/12113小结n通过本章的学习,应熟悉掌握汇编语言程序的组成结构。掌握8086/8088CPU指令系统分类。熟练掌握操作数的寻址方式,并能够在以后的程序设计中灵活运用各种寻址方式。掌握常用伪指令的格式、功能及用法。熟练掌握I/O功能调用方法。熟练掌握汇编语言源程序的上机步骤,并通过不断地调试程序,逐渐提高程序调试技术。2021/9/12114