汇编语言程序设计流程图的组成课件

上传人:4**** 文档编号:252922988 上传时间:2024-11-24 格式:PPT 页数:213 大小:1.81MB
返回 下载 相关 举报
汇编语言程序设计流程图的组成课件_第1页
第1页 / 共213页
汇编语言程序设计流程图的组成课件_第2页
第2页 / 共213页
汇编语言程序设计流程图的组成课件_第3页
第3页 / 共213页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 汇编语言程序设计,4.1,汇编语言程序格式,4.1.1,程序结构,【例,4-1,】 给出一个完整的汇编语言源程序,该程序的功能是完成两个字节数据相加。,DATASEGMENT,;段定义开始,(DATA,段,),BUF1DB34H,;第,1,个加数,BUF2DB2AH,;第,2,个加数,SUMDB,?;准备用来存放和数的单元,DATAENDS,;段定义结束,(DATA,段,),CODESEGMENT,;段定义开始,(CODE,段,),ASSUMECS:CODE,DS:DATA,;规定,DATA,、,CODE,分别为数据段和代码段,4.1 汇编语言程序格式4.1.1 程序结构,START:MOVAX,,,DATA,MOVDS,,,AX,;给数据段寄存器,DS,赋值,MOVAL,,,BUF1,;取第,1,个加数,ADDAL,,,BUF2,;和第,2,个加数相加,MOVSUM,,,AL,;存放结果,MOVAH,,,4CH,INT21H,;返回,DOS,状态,CODEENDS,;段定义结束,(CODE,段,),ENDSTART,;整个源程序结束,START:MOVAX,DATA,从上面这个例子可以看出,汇编语言源程序由若干条语句组成,语句分为如下两类。,1),指令语句,指令语句是由,8086/8088CPU,提供的指令形成的语句,能完成一定的操作功能,能够翻译成机器代码的语句。,从上面这个例子可以看出,汇编语言源程序由若干条语句组,2),伪指令语句,伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。例如,程序中的语句:,BUF1DB34H,BUF2DB2AH,SUMDB,?,就是伪指令语句,其功能是在内存中开辟,3,个名字分别为,BUF1,、,BUF2,、,SUM,的字节单元,前两个单元的初值分别为,34H,和,2AH,,,SUM,仅指定一个字节单元,不定义确定的初值。,实际上,汇编语言源程序中还可出现宏指令语句。宏指令语句就是由若干条指令语句形成的语句体。一条宏指令语句的功能相当于若干条指令语句的功能。,2) 伪指令语句,4.1.2,语句格式,指令语句和伪指令语句的格式是类似的,其格式如下:,名字,操作码 操作数,;注释,其中,带方括号的项可以省略,注释内容以分号,(,;,),引导。,1.,名字,1),名字的标识符,名字也就是由用户按一定规则定义的标识符,可由下列符号组成:,(1),英文字母,(A,Z,,,a,z),;,(2),数字,(0,9),;,(3),特殊符号,(,?、,_,等,),。,4.1.2 语句格式,2),名字的定义规则,名字的定义要满足如下规则:,(1),数字不能作为名字的第一个符号;,(2),单独的问号,(,?,),不能作为名字;,(3),一个名字的最大有效长度为,31,位,超过,31,位的部分计算机不再识别;,(4),汇编语言中有特定含义的保留字,(,如操作码、寄存器名等,),,不能作为名字使用。,为了便于记忆,名字的定义应该做到见名知义,如用,BUFFER,表示缓冲区、,SUM,表示累加和等。,2) 名字的定义规则,3),名字的两种主要形式,名字有标号和变量两种主要形式。,(1),标号在代码段中定义,后面跟着冒号“:”,它也可以用,LABEL,或,EQU,伪操作来定义。此外,它还可以作为子程序名定义,由于子程序由伪指令定义,故子程序名不需冒号说明。标号经常在转移指令或,CALL,指令的操作数字段出现,用以表示转向地址。标号有三种属性:段、偏移及类型。,段属性:用于定义标号的段起始地址。此值必须在一个段寄存器中,而标号的段则总是在,CS,寄存器中。,3) 名字的两种主要形式,偏移属性:标号的偏移地址是从段起始地址到定义标号的位置之间的字节数。对于,16,位段是,16,位无符号数;对于,32,位段则是,32,位无符号数。,类型属性:用来指出该标号是在本段内引用还是在其他段中引用的。如在段内引用,则称为,NEAR,,对于,16,位段,指针长度为,2,字节;对于,32,位段,指针长度为,4,字节。如在段外引用,则称为,FAR,,对于,16,位段,指针长度为,4,字节,(,段地址,2,字节,偏移地址,2,字节,),;对于,32,位段,指针长度为,6,字节,(,段地址,2,字节,偏移地址,4,字节,),。,偏移属性:标号的偏移地址是从段起始地址到定义标号的位,(2),变量在数据段、附加数据段或堆栈段中定义,后面不跟冒号。它也可以用,LABEL,或,EQU,伪操作来定义。变量经常在操作数字段出现,它也有段、偏移及类型三种属性。,段属性:用于定义变量的段起始地址。此值必须在一个段寄存器中。,偏移属性:变量的偏移地址是从段的起始地址到定义变量的位置之间的字节数。对于,16,位段,是,16,位无符号数;对于,32,位段,则是,32,位无符号数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用,$,来表示。,(2) 变量在数据段、附加数据段或堆栈段中定义,后面,类型属性:变量的类型属性定义该变量所保留的字节数。如,BYTE(DB,,,1,个字节长,),、,WORD(DW,,,2,个字节长,),、,DWORD(DD,,,4,个字节长,),、,FWORD(DF,,,6,个字节长,),、,QWORD(DQ,,,8,个字节长,),、,TBYTE(DT,,,10,个字节长,),。,在同一个程序中,同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。,类型属性:变量的类型属性定义该变量所保留的字节数。如,2.,操作码,操作码用来指明操作的性质或功能,指令中的助记符都是操作码。操作码与操作数之间用空格分开,如,MOV,、,ADD,等都是操作码。,2. 操作码,3.,操作数,指令中的操作数是用来指定参与操作的数据。对于一般指令,可以有一个或两个操作数,也可以没有操作数;对于伪指令和宏指令,可以有多个操作数。当操作数多于一个时,操作数之间用逗号分开。操作数可以是常数和表达式。,3. 操作数,1),常数,(1),数值常数。汇编语言中的数值常数可以是二进制、八进制、十进制或十六进制数,书写时用加后缀,(,二进制用,B,、八进制用,O,或,Q,、十进制用,D,、十六进制用,H),的方式标明即可。对于十进制数可以省掉后缀,对于十六进制数,当以,A,F,开头时,前面加数字,0,,以避免和名字混淆,如十六进制数,A6H,应该写成,0A6H,,否则容易和名字,A6H,相混。,1) 常数,(2),字符串常数。包含在单引号中的若干个字符形成字符串常数,字符串在计算机中存储的是相应字符的,ASCII,码。如,A,的值是,41H,,,AB,的值是,4142H,等。,(3),符号常数。常数用符号名来代替就是符号常数。如用,COUNT EQU 3,或,COUNT=3,定义后,,COUNT,就是一个符号常数,与数值常数,3,等价。,(2) 字符串常数。包含在单引号中的若干个字符形成字,2),表达式,由运算对象和运算符组成的合法式子就是表达式,分为数值表达式和地址表达式两种。数值表达式的运算结果是一个数,地址表达式的运算结果是一个存储单元的地址。,(1),算术运算符有,(,加,),、,(,减,),、,*(,乘,),、,/(,除,),、,MOD(,取余,),。,算术运算符可以用于数值表达式和地址表达式中,用于地址表达式中要注意地址表达式的物理意义。同一段中的两个地址相减,(,其值为两个地址之间字节单元的个数,),、一个地址加上一个整数,(,其值为另一个单元的地址,),、一个地址减去一个整数,(,其值为另一个单元的地址,),是有意义的;两个地址相加、两个地址相乘或两个地址相除是没有意义的。,2) 表达式,下面的两条指令是正确的。,MOVAL,,,4*8+5,;数值表达式,MOVSI,,,OFFSETBUF+12,;地址表达式,下面的两条指令是正确的。,(2),逻辑运算符有,AND(,与,),、,OR(,或,),、,XOR(,异或,),、,NOT(,非,),。,逻辑运算符只能用于数值表达式中,不能用于地址表达式中。逻辑运算符和逻辑运算指令是有区别的。逻辑运算符的功能在汇编阶段完成,逻辑运算指令的功能在程序执行阶段完成。在汇编阶段,指令,AND AL,,,78H AND 0FH,等价于指令,AND AL,,,08H,。,(2) 逻辑运算符有AND(与)、OR(或)、XO,(3),关系运算符有,EQ(,相等,),、,LT(,小于,),、,LE(,小于等于,),、,GT(,大于,),、,GE(,大于等于,),、,NE(,不等于,),。,关系运算符要有两个运算对象,两个运算对象要么都是数值,要么都是同一个段内的地址。运算结果为真时,表示为,0FFFFH,;运算结果为假时,表示为,0000H,。,指令,MOV BX,,,32 EQ 45,等价于,MOV BX,,,0,;,指令,MOV BX,,,56 GT 30,等价于,MOV BX,,,0FFFFH,。,(3) 关系运算符有EQ(相等)、LT(小于)、LE,4.,注释项,注释是语句的说明部分,用来说明一条指令或一段程序的功能,由分号,(,;,),开始。适当地加些注释内容,可以增加程序的可读性,便于阅读、理解和修改程序。汇编源程序时,注释部分不产生机器代码。一条语句可以写成多行,续行符使用。,4. 注释项,4.2,伪 指 令,汇编语言程序的语句除指令以外还可以由伪操作和宏指令组成。伪操作又称为伪指令,它们不像机器指令那样是在程序运行期间由计算机来执行的,而是在汇编程序对源程序汇编期间由汇编程序处理的,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。伪指令形式上与一般指令相似,但伪指令只是为汇编程序提供有关信息,不产生相应的机器代码。,4.2 伪 指 令 汇编语言程序的语句除指令以外还可以,4.2.1,定义符号的伪指令,1.,等值伪指令,EQU,格式:, EQU ,功能:给符号名定义一个值,赋予一个符号名、表达式或助记符。,此后,程序中凡需要用到该表达式之处,就可以用表达式名来代替了。可见,,EQU,的引入提高了程序的可读性,也使其更加易于修改。上式中的表达式可以是任何有效的操作数格式,可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。举例如下:,4.2.1 定义符号的伪指令,CONSTANTEQU256,;将数,256,赋以符号名,CONSTANT,DATA EQUHEIGHT+12,;,HEIGHT,为一标号,地址表达式赋以符号名,DATA,ALPHA EQU7,BETA EQUALPHA,2,;这是一组赋值伪操作,把,7,2=5,赋以符号名,BETA,ADDR EQUVAR + BETA,;将,VAR+5,赋以符号名,ADDR,B EQUBP+8,;变址引用赋以符号名,B,P8 EQUDS,:,BP+8,;加段前缀的变址引用赋以符号名,P8,CONSTANTEQU256 ;将数256赋以符号名CO,在,EQU,语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。例如,语句,ABEQU DATA_ONE+2,必须放在,DATA_ONE,的定义之后,否则汇编程序将指示出错。,在EQU语句的表达式中,如果有变量或标号的表达式,则,2.,等号伪指令“,=”,另外,还有一个与,EQU,相类似的“,=”,伪操作也可以作为赋值操作使用。它们之间的区别是:,EQU,伪操作中的表达式名是不允许重复定义的,而“,=”,伪操作则允许重复定义。,例如,,EMP=6,或,EMP EQU 6,都可以使数,6,赋给符号名,EMP,,然而不允许两者同时使用。但是,语句,EMP=7,EMP=EMP+1,在程序中是允许使用的,因为“,=”,伪操作允许重复定义。这种情况下,在第一个语句后的指令中,,EMP,的值为,7,;而在第二个语句后的指令中,,EMP,的值为,8,。,2. 等号伪指令“=”,3.,解除定义伪指令,PURGE,格式:,PURGE ,功能:解除指定符号的定义。解除符号定义后,可用,EQU,重新进行定义。如:,Y1EQU7,;定义,Y1,的值为,7,PURGEY1,;解除,Y1,的定义,Y1EQU36,;重新定义,Y1,的值为,36,3. 解除定义伪指令PURGE,4.2.2,定义数据的伪指令,这一类伪指令的格式是:,变量,助记符 操作数,,,操作数 ;注释,功能:为操作数分配存储单元,并用变量与存储单元建立联系。其中,变量是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量名,则汇编程序使其记为第一个字节的偏移地址。注释字段用来说明该伪指令的功能,它也是可有可无的。助记符即伪指令用来说明所定义的数据类型。,4.2.2 定义数据的伪指令,常用的伪指令有以下几种:,(1) DB,用来定义字节,其后的每个操作数都占有一个字节,(8,位,),的存储单元。,(2) DW,用来定义字,其后的每个操作数占有一个字,(16,位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中,),。,(3) DD,用来定义双字,(4,个字节,),,其后的每个操作数占有两个字,(32,位,),。,(4) DF,用来定义,3,字,(6,个字节,),,其后的每个操作数占有,48,位,可用来存放远地址。这一伪指令只能用于,386,及其后继机型中。,常用的伪指令有以下几种:,(5) DQ,用来定义,4,字,(8,个字节,),,其后的每个操作数占有,4,个字,(64,位,),,可用来存放双精度浮点数。,(6) DT,用来定义,5,字,(10,个字节,),,其后的每个操作数占有,5,个字,形成压缩的,BCD,码形式。,这些伪指令可以把其后跟着的数据存入指定的存储单元,形成初始化数据,或者只分配存储空间而并不存入确定的数值,形成未初始化数据空间。,DW,和,DD,伪指令还可存储地址,,DF,伪指令则可存储由,16,位段地址及,32,位偏移地址组成的远地址指针。下面举例说明。,(5) DQ用来定义4字(8个字节),其后的每个操,【例,4-2,】 操作数可以是常数,或者是表达式,(,根据该表达式可以求得一个常数,),,如:,DATA_BYTEDB10,,,4,,,10H,DATA_WORDDW100,,,100H,,,5,DATA_DWDD3C,,,0FFFDH,【例4-2】 操作数可以是常数,或者是表达式,图,4.1,例,4-2,的汇编结果,图4.1 例4-2的汇编结果,【例,4-3,】 操作数也可以是字符串,如:,MESSAGEDBHELLO,存储情况如图,4.2(a),所示,而,DB AB,和,DW AB,的存储情况则分别如图,4.2(b),和,(c),所示。,【例4-3】 操作数也可以是字符串,如:,【例,4-4,】 操作数“?”可以保留存储空间,但不存入数据。如:,ABCDB0,,?,?,,0,DEFDW,?,,52,,?,经汇编后的存储情况如图,4.3,所示。,【例4-4】 操作数“?”可以保留存储空间,但不存入数据。,图,4.2,例,4-3,的汇编结果,(a),字符串的存储;,(b) DBAB,;,(c) DWAB,图4.2 例4-3的汇编结果,操作数还可以使用复制操作符,(DUPLICATION OPERATOR),来复制某个,(,或某些,),操作数。其格式为,REPEAT_COUNTDUP(OPERAND,,,,,OPERAND),其中,,REPEAT_COUNT,可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。,操作数还可以使用复制操作符(DUPLICATION,【例,4-5,】 使用,DUP,实现重复定义。,ARRAY1DB2DUP(0,,,1,,,2,,?,),ARRAY2DB100DUP( ? ),经汇编后的存储情况如图,4.4,所示。,由图可见,例,4-5,中的第一个语句和语句,ARRAY1 DB 0,,,1,,,2,,?,,0,,,1,,,2,,?是等价的。,【例4-5】 使用DUP实现重复定义。,图,4.3,例,4-4,的汇编结果,图4.3 例4-4的汇编结果,图,4.4,例,4-5,的汇编结果,图4.4 例4-5的汇编结果,说明:,这里操作数中的变量或标号可以使用表达式,如:,VARIABLECONSTANTEXPRESSION,LABELCONSTANTEXPRESSION,在这种情况下,汇编后,存储器中应该存入表达式的值。, DB,、,DW,、,DD,、,DF,、,DQ,和,DT,等伪指令在,MASM6.0,中可用,BYTE,、,WORD,、,DWORD,、,FWORD,、,QWORD,和,TBYTE,来取代,其含义是等同的。,说明:,变量的类型属性,(TYPE ATTRIBUTE),问题:在数据定义伪指令前面的变量的值,是该伪指令中的第一个数据项在当前段内的第一个字节的偏移地址。此外,它还有一个类型属性,用来表示该语句中的每一个数据项的长度,(,以字节为单位表示,),。因此,,DB,伪指令的类型属性为,1,,,DW,为,2,,,DD,为,4,,,DF,为,6,,,DQ,为,8,,,DT,为,10,。变量表达式的属性和变量的属性是相同的,汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。, 变量的类型属性(TYPE ATTRIBUTE)问,4.2.3,定义程序开始和结束的伪指令,在程序的开始部分可以用,NAME,或,TITLE,为模块命名。,NAME,的格式是:,NAMEMODULE_NAME,汇编程序将以给出的,MODULE_NAME,作为模块的名字。如果程序中没有使用,NAME,伪操作,则可使用,TITLE,伪操作,其格式为,TITLETEXT,4.2.3 定义程序开始和结束的伪指令,TITLE,伪操作可指定列表文件的每一页上打印的标题。同时,如果程序中没有使用,NAME,伪操作,则汇编程序将用,TEXT,中的前六个字符作为模块名。,TEXT,中最多可有,60,个字符。如果程序中既无,NAME,又无,TITLE,伪操作,则将用源文件名作为模块名。所以,,NAME,及,TITLE,伪操作并不是必要的,但一般经常使用,TITLE,,以便在列表文件中能打印出标题来。,表示源程序结束的伪操作的格式为,END,LABEL,TITLE伪操作可指定列表文件的每一页上打印的标题。,其中,标号,(LABEL),指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块只用,END,而不必指定标号。汇编程序将在遇到,END,时结束汇编,而程序则将从主模块的第一个标号处开始执行。,其中,标号(LABEL)指示程序开始执行的起始地址。,4.2.4,指令集选择伪指令,由于,80x86,的所有处理器都支持,8086/8088,指令系统,而且每一种高档的机型又都增加了一些新的指令,因此,在编写程序时要对所用处理器有一个确切的选择。也就是说,要告诉汇编程序应该选择哪一种指令系统。指令集选择伪指令的功能就是确定作用指令系统。,4.2.4 指令集选择伪指令,此类伪指令主要有以下几种:,(1) .8086,:选择,8086,指令系统。,(2) .286,:选择,80286,指令系统。,(3) .286P,:选择保护方式下的,80286,指令系统。,(4) .386,:选择,80386,指令系统。,(5) .386P,:选择保护方式下的,80386,指令系统。,(6) .486,:选择,80486,指令系统。,(7) .486P,:选择保护方式下的,80486,指令系统。,(8) .586,:选择,Pentium,指令系统。,(9) .586P,:选择保护方式下的,Pentium,指令系统。,此类伪指令主要有以下几种:,有关“选择保护方式下的,XXXX,指令系统”的含义是指包括特权指令在内的指令系统。此外,上述伪指令均支持相应的协处理器指令。,这类伪指令一般放在整个程序的最前面,如不给出,则汇编程序默认值为,.8086,指令系统。它们可放在程序中,如程序中使用了一条,80486,所增加的指令,则可以在该指令的上一行加上,.486,。,有关“选择保护方式下的XXXX指令系统”的含义是指包,4.2.5,地址计数器与对准伪操作,1.,地址计数器,$,在汇编程序对源程序汇编的过程中,使用地址计数器,(LOCATION COUNTER),来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零,以后在汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。地址计数器的值可用,$,来表示,汇编语言允许用户直接用,$,来引用地址计数器的值,因此指令,JNE $+6,4.2.5 地址计数器与对准伪操作,的转向地址是,JNE,指令的首地址加上,6,。当,$,用在指令中时,它表示本条指令的第一个字节的地址。在这里,,$+6,必须是另一条指令的首地址,否则,汇编程序将指示出错信息。当,$,用在伪操作的参数字段时,则和它用在指令中的情况不同,它所表示的是地址计数器的当前值。,的转向地址是JNE指令的首地址加上6。当$用在指令中时,它表,【例,4-6,】,$,用法示例。,ARRAY DW1,,,2,,,$+4,,,3,,,4,,,$+4,如汇编时,ARRAY,分配的偏移地址为,0074,,则汇编后的存储区将如图,4.5,所示。,注意:,ARRAY,数组中的两个,$+4,得到的结果是不同的,这是由于,$,的值是在不断变化的缘故。当在指令中用到,$,时,它只代表该指令的首地址,而与,$,本身所在的字节无关。,【例4-6】 $用法示例。,图,4.5,例,4-6,的汇编结果,图4.5 例4-6的汇编结果,2. ORG,伪操作,ORG,伪操作用来设置当前地址计数器的值,其格式为,ORG CONSTANT EXPRESSION,如常数表达式的值为,N,,则,ORG,伪操作可以使下一个字节的地址成为常数表达式的值,N,。例如:,VECTORS SEGMENT,ORG10,VECT1 DW47A5H,ORG20,VECT2 DW0C596H,VECTORS ENDS,2. ORG伪操作,则,VECT1,的偏移地址值为,0AH,,而,VECT2,的偏移地址值为,14H,。,常数表达式也可以表示从当前已定义过的符号开始的位移量,或表示从当前地址计数器值,$,开始的位移量,如:,ORG$+8,可以表示跳过,8,个字节的存储区,亦即建立了一个,8,字节的未初始化的数据缓冲区。如程序中需要访问该缓冲区,则可用,LABEL,伪操作来定义该缓冲区的如下变量名,则VECT1的偏移地址值为0AH,而VECT2的偏移地址值为,BUFFERLABELBYTE,ORG$+8,当然,其完成的功能和,BUFFERDB8DUP(?),是一样的。,BUFFERLABELBYTE,3. EVEN,伪操作,EVEN,伪操作使下一个变量或指令开始于偶数字节地址。一个字的地址最好从偶地址开始,所以对于字类型数组,为保证其从偶地址开始,可以在其前用,EVEN,伪操作来达到这一目的。,例如:,DATA_SEG SEGMENT,EVEN,;保证地址从偶地址开始,WORD_ARRAY DW100DUP(?),DATA_SEGENDS,3. EVEN伪操作,4. ALIGN,伪操作,ALIGN,伪操作为保证双字类型数组边界从,4,的倍数开始创造了条件,其格式为,ALIGNBOUNDARY,其中,,BOUNDARY,必须是,2,的幂,例如:,.DATA,ALIGN4,ARRAYDB100DUP(,?,),就可保证,ARRAY,的值为,4,的倍数。当然,,ALIGN 2,和,EVEN,是等价的。,4. ALIGN伪操作,4.3,汇编语言源程序结构,1.,完整段定义的程序结构,存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量,(,代码段和数据段的符号地址,),的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此,需要用段定义伪操作,其格式如下:,4.3 汇编语言源程序结构 1. 完整段定义的程序结构,SEGMENT_NAMESEGMENT,SEGMENT_NAMEENDS,其中,删节号部分对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作;对于代码段则是指令及伪操作。,SEGMENT_NAMESEGMENT,此外,还必须明确段和段寄存器的关系,这可用,ASSUME,伪操作来实现,其格式为,ASSUME ,:段名,,,:段名,.,ASSUME ,:,NOTHING,其中,段寄存器名必须是,CS,、,DS,、,ES,和,SS(,对于,386,及其后继机型还有,FS,和,GS),中的一个,而段名则必须是由,SEGMENT,定义的段中的段名。,ASSUME NOTHING,则可取消前面由,ASSUME,所指定的段寄存器。,此外,还必须明确段和段寄存器的关系,这可用ASSU,例如,下面是一个较为完整的汇编源程序段定义。,DATE_SEG1 SEGMENT,;定义数据段,DATE_SEG1 ENDS,DATA_SEG2 SEGMENT,;定义数据附加段,DATA_SEG2 ENDS,CODE_SEG SEGMENT,;定义代码段,ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2,START:,;开始执行的入口地址,例如,下面是一个较为完整的汇编源程序段定义。,;设置,DS,寄存器为当前数据段,MOVAX,,,DATA_SEG1,;将数据段地址赋予,DS,MOVDS,,,AX,;设置,ES,寄存器为当前附加段,MOVAX,,,DATA_SEG2,;将附加数据段地址赋予,ES,MOVES,,,AX,CODE_SEGENDS,;代码段定义结束,ENDSTART,;源程序结束,;设置DS寄存器为当前数据段,由于,ASSUME,伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,要把段地址装入段寄存器中,就必须在代码段中有对段地址装入相应的段寄存器中的指令。如在上面的程序中,分别用两条,MOV,指令完成这一操作。如果程序中有堆栈段,也需要把段地址装入,SS,中。但是,代码段,CS,不需要这样做,这一操作是在程序初始化时完成的。,由于ASSUME伪操作只是指定某个段分配给哪一个段寄,为了对段定义作进一步地控制,,SEGMENT,伪操作添加有类型及属性的说明,其格式如下:, SEGMENT ,定位类型,组合类型使用类型,类别, ENDS,在一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。,为了对段定义作进一步地控制,SEGMENT伪操作添加,2.,定位类型,(ALIGN_TYPE),定位类型用于说明段的起始地址应有怎样的边界值,其取值可以是:,PARA,:指定段的起始地址必须从小段边界开始,即段起始地址最低位必须为,0,。这样,偏移地址可以从,0,开始。,BYTE,:该段可以从任何地址开始,这样,起始偏移地址可能不是,0,。,WORD,:该段必须从字的边界开始,即段起始地址必须为偶数。,2. 定位类型(ALIGN_TYPE),DWORD,:该段必须从双字边界开始,即段起始地址的最低位必须为,4,的倍数。,PAGE,:该段必须从负的边界开始,即段起始地址的最低两个十六进制数位必须为,0(,该地址能被,256,整除,),。,定位类型的默认项是,PARA,,即若未指定定位类型时,则汇编程序默认为,PARA,。,DWORD:该段必须从双字边界开始,即段起始地址的,3.,组合类型,(COMBINE_TYPE),组合类型用于说明程序连接时段的合并方法,其取值可以是:,PRIVATE,:该段为私有段,在连接时将不与其他模块中的同名段合并。,PUBLIC,:该段连接时可以把不同模块中的同名段相连接而合并为一个段,其连接次序由连接命令指定。每一分段都从小段的边界开始,因此,各模块的原有段之间可能存在小于,16,个字节的间隙。,3. 组合类型(COMBINE_TYPE),COMMON,:该段在连接时可以把不同模块中的同名段重叠而形成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。,COMMON,的连接长度是各分段中的最大长度。重叠部分的内容取决于排列在最后一段的内容。,AT EXPRESSTION,:使段地址为表达式所计算出来的,16,位值,但它不能用来指定代码段。,MEMORY,:与,PUBLIC,同义。,COMMON:该段在连接时可以把不同模块中的同名段,STACK,:把不同模块中的同名段组合而形成一个堆栈段,该段的长度为原有各堆栈段长度的总和,原有各段之间并无,PUBLIC,所连接段中的间隙,而且栈顶可自动指向连接后形成的大堆栈段的栈顶。,组合类型的默认项是,PRIVATE,。,STACK:把不同模块中的同名段组合而形成一个堆栈段,4.,使用类型,(USE_TYPE),使用类型只适用于,386,及其后继机型,它用来说明是使用,16,位寻址方式还是使用,32,位寻址方式。其取值可以是:,USE16,:使用,16,位寻址方式。,USE32,:使用,32,位寻址方式。,当使用,16,位寻址方式时,段长不超过,64 KB,,地址的形式是,16,位段地址和,16,位偏移地址组合;当使用,32,位寻址方式时,段长可达,4 GB,,地址的形式是,16,位段地址和,32,位偏移地址组合。可以看出,在实模式下,应该使用,USE16,。,使用类型的默认项是,USE16,。,4. 使用类型(USE_TYPE),5.,类别名,(CLASS),在引号中给出连接时组成段组的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。,5. 类别名(CLASS),4.4,汇编语言程序的上机过程,在计算机上运行汇编语言程序的步骤是:,(1),用编辑程序建立,.ASM,源文件;,(2),用,MASM,程序把,.ASM,文件转汇编成,.OBJ,文件;,(3),用,LINK,程序把,.OBJ,文件连接成,.EXE,文件;,(4),用,DOS,命令直接键入文件名就可执行该程序。,目前常用的汇编程序有,Microsoft,公司推出的宏汇编程,MASM(MACRO ASSEMBLER),和,BORLAND,公司推出的,TASM(TURBO ASSEMBLER),两种。本书采用,MASM5.0,版来说明汇编程序所提供的伪操作和操作符,操作流程如图,4.6,所示。,4.4 汇编语言程序的上机过程在计算机上运行汇编语言程序的步,图,4.6,汇编语言程序的建立及汇编过程,图4.6 汇编语言程序的建立及汇编过程,说明:图中,表示操作使用的项;,表示操作得到的文件。,汇编程序的主要功能是:,(1),检查源程序语法是否正确。,(2),测出源程序中的语法错误,并给出出错信息。,(3),产生源程序的目标程序,并可给出列表文件,(,同时列出汇编语言和机器语言的文件,称为,.LST,文件,),。,(4),展开宏指令。,说明:图中表示操作使用的项;表示操作得到的文件。,4.4.1,建立汇编语言的工作环境,为运行汇编语言程序,至少要在磁盘上提供以下文件:,(1),编辑程序,如,EDIT.EXE,;,(2),汇编程序,如,MASM.EXE,;,(3),连接程序,如,LINK.EXE,;,(4),调试程序,如,DEBUG.COM,。,必要时,还要提供,CREF.EXE,、,EXR2BIN.EXE,等文件。,4.4.1 建立汇编语言的工作环境,4.4.2,汇编语言源程序上机过程,1.,建立汇编源程序,.ASM,文件,为了说明汇编语言程序上机运行的过程,现举例如下。,【例,4-7,】 把,40,个字母,A,的字符串从源缓冲区传送到目的缓冲区。,可以用编辑程序,EDIT,在磁盘上建立如下的源程序,EXAM.ASM,。,TITLE EXAM.ASM,DATASEGMENT,DATSDB 40DUP(A),DATAENDS,EXTRASEGMENT,4.4.2 汇编语言源程序上机过程TITLE EXAM.A,DATDDB40DUP(?),EXTRAENDS,CODESEGMENT,MAINPROCFAR,ASSUMECS:CODE,,,DS:DATA,,,ES:EXTRA,START:,PUSHDS,SUBAX,,,AX,PUSHAX,DATDDB40DUP(?),MOVAX,,,DATA,MOVDS,,,AX,MOVAX,,,EXTRA,MOVES,,,AX,LEASI,,,DATS,LEADI,,,DATD,CLD,MOVCX,,,40,REP MOVSB,RET,MAIN ENDP,CODE ENDS,END START,MOVAX,DATA,2.,汇编产生,.OBJ,文件,源文件建立后,就要用汇编程序对源文件汇编,汇编后产生二进制的目标文件,(.OBJ,文件,),,其操作与汇编程序回答如下。,C,:,MASM EXAM,MICROSOFT (R) MACRO ASSEMBLER VERSION 5.00,COPYRIGHT (C) MICROSOFT CORP 1981-1985,,,1987. ALL RIGHTS RESERVED.,OBJECT FILENAME EXAM.OBJ: ,SOURCE LISTINGNUL.LST:EXAM,CROSS-REFERENCE NUL.CRF:EXAM,32768 + 447778 BYTES SYMBOL SPACE FREE,0 WARNING ERRORS,0 SEVERE ERRORS,2. 汇编产生 .OBJ文件,汇编程序的输入文件是,.ASM,文件,其输出文件可以有三个,表示上列汇编程序回答的第,3,5,行。第一个是,.OBJ,文件,这是汇编的主要目的,所以这个文件我们是需要的,对,EXAM.OBJ,:直接回车,这样就在磁盘上建立了这一目标文件。第二个是,.LST,文件,称为列表文件。这个文件同时列出源程序和机器语言程序清单,并给出符号表,因而可使程序调试更加方便。这个文件是可有可无的,如果不需要则可对,NUL.LST,:回车;如果需要这个文件,则可键入文件名后回车,这里是,EXAM(,表示回车,),,这样例,4-7,的列表文件,EXAM.LST,就建立起来了。,LIST,清单的最后部分为段名表和符号表,表中分别给出段名、段的大小及有关属性,以及用户定义的符号名、类型及属性。交叉引用表给出了用户定义的所有符号,对于每个符号列出了其定义所在行号,(,加上,#),及引用的行号。可以看出,它为大程序的修改提供了方便,而一般较小的程序则可不使用。,汇编程序的输入文件是 .ASM文件,其输出文件可以有,到此为止,汇编过程已经完成了。但是,汇编程序还有另一个重要功能,就是可以给出源程序中的错误信息类型:警告错误,(WARNING ERRORS),指出汇编程序所认为的一般性错误;严重错误,(SEVERE ERRORS),指出汇编程序认为已使汇编程序无法进行正确汇编的错误。除给出错误的个数外,汇编程序还能指出错误信息的类型,本书在附录,1,列出了汇编程序错误信息的类型,供编程者参阅。如果程序有错,则应重新调用编辑程序修改错误,并重新编译直到编译正确通过为止。当然汇编程序只能指出程序中的语法错误,至于程序的算法或逻辑错误,则应在程序调试时去解决。,到此为止,汇编过程已经完成了。但是,汇编程序还有另一,3.,链接产生,.EXE,文件,汇编程序已产生出二进制的目标文件,(.OBJ),,但,.OBJ,文件并不是系统可执行的文件,因此还必须使用连接程序,(LINK),把,.OBJ,文件转换为系统可执行的,.EXE,文件。当然,如果一个程序是由多个模块组成时,也应该通过,LINK,把它们连接在一起,操作方法及机器回答如下。,3. 链接产生 .EXE文件,C,:,LINK EXAM,MICROSOFT (R) OVERLAY LINKER VERSION 3.60,COPYRIGHT (C) MICROSOFT CORP 1983-1987,,,ALL RIGHTS RESERVED,,,RUN FILEEXAM.EXE,;,LIST FILENUL.MAP,:,EXAM,LIBRARIES .LIB,:,LINK,:,WARNING L4021,:,NO STACK SEGMENT,C,:,LINK EXAM,MICROSOFT (R) OVERLAY LINKER VERSION 3.60,COPYRIGHT (C) MICROSOFT CORP 1983-1987,,,ALL RIGHTS RESERVED,,,RUN FILEEXAM.EXE,;,LIST FILENUL.MAP,:,EXAM,LIBRARIES .LIB,:,LINK,:,WARNING L4021,:,NO STACK SEGMENT,C:LINK EXAM,LINK,程序有两个输入文件,.OBJ,和,.LIB,。,.OBJ,是我们需要连接的目标文件,,.LIB,则是程序中需要用到的库文件,如无特殊需要,则应对,.LIB,:直接回车。,LINK,程序有两个输出文件,一个是,.EXE,文件,这当然是我们所需要的,应对,EXAM.EXE,:直接回画,这样就在磁盘上建立了该可执行文件。,LINK,的另一个输出文件为,.MAP,文件,它是连接程序的列表文件,又称为连接映像,(LINK MAP),,它给出每个段在存储器中的分配情况。,连接程序给出的无堆栈段的警告性错误并不影响程序的运行。所以,到此为止,连接过程已经结束,可以在操作系统下执行,EXAM,程序了。,LINK程序有两个输入文件 .OBJ和 .LIB。,4.,程序的调试和执行,在建立了,.EXE,文件后,就可以直接在操作系统中执行程序,如下所示:,C,:, EXAM,C,:,_,程序运行结束并返回,DOS,。如果用户程序已直接把结果在终端上显示出来,那么程序已经运行结束,结果也已经得到。但是,如果,EXAM,程序并未显示出结果,这就要使用调试程序查看内存缓冲区。常用调试工具软件为,DEBUG,,见附录,2,。,4. 程序的调试和执行,5.,生成,.COM,文件,.COM,文件也是一种可执行文件,由程序本身的二进制代码组成,它没有,.EXE,文件所具有的包括有关文件信息的标题区,(HEADER),,因此它占有的存储空间比,.EXE,文件要小。,.COM,文件不允许分段,它所占有的空间不允许超过,64 KB,,因而只能用来编制较小的程序。由于其小而简单,装入速度比,.EXE,文件要快。,使用,.COM,文件时,程序不分段,其入口点,(,开始运行的起始点,),必须是,100H(,其前的,256,个字节为程序段前缀所在地,),,且不必设置堆栈段。在程序装入时,由系统自动把,SP,建立在该段之末。对于所有的过程则应定义为,NEAR,。,5. 生成 .COM文件,用户在建立源文件以后,同样经过汇编、连接生成,.EXE,文件,然后可以通过,DOS,操作系统下的,EXE2BIN,程序来建立,.COM,文件,操作方法如下:,C,:,EXE2BIN FILENAME FILENAME.COM,请读者注意,上行中的第一个,FILENAME,给出了已形成的,.EXE,文件的文件名,但不必给出文件扩展名。第二个,FILENAME,即为所要求的,.COM,文件的文件名,它必须带有文件扩展名,.COM,,这样就形成了所要的,.COM,文件。在,DOS,系统下,可直接在机器上键入文件名以执行程序。如果第二个,FILENAME,后不跟扩展名,则将形成,.BIN,文件,在,DOS,系统下运行该程序时,必须先用,RENAME,命令把它改名为,.COM,文件才能直接运行。,用户在建立源文件以后,同样经过汇编、连接生成 .EX,此外,,.COM,文件还可以直接在调试程序,DEBUG,中用,A,或,E,命令建立,对于一些短小的程序,这也是一种相当方便的方法。,此外,.COM文件还可以直接在调试程序DEBUG中用,4.5,汇编语言程序设计,4.5.1,流程图的组成,借助于流程图可以清晰地把程序思路表达出来,有助于编写正确的程序。流程图对程序设计人员,特别是初学者来说是一种非常有用的工具。流程图是用一些图框表示各种操作,用图形表示算法,直观形象,易于理解。美国国家标准化协会,ANSI(American National Standard Institute),规定了一些常用的流程图,已为世界各国程序工作者普遍采用。,4.5 汇编语言程序设计4.5.1 流程图的组成,图,4.7,流程图的组成成分,图4.7 流程图的组成成分,1),执行框,(,矩形框,),执行框的作用是表示一段程序或一个模块的功能,对于结构化程序,一个执行框只有一个入口和一个出口。,2),判别框,(,菱形框,),判别框的作用是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。它有一个入口,两个出口,表示比较、判断条件。,1) 执行框(矩形框),3),开始框和终止框,开始框和终止框表示程序的起始和终止。,4),指向线,指向线表示程序执行的顺序。,5),连接点,连接点是用于将画在不同地方的流程线连接起来。如图,4.8,中,有两个以,为标志的连接点,它表示这两个点是互相连接在一起的。实际上它们是同一个点,只是当在纸张上画不下才分开来画。使用连接点可以避免流程线的交叉或过长,使流程图清晰。,3) 开始框和终止框,图,4.8,流程图的绘制示意,图4.8 流程图的绘制示意,可以看出,流程图是表示算法的较好工具。一个流程图包括以下几部分:,(1),表示相应操作的框;,(2),带箭头的流程线;,(3),框内外必要的文字说明。,绘制流程线不要忘记画箭头,因为它是反映流程的执行先后次序的,如不画出箭头就难以判定各框的执行次序了。,用流程图表示算法直观形象,比较清楚地显示出各个框之间的逻辑关系。常用的还有,N-S,结构化流程图。程序编制人员都应当掌握传统流程图,会看会画。,可以看出,流程图是表示算法的较好工具。一个流程图包括,4.5.2 BIOS,中断调用,1. BIOS,中断调用概述,BIOS(Basic Input/Output System),是,IBM-PC,机的监控程序,它固化在微型机主板的,ROM,中,它的内容主要有系统测试程序,(POST),、初始化引导程序,(BOOT),、,I/O,设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在。例如,负责显示输出的显示,I/O,程序为,10H,号中断服务程序;负责打印输出的打印,I/O,程序为,17H,号中断服务程序等。,4.5.2 BIOS中断调用,图,4.9,是用户程序和操作系统关系示意图,由图可见,,BIOS,程序直接建立在硬件基础上,磁盘操作系统,(DOS),和其他操作系统建立在,BIOS,基础上,各种高级语言则建立在操作系统基础上。用户程序可以使用高级语言,也可以调用,DOS,或其他操作系统,还可以调用,BIOS,,甚至直接指挥硬件设备。,图4.9是用户程序和操作系统关系示意图,由图可见,B,图,4.9,用户程序和操作系统关系示意图,图4.9 用户程序和操作系统关系示意图,通常,应用程序调用,DOS,提供的系统功能,完成输入,/,输出或其他操作,这样做用户可以少考虑硬件,实现起来容易。应用程序直接对硬件编程的优点是程序的效率高,缺点是需要程序员对硬件性能有较深的了解,编程复杂,所以一般不直接对硬件编程。,BIOS,中断程序处于,DOS,功能调用和硬件环境之间,和,DOS,功能调用相比,其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。在下列情况下可考虑使用,BIOS,中断。,通常,应用程序调用DOS提供的系统功能,完成输入/输,(1),有些功能,DOS,没有提供,但,BIOS,提供了;,(2),有些场合无法使用,DOS,功能调用;,(3),其他原因。,(1) 有些功能DOS没有提供,但BIOS提供了;,2. BIOS,中断调用方法,BIOS,的调用就是人们借用每一台计算机中,BIOS,固有的,I/O,操作程序来方便地解决自己的问题,由于它已经在计算机中了,因此人们不必再把它写入自己的程序,只要指明它的操作位置就可以了。,1) BIOS,调用的基本操作,由于,BIOS,中的每一种功能调用往往包含不同的几个操作细节,所以调用时需要说明三部分,基本步骤为:,(1),设置分功能号:按实现的操作功能的要求,给指定寄存器,(,通常为,AH),送入分功能号。,2. BIOS中断调用方法,(2),置入口参数:按操作要求,给寄存器填写相应参数的内容,(,某些调用无参数,),。,(3),使用中断语句,INT n,:执行调用的功能,其中,n,为中断号。,(4),分析出口参数。,具体步骤为,(2) 置入口参数:按操作要求,给寄存器填写相应参数,例如,MOVAH,,,0,;分功能号为,0,MOVAL,,,10H,;置入口参数,INT1AH,;,1AH,为中断号,功能为读时间计数器的值,注意:,某些,BIOS,调用可能没有出口参数,这时省略第,(4),步操作。,例如MOVAH,0;分功能号为0,2) BIOS,打印功能,BIOS I7H,号中断指令提供了由,AH,寄存器指定的三种不同的操作。,(1) BIOS,中断,17H,号的功能,0,是打印一个字符。要打印输出的字符放在,AL,中,打印机号放在,DX,中,,BIOS,最多允许连接三台打印机,机号分别为,0,,,1,和,2,。如果只有一台打印机,那么就是,0,号打印机,打印机的状态信息被回送到,AH,寄存器。,MOVAH,,,0,;请求打印,MOVAL,,,CHAR,;写入打印字符,MOVDX,,,0,;设置,0#,打印口,INT17H,;调用,BIOS,2)
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!