《微机原理与接口技术》本科课程2006年春季第9讲南京大学计算机系俞建新主讲2006年3月2日2006年3月21日南京大学计算机系俞建新第9讲第2页第4章宏汇编语言程序设计本章介绍以下内容汇编语言程序格式MASM中的表达式伪指令语句DOS系统功能调用和BIOS中断调用2006年3月21日南京大学计算机系俞建新第9讲第3页概述用指令的助记符、符号地址、标号等符号书写程序的语言称为汇编语言。用汇编语言编写的源程序称为汇编源程序。把源程序翻译成机器语言程序(目标程序)的过程叫做汇编。完成汇编任务的程序叫做汇编程序,常用的有ASM、MASM等。MASM称为宏汇编程序。2006年3月21日南京大学计算机系俞建新第9讲第4页常用的术语汇编语言语句可分为三种基本语句:指令语句、伪指令语句和宏指令语句。每一个指令语句在汇编时产生一个目标代码,对应着机器的一种操作。如:MOVBX,0与ADDSI,AX等,即每一条指令语句对应着机器的一条指令。伪指令语句没有目标代码与之对应,主要是为汇编程序服务的。宏指令主要是为了简化程序的书写而设计的。若在汇编语言源程序中某个程序段要多次使用,为了使在源程序中不重复书写这个程序段,可以用一条宏指令来代替。由汇编程序在汇编时产生所需的代码。2006年3月21日南京大学计算机系俞建新第9讲第5页4.1汇编语言程序格式本节介绍以下内容:指令语句伪指令语句数据项2006年3月21日南京大学计算机系俞建新第9讲第6页4.1.1指令语句格式:标号:指令助记符操作数,操作数;注释举例:JMPBXADDBL,ALSTART:MOVAX,01H;开始执行DELAY:LOOPDELAY;循环延时2006年3月21日南京大学计算机系俞建新第9讲第7页4.1.2伪指令语句格式:名字伪指令指示符操作数,操作数;注释举例:AREA1DB14H,3BHAREA2DW3100H,01A6HCOUNTEQU100;计数初值是常数1002006年3月21日南京大学计算机系俞建新第9讲第8页4.1.3数据项常数数值常数字符串常数变量段属性偏移量属性类型属性标号段属性偏移量属性距离属性2006年3月21日南京大学计算机系俞建新第9讲第9页4.2MASM中的表达式MASM中使用了6类运算符,即:算术运算符(ArithmeticOperators)逻辑运算符(LogicalOperators)关系运算符(RelationalOperators)数值返回运算符(Value-ReturningOperators)修改属性运算符(ModifyingattributeOperators)其它运算符(OtherOperators)2006年3月21日南京大学计算机系俞建新第9讲第10页4.2.1算术运算符共有7种算术运算符+,-,*,/,MOD,SHL,SHR说明:*(乘),/(除,只取除法运算结果之商)、MOD(模,只取除法运算结果之余数)、SHL(左移,左移1位相当于乘2)、SHR(右移,右移1位相当于除2)。所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。若对地址运算,通常是在标号上加/减某一个数字量,例如A1+2、K2-3各表示一个存储单元的地址,对地址乘是没有意义的。2006年3月21日南京大学计算机系俞建新第9讲第11页例4-1数组RR和变量TT定义如下:RRDB1,2,3,4,5,6TTDB20指令如下:MOVAX,30*5MOVCX,(TT-RR);数组长度存入CX汇编时,计算表达式形成指令为:MOVAX,150MOVCX,62006年3月21日南京大学计算机系俞建新第9讲第12页例4-2源程序指令如下:DAEQU300MOVAX,DA-80MOVBX,DAMOD100MOVCX,DA/100MOVDH,01100100BSHR2汇编时,计算表达式形成指令为:DAEQU300MOVAX,220MOVBX,0MOVCX,3MOVDH,19H2006年3月21日南京大学计算机系俞建新第9讲第13页4.2.2逻辑运算符共有4种逻辑运算符AND,OR,NOT,XOR说明:逻辑运算符与8086指令系统中的指令助记符AND、OR、NOT、XOR符号完全相同,但二者是不会混淆的。作为MASM的运算符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。2006年3月21日南京大学计算机系俞建新第9讲第14页例4-3源程序指令如下:MOVAH,NOT0FFHMOVBH,8CHAND77HMOVAL,8CHOR73HMOVBL,0FFHXOR44H汇编时,计算表达式形成指令为:MOVAH,0HMOVBH,04HMOVAL,0FFHMOVBL,0BBH2006年3月21日南京大学计算机系俞建新第9讲第15页例4-4INAL,PORT;PORT为输入端口号ANDDX,PORTAND0FEHOUTDX,AX;DX为输出端口号第2条指令说明:后一个AND(运算符),汇编时计算表达式,得到一个端口号,如原输入端口号PORT为80H,则表达式PORTAND0FEH的值为80H,若原输入端口号PORT为81H,则计算表达式值也得到80H。前一个AND(指令助记符),在运行程序时将DX内容与计算出的表达式值相'与',结果送到DX中,DX为输出端口号。2006年3月21日南京大学计算机系俞建新第9讲第16页4.2.3关系运算符关系运算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6种。关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值。若结果为真,输出全是1,即0FFH或0FFFFH。若结果为假,输出全是0。关系运算符一般与逻辑运算符组合起来使用。2006年3月21日南京大学计算机系俞建新第9讲第17页例4-5MOVAX,10HGT16;结果为假ADDBL,6EQ0110B;结果为真MOVCX,((PORTLT5)AND100)OR((PORTGE5)AND200)当PORT小于5时,汇编结果是MOVCX,100当PORT大于等于5时,汇编结果是MOVCX,2002006年3月21日南京大学计算机系俞建新第9讲第18页4.2.4数值返回运算符数值返回运算符经常称作分析运算符英文名是:Analyticoperators数值返回运算符有5种:OFFSET、SEG、TYPE、LENGTH、SIZE。它们加在变量或标号前,返回运算对象的某个参数值。例如偏移地址值、段地址值、类型属性、变量包含的单元数等。2006年3月21日南京大学计算机系俞建新第9讲第19页数值返回运算符OFFSET格式:OFFSET变量或标号功能:返回标号或变量的偏移地址值举例:MOVBX,OFFSETDAI汇编程序将变量DAI的偏移地址送到BX中,相当于指令LEABX,DAI2006年3月21日南京大学计算机系俞建新第9讲第20页数值返回运算符TYPE格式:TYPE变量或标号功能:TYPE加在变量前,返回变量的类型属性。TYPE加在标号前,返回标号的距离属性。类型返回值DB1DW2DD4DQ8NEAR-1[0FFH]FAR-2[0FEH]标号变量2006年3月21日南京大学计算机系俞建新第9讲第21页例4-6A1DB20H,30HA2DW0438HA3DD?L1:MOVAH,TYPEA1;1MOVBH,TYPEA2;2MOVAL,TYPEA3;4MOVBL,TYPEL1;0FFH2006年3月21日南京大学计算机系俞建新第9讲第22页数值返回运算符SEG格式:SEG变量或标号功能:SEG用来取标号或变量的段基值。例4-7:MOVAX,SEGM1MOVDS,AX2006年3月21日南京大学计算机系俞建新第9讲第23页数值返回运算符LENGTH格式:LENGTH变量功能:当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其它变量则返回1。例4-8:M1DW100DUP(?)汇编时形成指令M2DW1,2,3MOVCX,100M3DB‘ABCD’;返回此变量包含100个字单元MOVCX,LENGTHM1MOVBL,1MOVBL,LENGTHM2MOVAL,1MOVAL,LENGTHM32006年3月21日南京大学计算机系俞建新第9讲第24页数值返回运算符SIZE格式:SIZE变量功能:返回该变量包含的总字节数。SIZE=LENGTH*TYPE例4-9对例4-8定义的M1,M2,M3MOVCX,SIZEM1MOVBL,SIZEM2MOVAL,SIZEM3汇编时形成指令MOVCX,200;返回此变量包含200个字节单元MOVBL,2MOVAL,12006年3月21日南京大学计算机系俞建新第9讲第25页4.2.5修改属性运算符修改属性运算符经常称作综合运算符Syntheticoperators修改属性运算符有6种:段操作符、PTR、THIS、HIGH、LOW、SHORT可以在程序运行过程中,通过修改属性运算符来修改变量或标号的属性,包括段属性、偏移地址属性、类型属性等。2006年3月21日南京大学计算机系俞建新第9讲第26页4.2.5.1段操作符格式:段前缀:变量或地址表达式段前缀有段寄存器CS、DS、ES、SS后跟冒号“:”,用来表示某个变量或地址被修改到哪个段寄存器提供的段基址中。举例MOVAX,ES:[BX]在ES段中,从偏移地址以BX间址所指定的存储单元中,取出一个字送到AX中。2006年3月21日南京大学计算机系俞建新第9讲第27页4.2.5.2PTR格式:类型/距离PTR变量或标号其功能是将PTR左边的类型属性赋给右边的变量或标号。PTR本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型的匹配,常与类型BYTE、WORD、NEAR、FAR等连用。举例:N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1;使N1类型转换成字与AX类型匹配MOVBL,BYTEPTRN2;使N2类型转换成字节与BL类型匹配2006年3月21日南京大学计算机系俞建新第9讲第28页4.3伪指令语句伪指令语句没有对应的机器代码,并不像指令语句那样由CPU来执行,它是由MASM汇编程序对源程序汇编期间进行处理的。主要完成变量定义,存储器分配,指示程序开始和结束,段定义,段分配等。2006年3月21日南京大学计算机系俞建新第9讲第29页伪指令的类型伪指令语句有如下几种类型:数据定义语句DB,DW,DD符号赋值语句EQU,=段定义语句SEGMENT…ENDS段分配语句ASSUME过程定义语句PROC…ENDP程序开始结束语句ORG,END,NAME2006年3月21日南京大学计算机系俞建新第9讲第30页常用的伪指令-1数据定义伪指令为一个数据项或项表分配存储单元,用一个符号名与这个或这些存储单元相联系,并为这个数据项提供一个任选的初始值。语句格式1:变量名助记符操作数,操作数…….;注释语句格式2:变量名助记符nDUP(操作数,操作数……);注释在格式2中,用nDUP()表示时,n必须是正整数,表示括号中的操作数的重复次数,DUP后面必须带括号。2006年3月21日南京大学计算机系俞建新第9讲第31页只分配存储空间举例:THINGDB?;定义一个字节B-THINGDW?;定义一个字(两个字节)T-THINGDD?;定义一个双字(四个字节)BFRDB30DUP(?);定义连续30个字节2006年3月21日南京大学计算机系俞建新第9讲第32页数据的初始值确定举例THINGDB25ONEDB5DUP(0);重复5个0存入ONE起始的存储单元TWODW10DUP(?);保留1