《最新微机原理课件第四章宏汇编语言程序设计PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新微机原理课件第四章宏汇编语言程序设计PPT课件.ppt(163页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、微机原理课件第四章宏汇编微机原理课件第四章宏汇编语言程序设计语言程序设计基本概念:基本概念:汇编语言:用指令的助记符、符号地址、标号汇编语言:用指令的助记符、符号地址、标号 等来编写的语言。等来编写的语言。汇编语言源程序:用汇编语言编写的程序(汇编语言源程序:用汇编语言编写的程序(*.asm)有两种语句格式:有两种语句格式:指令性语句:汇编时翻译成目标代码(机器码),指令性语句:汇编时翻译成目标代码(机器码),占代码段空间。占代码段空间。指示性语句(伪指令):汇编时,不产生目标代指示性语句(伪指令):汇编时,不产生目标代码,只是为汇编程序提供信息,不占代码段空间。码,只是为汇编程序提供信息,不
2、占代码段空间。汇编程序:将汇编语言源程序翻译成目标目标程汇编程序:将汇编语言源程序翻译成目标目标程序(代码),这个翻译过程称为汇编,翻译软件就序(代码),这个翻译过程称为汇编,翻译软件就叫汇编程序。叫汇编程序。汇编过程汇编过程例例4-5 IN AL,PORT AND DX,PORT AND 0FEH OUT DX,AX前一个前一个AND是指令助记符,而后一个是指令助记符,而后一个AND是是逻辑运算符。逻辑运算符。逻辑运算符与逻辑运算符与8086指令系统中的指令助记指令系统中的指令助记符符AND、OR、XOR、NOT符号完全相同,符号完全相同,但两者是不会混淆的。作为但两者是不会混淆的。作为MA
3、SM的运算符的运算符是在汇编过程中进行计算的,而指令助记符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。是在程序执行时进行运算的。三、关系运算符三、关系运算符 有:有:EQ(相等)、(相等)、NE(不等)、(不等)、LT(小于)、(小于)、GT(大于),(大于),LE(小于或等于)、(小于或等于)、GE(大于或等于)。(大于或等于)。关系运算符的两个操作数必须是数据,关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,关系运算的比较操作后,结果是一个数值,若结果为真,输出若结果为真
4、,输出全全1,即,即FFH(8位)或位)或FFFFH(16位)。若结果为假,输出全位)。若结果为假,输出全0。例例4-6 MOV AX,10H GT 16 MOV BL,6 EQ 0110B MOV CX,12H GE 12由于表达式由于表达式10H GT 16为假所以汇编成:为假所以汇编成:MOVAX,0由于表达式由于表达式6 EQ 0110B为真所以汇编成:为真所以汇编成:MOVBL,0FFH注意:注意:MOV BL,1 由于表达式由于表达式12H GE 12 为真所以汇编成:为真所以汇编成:MOVCX,0FFFFH注意:注意:MOV CX,1 四、数值返回运算符四、数值返回运算符数值返回
5、运算符也经常称作分析运算符数值返回运算符也经常称作分析运算符有:有:OFFSET、SEG、TYPE、LENGTH、SIZE 5种,它们加在变量或标号前,返回运种,它们加在变量或标号前,返回运算对象的某个参数值,例如偏移地址值、段算对象的某个参数值,例如偏移地址值、段地址值、类型属性、变量包含的单元数等。地址值、类型属性、变量包含的单元数等。1.OFFSET格式:格式:OFFSET 变量或标号变量或标号OFFSET 返回标号或变量的偏移地址值。返回标号或变量的偏移地址值。例例4-7 DDD:MOV AX,BX;标号;标号 MOV BX,OFFSET DDD ARRAY DB 1,2,3,4;变量
6、;变量 MOV BX,OFFSET ARRAY LEA BX,ARRAY2.SEG格式:格式:SEG 变量或标号变量或标号SEG 返回标号或变量的段地址值。返回标号或变量的段地址值。例例4-8 DDD:MOV AX,BX;标号;标号 MOV AX,SEG DDD MOV CS,AXARRAY DB 1,2,3,4;变量;变量 MOV AX,SEG ARRAY MOV DS,AX3.TYPE格式:格式:TYPE 变量或标号变量或标号TYPE加在变量前,返回变量的类型属性。加在变量前,返回变量的类型属性。TYPE加在标号前,返回标号的距离属性。加在标号前,返回标号的距离属性。例例4-9 A1 DB
7、 1,2,3;变量;变量A2 DW 1234H;变量;变量A3 DD 6 DUP(?);变量(?);变量 L1:MOV AH,TYPE A1;标号;标号MOV BH,TYPE A2MOV CH,TYPE A3MOV DH,TYPE L1MOV DX,TYPE L1汇编成:汇编成:MOVAH,1汇编成:汇编成:MOVBH,2汇编成:汇编成:MOVCH,4汇编成:汇编成:MOVDH,0FFH汇编成:汇编成:MOVDX,0FFFFH4.LENGTH格式:格式:LENGTH 变量变量当变量中使用当变量中使用DUP时,时,LENGTH返回此变返回此变量所包含的量所包含的单元数单元数,对其它变量则返回,对
8、其它变量则返回1。例例4-10 M1 DW 100 DUP(?)(?)M2 DB 1,2,3,4M3 DW 1234H,12H,3456HMOV CX,LENGTH M1MOV BL,LENGTH M2MOV DL,LENGTH M3汇编成:汇编成:MOVCX,100 汇编成:汇编成:MOVBL,1 MOVBL,4 汇编成:汇编成:MOVDL,1 MOVDL,3 5.SIZE格式:格式:SIZE 变量变量SIZE加在变量前,返回该变量包含的总字加在变量前,返回该变量包含的总字节数,节数,注意注意不能简单去数有多少个字节,而不能简单去数有多少个字节,而是利用公式是利用公式SIZE=LENGTHT
9、YPE来计算。来计算。例例4-10 M1 DW 100 DUP(?)(?)M2 DB 1,2,3,4M3 DW 1234H,12H,3456HMOV CX,SIZE M1MOV BL,SIZE M2MOV DL,SIZE M3汇编成:汇编成:MOVCX,200 汇编成:汇编成:MOVBL,1 MOV BL,4 汇编成:汇编成:MOVDL,2 MOV DL,6 五、修改属性运算符五、修改属性运算符修改属性运算符也经常称作综合运算符修改属性运算符也经常称作综合运算符有:有:段操作符段操作符、PTR、THIS、HIGH、LOW、SHORT 6种,可以在程序运行过程中,通种,可以在程序运行过程中,通过
10、修改属性运算符来修改变量或标号的属性,过修改属性运算符来修改变量或标号的属性,包含段属性、偏移地址属性、类型属性等。包含段属性、偏移地址属性、类型属性等。1.段操作符段操作符格式:格式:段前缀:变量或地址表达式段前缀:变量或地址表达式段前缀有段寄存器段前缀有段寄存器CS、DS,ES,SS后跟冒号后跟冒号:,用来表示某个变量或地址被修改到哪个,用来表示某个变量或地址被修改到哪个段寄存器提供的段地址。段寄存器提供的段地址。例例4-12 MOV AX,BX ;DS:BXAX MOV AX,ES:BX;ES:BXAX2.PTR格式:格式:类型类型/距离:距离:PTR 变量或标号变量或标号功能:功能:是
11、将是将PTR左边的类型属性赋给右边的左边的类型属性赋给右边的变量或标号。这样可以保证运算时操作数类变量或标号。这样可以保证运算时操作数类型的匹配,常与类型型的匹配,常与类型BYTE、WORD、DWORD、FAR、NEAR等连用。等连用。例例4-13N1 DB 12H,34HN2 DW 1122H,3344HLO:MOV AX,WORD PTR N1MOV BL,BYTE PTR N2例例4-14 MOV BX,10H MOV BYTE PTRBX,10HMOV WORD PTRBX,12HMOV BX,ALMOV BX,AX这两条指令正确与否?这两条指令正确与否?JMP FAR PTR LO;
12、修改标号的距离属性;修改标号的距离属性JMP NEAR PTR LO3.THIS格式:变量或标号格式:变量或标号 EQU THIS 类型或距离类型或距离功能:功能:将类型或距离属性赋给变量或标号,将类型或距离属性赋给变量或标号,该变量或标号的段地址和偏移地址与下一个该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。存储单元的地址相同。例例4-15 FIRST EQU THIS BYTE TABLE DW 200 DUP(?)(?)FIRST的偏移地址值与的偏移地址值与TABLE的偏移地址值的偏移地址值相同,区别在于相同,区别在于FIRST变量为字节类型,而变量为字节类型,而TABLE为
13、字类型。为字类型。例例4-16 SSP EQU THIS FAR MOV AX,200此时此时MOV AX,200前有标号前有标号SSP,并赋予,并赋予FAR属性,允许其它段的属性,允许其它段的JMP指令跳到本段指令跳到本段SSP标号地址处来。标号地址处来。相当于相当于 SP:MOV AX,200;SP是远标号是远标号4.SHORT格式:格式:SHORT 标号标号SHORT用来说明转移类指令中转向地址的用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令之间的属性,指出转向的目标地址与本指令之间的距离在距离在-128+127之间,即限制在短转移范之间,即限制在短转移范围内。围内。例例
14、4-17 JMP SHORT L2 L2:MOV AX,BX 5.HIGH和和LOW格式:格式:HIGH/LOW 变量或标号变量或标号HIGH和和LOW称为字节分离运算符,对一个称为字节分离运算符,对一个数或地址表达式,数或地址表达式,HIGH从中分离出高位字节从中分离出高位字节LOW从中分离出低位字节。从中分离出低位字节。例例4-18 K1 EQU 1234HK2 EQU 5678HMOV AH,HIGH K1MOV BL,LOW K2汇编成:汇编成:MOVAH,12H 汇编成:汇编成:MOVBL,78H 六、其它运算符六、其它运算符有:有:、()()、.、MASK和和WIDTH等等七、优先
15、级七、优先级表达式是常数、变量、标号和运算符的表达式是常数、变量、标号和运算符的组合,在计算表达式时,应按优先级高低进组合,在计算表达式时,应按优先级高低进行计算,同时遵循同级运算从左到右的原则行计算,同时遵循同级运算从左到右的原则计算。计算。4-3 伪指令语句伪指令语句 伪指令语句没有对应的机器代码,并不伪指令语句没有对应的机器代码,并不像指令语句那样由像指令语句那样由CPU来执行,它是来执行,它是MASM汇编程序对源程序汇编期间进行处理的。主汇编程序对源程序汇编期间进行处理的。主要完成变量定义、存储器分配、指示程序开要完成变量定义、存储器分配、指示程序开始和结束、段定义、段分配等。伪指令有
16、以始和结束、段定义、段分配等。伪指令有以下几种类型:下几种类型:数据定义语句数据定义语句DB、DW、DD等等标号赋值语句标号赋值语句EQU、=段定义语句段定义语句SEGMENT ENDS段分配语句段分配语句ASSUME过程定义语句过程定义语句PROC ENDP程序开始结束语句程序开始结束语句ORG、END、NAME一、数据定义语句一、数据定义语句格式格式1:变量名:变量名 助记符助记符 操作数,操作数操作数,操作数 格式格式2:变量名:变量名 助记符助记符 n DUP(操作数,操作数(操作数,操作数)A1 DB 1,2,3A3 DB 5 DUP(1,2)功能功能:将操作数存入变量名指定的存储单
17、元:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数据。中,或者只分配存储空间不存入数据。变量名变量名它用符号表示,可以省略,作用它用符号表示,可以省略,作用与指令语句中的标号相同,但后面不跟冒号与指令语句中的标号相同,但后面不跟冒号:。汇编程序汇编时将此变量的助记符后。汇编程序汇编时将此变量的助记符后的第一个字节的偏移地址作为它的符号地址。的第一个字节的偏移地址作为它的符号地址。助记符助记符主要有:主要有:DB:用来定义字节,表示每个操作数占一个字节:用来定义字节,表示每个操作数占一个字节DW:用来定义字,表示每个操作数占一个字:用来定义字,表示每个操作数占一个字DD:用来定义
18、双字,表示每个操作数占两个字:用来定义双字,表示每个操作数占两个字DQ:用来定义四个字,表示每个操作数四个字:用来定义四个字,表示每个操作数四个字DT:用来定义:用来定义10个字节,表示每个操作数个字节,表示每个操作数10个字节个字节操作数操作数操作数可以是常数、字符串、变操作数可以是常数、字符串、变量、标号、表达式等,多个操作数之间必须量、标号、表达式等,多个操作数之间必须用逗号用逗号,隔开。隔开。例例4-21 操作数是常数或表达式操作数是常数或表达式DA1 DB 10H,20HDA2 DW 1122H,34HDA3 DD 5*10H,1234H例例4-22 操作数是字符串操作数是字符串FI
19、RST DB HELLOSECOND DW OKTHIRD DB OK注意:注意:用用DW定义字符定义字符串时,只允许包含两个串时,只允许包含两个字符,多于两个字符时,字符,多于两个字符时,只能用只能用DB来定义。来定义。例例4-23 操作数用?定义不确定值的变量,用操作数用?定义不确定值的变量,用作保留存储空间,以便存放运算结果。作保留存储空间,以便存放运算结果。M1 DB?,?,?M2 DW 1234H,?,?例例4-24 操作数用操作数用DUP来定义重复变量来定义重复变量ONE DB 5 DUP(0)TWO DW 10 DUP(?)(?)THREE DB 3 DUP(1,2)FOUR D
20、B 2 DUP(1,3 DUP(10H););DUP 嵌套嵌套操作数是变量或标号:操作数是变量或标号:用伪指令用伪指令DW和和DD可以将变量或标号的可以将变量或标号的偏移地址存入存储器中,当用偏移地址存入存储器中,当用DD来定义时,来定义时,原变量或标号的偏移地址存入低位字中,原原变量或标号的偏移地址存入低位字中,原变量或标号的段地址存入高位字中。变量或标号的段地址存入高位字中。例例4-25 PP DB 1,2,3;变量;变量PPAD1:MOV AX,BX;标号;标号AD1、AD2AD2:MOV BX,CXONE DW PP;将变量;将变量PP的偏移地址值赋给的偏移地址值赋给 ;字变量;字变量
21、ONE TWO DW AD1;将标号;将标号AD1的偏移地址值赋的偏移地址值赋 ;给字变量给字变量TWOTHREE DD AD2;将标号;将标号AD2的偏移地址值的偏移地址值 和段地址值赋给双字变量和段地址值赋给双字变量THREE假设变量的假设变量的PP的偏移地址为的偏移地址为1000H,标号,标号AD1的偏移地址为的偏移地址为2000H,标号,标号AD2的偏移地址为的偏移地址为3000H,段地址为,段地址为4000H。二、表达式赋值语句二、表达式赋值语句 表达式赋值语句有两种,赋值语句表达式赋值语句有两种,赋值语句EQU和等号语句和等号语句=,它们均不占用内存。,它们均不占用内存。1.赋值语
22、句赋值语句EQU格式:符号名格式:符号名 EQU 表达式表达式功能:用来给变量、标号、常数、指令、表功能:用来给变量、标号、常数、指令、表达式等定义一个符号名,程序中用到达式等定义一个符号名,程序中用到EQU左左边的变量、标号时可用右边的常数值或表达边的变量、标号时可用右边的常数值或表达式代替,但一经定义在同一个程序模块中就式代替,但一经定义在同一个程序模块中就不能重新定义。不能重新定义。例例4-27 COUNT EQU 100 DATA EQU COUNT+2 A1 EQU BX+SI B1 EQU OFFSET A1 C1 EQU ADD如果有以下指令,则代表:如果有以下指令,则代表:MO
23、V AX,COUNT MOV AX,100MOV BX,DATA MOV BX,102MOV AL,A1 MOV AL,BX+SIMOV AX,A1 MOV AX,BX+SIMOV BX,B1 MOV BX,OFFSET BX+SIC1 AX,BX ADD AX,BX 在在EQU语句右边表达式中有变量或标语句右边表达式中有变量或标号的表达式,必须先给它们定义,如号的表达式,必须先给它们定义,如DATA EQU COUNT+2必须先定义必须先定义COUNT,否则,否则汇编程序将指示出错。汇编程序将指示出错。PURGE语句可以解除对某一个标号的语句可以解除对某一个标号的赋值,使它在后面可以重新定义
24、。赋值,使它在后面可以重新定义。PURGE C1 ;C1不再代替不再代替ADD2.等号语句等号语句=等号语句等号语句=与与EQU语句具有相同功能,语句具有相同功能,区别在于区别在于EQU中左边的标号不允许重新定义,中左边的标号不允许重新定义,而用而用=定义的语句允许重新定义。定义的语句允许重新定义。例例4-28 COUNT=100COUNT=COUNT+10A1=BX+SIMOV AX,A1B1=ADDA1=BX MOV CX,A1三、段定义语句三、段定义语句 前面讲过,存储器的物理地址由段地址前面讲过,存储器的物理地址由段地址和偏移地址组合而成,任何一个逻辑段,无和偏移地址组合而成,任何一个
25、逻辑段,无论是代码段,数据段,堆栈段,附加段,都论是代码段,数据段,堆栈段,附加段,都必须进行段定义,以便连接程序把不同段和必须进行段定义,以便连接程序把不同段和模块连成一个可执行程序。此外还必须明确模块连成一个可执行程序。此外还必须明确段和段寄存器之间的关系,这可使用段分配段和段寄存器之间的关系,这可使用段分配语句来完成。语句来完成。1.段定义语句段定义语句 SEGMENT ENDS格式:格式:段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 分分类名类名 段名段名 ENDS功能:将一个逻辑段定义成一个整体。功能:将一个逻辑段定义成一个整体。段名段名 SEGMENT 定位类型定位
26、类型 组合类型组合类型 分类名分类名 段名段名 ENDS段名段名是逻辑段的标识符,不可省略,它确是逻辑段的标识符,不可省略,它确定了逻辑段在存储器中的地址,定了逻辑段在存储器中的地址,SEGMENT和和ENDS前的段名必须相同。前的段名必须相同。SEGMENT ENDS是段定义的伪指令助是段定义的伪指令助记符。任何一个逻辑段必须以记符。任何一个逻辑段必须以SEGMENT开始,开始,ENDS结束,不可省略,并且必须成对出现,两结束,不可省略,并且必须成对出现,两者之间是本逻辑段的内容。者之间是本逻辑段的内容。SEGMENT后面可以带三个参数:定位类型、后面可以带三个参数:定位类型、组合类型、组合
27、类型、分类名分类名,三个参数必须按格式中规,三个参数必须按格式中规定的次序排列,分类名必须用单引号定的次序排列,分类名必须用单引号 括起来。括起来。三个参数用来增加类型及属性说明,三个参数用来增加类型及属性说明,一般情况下可以省略,如果需要用连接程序把一般情况下可以省略,如果需要用连接程序把本程序与其它程序相连时,需要用到这些参数。本程序与其它程序相连时,需要用到这些参数。(1)定位类型)定位类型定位类型参数是对该段起始地址定位。通定位类型参数是对该段起始地址定位。通常段名确定了该段的首地址,整个逻辑段存放常段名确定了该段的首地址,整个逻辑段存放在首地址开始的一片连续存储单元中。一般情在首地址
28、开始的一片连续存储单元中。一般情况下各个逻辑段的首地址在况下各个逻辑段的首地址在节节的整数边界上的整数边界上(MASM把把1M字节的存储空间从字节的存储空间从0开始,每开始,每16个存储单元叫一节),即每个逻辑段的起始地个存储单元叫一节),即每个逻辑段的起始地址是址是16的整数倍(末的整数倍(末4位为位为0)。)。(1)定位类型)定位类型 实际使用时,可由定位类型参数来定位各实际使用时,可由定位类型参数来定位各逻辑段的首地址。定位类型参数主要有下面逻辑段的首地址。定位类型参数主要有下面4种:种:PARA指定定位段的起始地址必须在指定定位段的起始地址必须在节的整数边界,当定位类型参数缺省时,就节
29、的整数边界,当定位类型参数缺省时,就当成当成PARA。BYTE指定该段起始地址定位在存储指定该段起始地址定位在存储单元的任何字节地址。单元的任何字节地址。WORD指定该段起始地址定位在字的指定该段起始地址定位在字的边界,即段的首地址必须是偶数。边界,即段的首地址必须是偶数。PAGE指定该段起始地址定位在页的指定该段起始地址定位在页的边界,即段的首地址必须是边界,即段的首地址必须是256的整数倍。的整数倍。(2)组合类型)组合类型 组合类型参数主要提出了各个逻辑段之组合类型参数主要提出了各个逻辑段之间的组合方式,例各段独立、各段覆盖或顺间的组合方式,例各段独立、各段覆盖或顺序组合等。主要参数有以
30、下序组合等。主要参数有以下6种:种:NONE该段与其他同名段不进行连接,该段与其他同名段不进行连接,各段独立存在于存储器中,各段独立存在于存储器中,NONE可作为缺可作为缺省参数。省参数。PUBLIC该段与其它模块中的同名段该段与其它模块中的同名段连接时,由低地址到高地址连接起来,组成连接时,由低地址到高地址连接起来,组成一个逻辑段,连接次序由连接命令指定,连一个逻辑段,连接次序由连接命令指定,连接时满足定位类型要求。接时满足定位类型要求。COMMON该段在连接时与其它模块该段在连接时与其它模块中的同名有相同的起始地址,采用覆盖的方中的同名有相同的起始地址,采用覆盖的方式在存储器中存放,连接长
31、度为各分段中最式在存储器中存放,连接长度为各分段中最大长度。大长度。AT 表达式表达式定位该段的起始地址在表定位该段的起始地址在表达式所指定的节边界上,一般情况下各个逻达式所指定的节边界上,一般情况下各个逻辑段在存储器中的位置由系统自动分配,当辑段在存储器中的位置由系统自动分配,当用户要求某个逻辑段在指定节的边界上时,用户要求某个逻辑段在指定节的边界上时,就要用到就要用到AT参数来实现,参数来实现,AT不能用来指定不能用来指定代码段。代码段。STACK指定该段为堆栈段,此参数在指定该段为堆栈段,此参数在堆栈段中不可省略,多个模块只需设置一个堆栈段中不可省略,多个模块只需设置一个堆栈段,各个模块
32、中的堆栈段采用覆盖方式堆栈段,各个模块中的堆栈段采用覆盖方式组合,容量为各个模块中所设置的最大堆栈组合,容量为各个模块中所设置的最大堆栈段容量。段容量。MEMORY定位该段与其它模块中的定位该段与其它模块中的同名段有相同的首地址,采用覆盖方式在存同名段有相同的首地址,采用覆盖方式在存储器中组合连接,其功能与储器中组合连接,其功能与COMMON参数参数类似,区别是第一个带类似,区别是第一个带MEMORY参数逻辑参数逻辑段覆盖在其它同名段的最上层,其它带此参段覆盖在其它同名段的最上层,其它带此参数的同名段按照数的同名段按照COMMON方式处理。方式处理。(3)分类名分类名段定义语句的第三个参数为分
33、类名,必段定义语句的第三个参数为分类名,必须用单引号须用单引号 括起来,分类名可选择不超过括起来,分类名可选择不超过40个字符的名称,主要作用是汇编程序连接个字符的名称,主要作用是汇编程序连接时将所有分类名相同的逻辑段组成一个段组。时将所有分类名相同的逻辑段组成一个段组。2.段分配语句段分配语句ASSUME 在在8086系统中存储器采用分段结构,各系统中存储器采用分段结构,各段容量段容量64K字节,用户可以设置多个逻辑段,字节,用户可以设置多个逻辑段,但只允许但只允许4个逻辑段同时有效,段分配语句个逻辑段同时有效,段分配语句用来完成将逻辑段分别定义成代码段、堆栈用来完成将逻辑段分别定义成代码段
34、、堆栈段、数据段和附加段。段、数据段和附加段。ASSUME为伪指令助记符,放在代为伪指令助记符,放在代码段的开始,不可省略。提供给汇编程序,码段的开始,不可省略。提供给汇编程序,说明当前代码段,数据段,堆栈段和附加段说明当前代码段,数据段,堆栈段和附加段4个如何定义。个如何定义。2.段分配语句段分配语句ASSUME格式:格式:ASSUME CS:段名,:段名,DS:段名,:段名,SS:段名,:段名,ES:段名:段名ASSUME为伪指令助记符,放在代为伪指令助记符,放在代码段的开始,不可省略。提供给汇编程序,码段的开始,不可省略。提供给汇编程序,说明当前代码段,数据段,堆栈段和附加段说明当前代码
35、段,数据段,堆栈段和附加段4个如何定义。个如何定义。ASSUME后面有各段寄存器的名后面有各段寄存器的名CS:,:,DS:,:,SS:,:,ES:,用来存放当前有效的:,用来存放当前有效的逻辑段的段地址,后面紧跟冒号逻辑段的段地址,后面紧跟冒号:及段名。及段名。各段寄存器之间用逗号各段寄存器之间用逗号,分开,段名必须分开,段名必须是用段定义语句是用段定义语句SEGMENT ENDS定义过的定义过的名字。可以用名字。可以用ASSUME NOTHING取消前取消前面由面由ASSUME所指定的段寄存器。所指定的段寄存器。如:如:ASSUME ES:NOTHING4个逻辑段不一定全部要定义,通常代码个
36、逻辑段不一定全部要定义,通常代码段和数据段是必须的,附加段可以省略。但段和数据段是必须的,附加段可以省略。但当代码段中使用了串指令,必须设置附加段当代码段中使用了串指令,必须设置附加段作目标串基址用,附加段也可用来存放数据,作目标串基址用,附加段也可用来存放数据,增大数据段容量。增大数据段容量。由于由于ASSUME伪指令只指定某个段分配伪指令只指定某个段分配给哪个寄存器,并将代码段的段地址自动装给哪个寄存器,并将代码段的段地址自动装入入CS寄存器中而不能把其他段地址装入相应寄存器中而不能把其他段地址装入相应的段寄存器中,所以在代码段的开始要有一的段寄存器中,所以在代码段的开始要有一段初始化程序
37、完成这一工作。对于堆栈段来段初始化程序完成这一工作。对于堆栈段来说,除了将段地址装入说,除了将段地址装入SS寄存器外,还要将寄存器外,还要将栈顶偏移地址装入堆栈指针寄存器栈顶偏移地址装入堆栈指针寄存器SP中。中。例例4-29通过表转换指令来实现将通过表转换指令来实现将57的的7段显示段显示段码送到段码送到BX寄存器中。寄存器中。D1DATA SEGMENT ;数据段;数据段 TABLE DB 40H,79H,24H,30H,19H DB 12H,02H,78H,00H,18HD1DATA ENDSC1CODE SEGMENT;代码段;代码段 ASSUME CS:C1CODE,DS:D1DATA
38、START:MOV AX,D1DATA;将数据段地址;将数据段地址DSMOV DS,AXMOV AL,5MOV BX,OFFSET TABLEXLAT TABLEMOV AH,ALMOV AL,7 (MOV BX,OFFSET TABLE)XLAT TABLEMOV BX,AXC1CODE ENDS END START四、过程定义语句四、过程定义语句 过程也称子程序。在主程序中,经常要过程也称子程序。在主程序中,经常要用到一些程序段,程序段的功能和结构相同,用到一些程序段,程序段的功能和结构相同,仅有一些变量赋值不同,此时可以将这些程仅有一些变量赋值不同,此时可以将这些程序段独立编写用过程定义
39、语句进行定义,然序段独立编写用过程定义语句进行定义,然后在主程序中对它进行过程调用。这样既节后在主程序中对它进行过程调用。这样既节省了内存空间,也便于进行模块化程序设计,省了内存空间,也便于进行模块化程序设计,使编程清晰,使用灵活。使编程清晰,使用灵活。格式:格式:过程名过程名 PROC 属性属性;过程内容;过程内容RET N 过程名过程名 ENDP 四、过程定义语句四、过程定义语句功能功能:定义一个过程,主程序可以用:定义一个过程,主程序可以用CALL指令调用它。指令调用它。过程名过程名是给所定义的过程取的名字,不是给所定义的过程取的名字,不可缺省。它是主程序调用指令的目的操作数,可缺省。它
40、是主程序调用指令的目的操作数,即子程序入口的符号地址。像标号一样过程即子程序入口的符号地址。像标号一样过程名具有三种属性:名具有三种属性:段属性:为该过程所在段的段地址。段属性:为该过程所在段的段地址。偏移地址属性:指该过程第一个字节与段偏移地址属性:指该过程第一个字节与段首址之间距离字节。首址之间距离字节。距离属性:为距离属性:为NEAR或或FAR。格式中的属。格式中的属性就是指距离属性,定义性就是指距离属性,定义NEAR允许过程在允许过程在段内调用,定义段内调用,定义FAR允许过程在段间调用,允许过程在段间调用,NEAR为缺省使用。为缺省使用。PROC ENDP过程定义伪指令助记符,过程定
41、义伪指令助记符,成对出现,不可缺省。二者前面有相同的过成对出现,不可缺省。二者前面有相同的过程名,整个过程,整个过程内容包括在程名,整个过程,整个过程内容包括在PROC ENDP之内。之内。RET N为过程内部的返回指令。过程为过程内部的返回指令。过程内部至少有一条内部至少有一条RET指令,它可以在过程的指令,它可以在过程的任何位置上,使过程返回到主程序调用它的任何位置上,使过程返回到主程序调用它的CALL指令之下一条指令。指令之下一条指令。RET NRET后面的后面的N为弹出值,可以为弹出值,可以缺省,缺省,N表示从过程返回后,堆栈中应有表示从过程返回后,堆栈中应有N个字节的值作废,个字节的
42、值作废,N必须为正偶数。过程内必须为正偶数。过程内部可以有多个部可以有多个RET,表示此过程具有多个返,表示此过程具有多个返回出口。回出口。在汇编语言源程序中,使用在汇编语言源程序中,使用CALL指令指令调用过程,过程调用允许嵌套和递归调用。调用过程,过程调用允许嵌套和递归调用。嵌套调用指在一个被调用的过程中,又调用嵌套调用指在一个被调用的过程中,又调用另一个过程;递归调用是指在一个被调用的另一个过程;递归调用是指在一个被调用的过程中,又调用了本身的过程。嵌套与递归过程中,又调用了本身的过程。嵌套与递归的深度由堆栈段的容量决定因为过程调用时的深度由堆栈段的容量决定因为过程调用时必须将当前的地址
43、压入堆栈保护起来,使调必须将当前的地址压入堆栈保护起来,使调用返回时能返回到正确的返回地址。另外在用返回时能返回到正确的返回地址。另外在子程序入口也有许多参数要保护,以免影响子程序入口也有许多参数要保护,以免影响主程序原来的运行状态。主程序原来的运行状态。例例4-30 近过程定义及调用格式近过程定义及调用格式CCODE SEGMENT ABC PROC NEAR RETABC ENDP CALL ABC CCODE ENDS例例4-31 远过程定义及调用格式远过程定义及调用格式C1CODE SEGMENT KKK PROC FAR RETKKK ENDP C1CODE ENDSC2CODE S
44、EGMENT CALL KKK C2CODE ENDS例例4-32 过程嵌套调用格式过程嵌套调用格式CCODE SEGMENT KKK PROC NEAR CALL LLL RETKKK ENDP LLL PROC NEAR RETLLL ENDPCCODE ENDS五、程序开始和结束语句五、程序开始和结束语句1.NAME格式:格式:NAME 程序名程序名功能:为源程序目标模块赋名字。功能:为源程序目标模块赋名字。2.TITLE格式:格式:TITLE 文本名文本名功能:将文本名赋给源程序目标模块作名字。功能:将文本名赋给源程序目标模块作名字。3.ORG格式:格式:ORG 表达式表达式功能功能:
45、给汇编程序设置位置指针,指定下面:给汇编程序设置位置指针,指定下面语句的起始偏移地址。语句的起始偏移地址。ORG是伪指令助记符,不可缺省。是伪指令助记符,不可缺省。表达式表达式给定的偏移地址值,表达式的计给定的偏移地址值,表达式的计算结果必须是正整数。一般情况下,段定义算结果必须是正整数。一般情况下,段定义语句语句SEGMENT指出了段的起点,偏移地址指出了段的起点,偏移地址为为0,段内各个语句或数据的地址由段地址开,段内各个语句或数据的地址由段地址开始依次类推可确定。当用户要求某条指令或始依次类推可确定。当用户要求某条指令或数据为某个指定地址时,可用数据为某个指定地址时,可用ORG语句来改语
46、句来改变,变,ORG语句可以放在程序的任何位置。语句可以放在程序的任何位置。例例4-33 用用ORG指定代码段起始地址指定代码段起始地址CODE SEGMENTORG 100H ASSUME CS:CODE,DS:DATA START:;此代码段起始偏移地址为;此代码段起始偏移地址为100HMOV AX,DATA CODE ENDS例例4-34 用用ORG改变数据段起始地址改变数据段起始地址DATA SEGMENTORG 100H A1 DB 1,2,3;A1偏移地址为偏移地址为100HORG 200HA2 DW 7,8,9;A2 偏移地址为偏移地址为200HDATA ENDS4.END格式:
47、格式:END 标号名标号名功能:标记汇编源程序结束功能:标记汇编源程序结束END是伪指令助记符,不可缺省,放在是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个源程序的最后一行,每个模块只有一个END。汇编程序到汇编程序到END语句停止汇编。语句停止汇编。标号名标号名是该程序中第一条可执行语句的是该程序中第一条可执行语句的标号名,可以缺省,若一个程序包含多个模标号名,可以缺省,若一个程序包含多个模块,块,END后面带的标号为主程序模块中的标后面带的标号为主程序模块中的标号名称。号名称。例例4-35CODE SEGMENTASSUME CS:CODE,DS:DATA START:C
48、ODE ENDSEND START六、结构定义语句六、结构定义语句七、外部伪指令及对准伪指令七、外部伪指令及对准伪指令1.外部伪指令外部伪指令 程序中包含多个模块时,有些程序或数程序中包含多个模块时,有些程序或数据在各个模块间要相互共享,可用外部伪指据在各个模块间要相互共享,可用外部伪指令令PUBLIC和和EXTRN来实现此功能。其中来实现此功能。其中PUBLIC用来定义共享模块,用来定义共享模块,EXTRN用来用来引用共享模块。引用共享模块。格式格式:PUBLIC 名称,名称,名称,名称,EXTRN 名称:类型,名称:类型,名称:类型,名称:类型,PUBLIC伪指令助记符,不可缺省。伪指令助
49、记符,不可缺省。名称名称本语句的操作数,它是本模块中已本语句的操作数,它是本模块中已经定义过的变量、标号或常数,可供其它模经定义过的变量、标号或常数,可供其它模块共享。块共享。EXTRN伪指令助记符,不可缺省。伪指令助记符,不可缺省。名称名称其它模块中用其它模块中用PUBLIC语句定义过语句定义过的变量、标号或常数,供本模块引用,不可的变量、标号或常数,供本模块引用,不可缺省。名称后面紧跟冒号缺省。名称后面紧跟冒号:。类型属性类型属性是指该名称应具有的属性,若是指该名称应具有的属性,若所定义的名称是变量,则类型为所定义的名称是变量,则类型为BYTE或或WORD;若名称是标号,则类型为;若名称是
50、标号,则类型为NEAR或或FAR;若名称是常数,则类型为;若名称是常数,则类型为ABS。类型。类型属性应与在其它模块中被定义时的属性相同。属性应与在其它模块中被定义时的属性相同。EXTRN语句的引用,必须与已用语句的引用,必须与已用PUBLIC语句定义过的名称相呼应。语句定义过的名称相呼应。例例4-42DATA SEGMENTA1 DB 10H,20HA2 DW 4 DUP(0)A3 EQU 1000HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA TMF LABEL FAR PUBLIC A2,A3,TMF CODE