




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 宏汇编言语程序设计宏汇编言语程序设计 汇编言语是利用指令的助记符、符号地址、汇编言语是利用指令的助记符、符号地址、标号来编写的言语,它是机器言语的符号表示,标号来编写的言语,它是机器言语的符号表示,是较低级的言语。是较低级的言语。 利用汇编言语编写的程序称为汇编言语源程利用汇编言语编写的程序称为汇编言语源程序,上一章讲到的指令系统中的每条指令都是构序,上一章讲到的指令系统中的每条指令都是构成源程序的根本语句。但机器不能识别源程序,成源程序的根本语句。但机器不能识别源程序,要经过汇编程序翻译成二进制代码的浮动目的程要经过汇编程序翻译成二进制代码的浮动目的程序,然后由衔接程序将目的文
2、件与库文件相连,序,然后由衔接程序将目的文件与库文件相连,最后得到可执行的程序,才可在机器上直接运转。最后得到可执行的程序,才可在机器上直接运转。根本概念:根本概念:汇编言语:用指令的助记符、符号地址、标号汇编言语:用指令的助记符、符号地址、标号 等来编写的言语。等来编写的言语。汇编言语源程序:用汇编言语编写的程序汇编言语源程序:用汇编言语编写的程序*.asm) 有两种语句格式:有两种语句格式:指令性语句:汇编时翻译成目的代码机器码,指令性语句:汇编时翻译成目的代码机器码,占代码段空间。占代码段空间。指示性语句伪指令:汇编时,不产生目的代指示性语句伪指令:汇编时,不产生目的代码,只是为汇编程序
3、提供信息,不占代码段空间。码,只是为汇编程序提供信息,不占代码段空间。汇编程序:将汇编言语源程序翻译成目的目的程汇编程序:将汇编言语源程序翻译成目的目的程序代码,这个翻译过程称为汇编,翻译软件就序代码,这个翻译过程称为汇编,翻译软件就叫汇编程序。叫汇编程序。用用户户编编辑辑* *. .a as sm m生生成成生生成成生生成成通通过过通通过过汇汇编编程程序序* *. .o ob bj j连连接接程程序序* *. .E EX XE E汇编过程汇编过程 一个完好的汇编言语的语句由以下几部分组成:一个完好的汇编言语的语句由以下几部分组成:标号和变量、指令助记符、界符、常数和注释,一标号和变量、指令助
4、记符、界符、常数和注释,一切这些都称为标志。切这些都称为标志。4-1 汇编言语的标志汇编言语的标志一、标号和变量一、标号和变量 表示指令性语句的符号地址或表示一个数据单表示指令性语句的符号地址或表示一个数据单元的符号地址。元的符号地址。 对标号或变量要留意以下几点:对标号或变量要留意以下几点: 标号或变量可以由数字、字母、下划线或其它特标号或变量可以由数字、字母、下划线或其它特殊字符组成。殊字符组成。标号或变量不能以数字开头,但可出如今标号的标号或变量不能以数字开头,但可出如今标号的其它地方。其它地方。标号或变量最大长度不能超越标号或变量最大长度不能超越31个字符。个字符。例、例、 START
5、:MOV AX,0;标号;标号 NEW DB GOOD;变量;变量 二、指令助记符二、指令助记符指出指令的性质功能指出指令的性质功能三、界符三、界符作为一个程序中或一条指令中两个部分的分作为一个程序中或一条指令中两个部分的分隔符号用。隔符号用。例、例、 MOV AX,BX ADD AL,CL例、例、 MOV AX,BXNEW DB 12H,23H,34HXY DB COMPUTERMOV AX,5/3可用的界符有:,;可用的界符有:,; + - * / : = ( ) $ & ? . 四、常数四、常数二进制:二进制:01001101B十进制:十进制:2000或或2000D八进制:八进制
6、:1700Q十六进制:十六进制:1200H,0FFH串常数:串常数:ABCD 五、注释五、注释 用;开头后面的内容可随意,用来添加程序可用;开头后面的内容可随意,用来添加程序可读性的。读性的。 表达式由运算对象和运算符组成,在汇编时由表达式由运算对象和运算符组成,在汇编时由汇编程序对它进展运算,运算结果作为一个语句中汇编程序对它进展运算,运算结果作为一个语句中的操作数来运用。的操作数来运用。4-2 汇编言语中的表达式汇编言语中的表达式运算对象:常数、标号或变量运算对象:常数、标号或变量算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符运算符:运算符: 数值前往运算符数值前往运算符修正
7、属性运算符修正属性运算符其它运算符其它运算符一、算术运算符一、算术运算符 有:有:+、-、*、/、MOD模,即取除法运算结模,即取除法运算结果之余数、果之余数、SHL左移,左移左移,左移1位相当于乘位相当于乘2、SHR右移,右移右移,右移1位相当于除以位相当于除以2。 一切的算术运算符均可以对数据进展运算,运一切的算术运算符均可以对数据进展运算,运算对象与运算结果都是整数。假设对地址运算,通算对象与运算结果都是整数。假设对地址运算,通常是在标号上加常是在标号上加/减某一个值,例减某一个值,例DA1+2、K2-4各表各表示一个存储单元的地址,对地址乘是没有意义的。示一个存储单元的地址,对地址乘是
8、没有意义的。例例4-2 数组数组ARRAY的定义如下:的定义如下:ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 指令为:指令为:MOV AX,30*5MOV CX,TRY-ARRAY;数组长度;数组长度CX 两变量偏移地址之差两变量偏移地址之差 汇编时,计算表达式构成指令为:汇编时,计算表达式构成指令为:MOV AX,150MOV CX,8例例4-3 源程序指令格式如下:源程序指令格式如下:DA EQU 300MOV AX,DA-80MOV BX,DA MOD 100MOV CX,DA/100MOV DH,01100100B SHR 2汇编成:汇编成:MOV AX,24
9、0汇编成:汇编成:MOV BX,0汇编成:汇编成:MOV CX,3汇编成:汇编成:MOV DH,00011001B二、逻辑运算符二、逻辑运算符有:有:AND与、与、OR或、或、NOT非、非、XOR异或,逻辑运算符是按位运算的,只异或,逻辑运算符是按位运算的,只能对常数进展运算,得到结果也是常数。能对常数进展运算,得到结果也是常数。例例4-4 MOV AL,NOT 0FFHMOV BL,8CH AND 73HMOV AH,8CH OR 73HMOV CH,8CH XOR 73H汇编成:汇编成:MOV BL,0汇编成:汇编成:MOV AL,0汇编成:汇编成:MOV AH,0FFH汇编成:汇编成:M
10、OV CH,0FFH例例4-5 IN AL,PORT AND DX,PORT AND 0FEH OUT DX,AX前一个前一个AND是指令助记符,而后一个是指令助记符,而后一个AND是是逻辑运算符。逻辑运算符。逻辑运算符与逻辑运算符与8086指令系统中的指令助记指令系统中的指令助记符符AND、OR、XOR、NOT符号完全一样,符号完全一样,但两者是不会混淆的。作为但两者是不会混淆的。作为MASM的运算符的运算符是在汇编过程中进展计算的,而指令助记符是在汇编过程中进展计算的,而指令助记符是在程序执行时进展运算的。是在程序执行时进展运算的。三、关系运算符三、关系运算符 有:有:EQ相等、相等、NE
11、不等、不等、LT小于、小于、GT大于,大于,LE小于或等于、小于或等于、GE大于或等于。大于或等于。 关系运算符的两个操作数必需是数据,关系运算符的两个操作数必需是数据,或是同一段内的两个存储单元的地址。进展或是同一段内的两个存储单元的地址。进展关系运算的比较操作后,结果是一个数值,关系运算的比较操作后,结果是一个数值,假设结果为真,输出全假设结果为真,输出全1,即,即FFH8位或位或FFFFH16位。假设结果为假,输出全位。假设结果为假,输出全0。例例4-6 MOV AX,10H GT 16 MOV BL,6 EQ 0110B MOV CX, 12H GE 12由于表达式由于表达式10H G
12、T 16为假所以汇编成:为假所以汇编成: MOVAX,0由于表达式由于表达式6 EQ 0110B为真所以汇编成:为真所以汇编成: MOVBL,0FFH留意:留意: MOV BL,1 由于表达式由于表达式12H GE 12 为真所以汇编成:为真所以汇编成: MOVCX,0FFFFH留意:留意: MOV CX,1 四、数值前往运算符四、数值前往运算符数值前往运算符也经常称作分析运算符数值前往运算符也经常称作分析运算符有:有:OFFSET、SEG、TYPE、LENGTH、SIZE 5种,它们加在变量或标号前,前往运种,它们加在变量或标号前,前往运算对象的某个参数值,例如偏移地址值、段算对象的某个参数
13、值,例如偏移地址值、段地址值、类型属性、变量包含的单元数等。地址值、类型属性、变量包含的单元数等。1.OFFSET格式:格式:OFFSET 变量或标号变量或标号OFFSET 前往标号或变量的偏移地址值。前往标号或变量的偏移地址值。例例4-7 DDD:MOV AX,BX;标号;标号 MOV BX,OFFSET DDD ARRAY DB 1,2,3,4;变量;变量 MOV BX,OFFSET ARRAY LEA BX,ARRAY2.SEG格式:格式:SEG 变量或标号变量或标号SEG 前往标号或变量的段地址值。前往标号或变量的段地址值。例例4-8 DDD:MOV AX,BX;标号;标号 MOV A
14、X,SEG DDD MOV CS,AXARRAY DB 1,2,3,4;变量;变量 MOV AX,SEG ARRAY MOV DS,AX3.TYPE格式:格式:TYPE 变量或标号变量或标号TYPE加在变量前,前往变量的类型属性。加在变量前,前往变量的类型属性。类型类型返回返回DB1 1DW2 2DD4 4DQ8 8DT1010NEARFFH或FFFFH(-1)FFH或FFFFH(-1)FARFEH或或FFFEH(-2)变量变量标号标号TYPE加在标号前,前往标号的间隔属性。加在标号前,前往标号的间隔属性。类型类型返回返回DB1 1DW2 2DD4 4DQ8 8DT1010NEARFFH或FF
15、FFH(-1)FFH或FFFFH(-1)FARFEH或或FFFEH(-2)变量变量标号标号例例4-9 A1 DB 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 变量变量当变量
16、中运用当变量中运用DUP时,时,LENGTH前往此变前往此变量所包含的单元数,对其它变量那么前往量所包含的单元数,对其它变量那么前往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加在变量前,前往该变量包含的总字加在变量前,前往该变量包含的总字节数,
17、留意不能简单去数有多少个字节,而节数,留意不能简单去数有多少个字节,而是利用公式是利用公式SIZE=LENGTHTYPE来计算。来计算。例例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 五、修正属性运算符五、修正属性运算符修正属性运算符也经常称作综合运算符修正属性运算符也经常称作综合运算符有:段操作符、有:段操作
18、符、PTR、THIS、HIGH、LOW、SHORT 6种,可以在程序运转过程中,通种,可以在程序运转过程中,通过修正属性运算符来修正变量或标号的属性,过修正属性运算符来修正变量或标号的属性,包含段属性、偏移地址属性、类型属性等。包含段属性、偏移地址属性、类型属性等。1.段操作符段操作符格式:格式: 段前缀:变量或地址表达式段前缀:变量或地址表达式段前缀有段存放器段前缀有段存放器CS、DS,ES,SS后跟冒号后跟冒号:,用来表示某个变量或地址被修正到哪个,用来表示某个变量或地址被修正到哪个段存放器提供的段地址。段存放器提供的段地址。例例4-12 MOV AX,BX ;DS:BXAX MOV AX
19、,ES:BX ;ES:BXAX2.PTR格式:格式: 类型类型/间隔:间隔:PTR 变量或标号变量或标号功能:是将功能:是将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 PTR
20、BX,12HMOV BX,ALMOV BX,AX这两条指令正确与否?这两条指令正确与否?JMP FAR PTR LO;修正标号的间隔属性;修正标号的间隔属性JMP NEAR PTR LO3.THIS格式:变量或标号格式:变量或标号 EQU THIS 类型或间隔类型或间隔功能:将类型或间隔属性赋给变量或标号,功能:将类型或间隔属性赋给变量或标号,该变量或标号的段地址和偏移地址与下一个该变量或标号的段地址和偏移地址与下一个存储单元的地址一样。存储单元的地址一样。例例4-15 FIRST EQU THIS BYTE TABLE DW 200 DUP?FIRST的偏移地址值与的偏移地址值与TABLE的
21、偏移地址值的偏移地址值一样,区别在于一样,区别在于FIRST变量为字节类型,而变量为字节类型,而TABLE为字类型。为字类型。例例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用来阐明转移类指令中转向地址的用来阐明转移类指令中转向地址的属性,指出转向的目的地址与本指令之间的属性,指出转向的
22、目的地址与本指令之间的间隔在间隔在-128+127之间,即限制在短转移范之间,即限制在短转移范围内。围内。例例4-17JMP SHORT L2L2: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 汇编成:汇编
23、成: MOVBL,78H 六、其它运算符六、其它运算符有:有: 、.、MASK和和WIDTH等等七、优先级七、优先级表达式是常数、变量、标号和运算符的表达式是常数、变量、标号和运算符的组合,在计算表达式时,应按优先级高低进组合,在计算表达式时,应按优先级高低进行计算,同时遵照同级运算从左到右的原那么行计算,同时遵照同级运算从左到右的原那么计算。计算。4-3 伪指令语句伪指令语句 伪指令语句没有对应的机器代码,并不伪指令语句没有对应的机器代码,并不像指令语句那样由像指令语句那样由CPU来执行,它是来执行,它是MASM汇编程序对源程序汇编期间进展处置的。主汇编程序对源程序汇编期间进展处置的。主要完
24、成变量定义、存储器分配、指示程序开要完成变量定义、存储器分配、指示程序开始和终了、段定义、段分配等。伪指令有以始和终了、段定义、段分配等。伪指令有以下几种类型:下几种类型:数据定义语句数据定义语句DB、DW、DD等等标号赋值语句标号赋值语句EQU、=段定义语句段定义语句SEGMENTENDS段分配语句段分配语句ASSUME过程定义语句过程定义语句PROCENDP程序开场终了语句程序开场终了语句ORG、END、NAME一、数据定义语句一、数据定义语句格式格式1:变量名:变量名 助记符助记符 操作数,操作数操作数,操作数格式格式2:变量名:变量名 助记符助记符 n DUP操作数,操作数操作数,操作
25、数A1 DB 1,2,3A3 DB 5 DUP1,2功能:将操作数存入变量名指定的存储单元功能:将操作数存入变量名指定的存储单元中,或者只分配存储空间不存入数据。中,或者只分配存储空间不存入数据。变量名变量名它用符号表示,可以省略,作用它用符号表示,可以省略,作用与指令语句中的标号一样,但后面不跟冒号与指令语句中的标号一样,但后面不跟冒号:。汇编程序汇编时将此变量的助记符后。汇编程序汇编时将此变量的助记符后的第一个字节的偏移地址作为它的符号地址。的第一个字节的偏移地址作为它的符号地址。助记符助记符主要有:主要有:DB:用来定义字节,表示每个操作数占一个字节:用来定义字节,表示每个操作数占一个字
26、节DW:用来定义字,表示每个操作数占一个字:用来定义字,表示每个操作数占一个字DD:用来定义双字,表示每个操作数占两个字:用来定义双字,表示每个操作数占两个字DQ:用来定义四个字,表示每个操作数四个字:用来定义四个字,表示每个操作数四个字DT:用来定义:用来定义10个字节,表示每个操作数个字节,表示每个操作数10个字节个字节操作数操作数操作数可以是常数、字符串、变操作数可以是常数、字符串、变量、标号、表达式等,多个操作数之间必需量、标号、表达式等,多个操作数之间必需用逗号用逗号,隔开。隔开。例例4-21 操作数是常数或表达式操作数是常数或表达式DA1 DB 10H,20HDA2 DW 1122
27、H,34HDA3 DD 5*10H,1234H101020201111222200003434DA1DA1DA2DA21122H1122H0034H0034H505000000000000012123434DA3DA300000050H00000050H0000000000001234H00001234H例例4-22 操作数是字符串操作数是字符串FIRST DB HELLOSECOND DW OKTHIRD DB OK留意:用留意:用DW定义字符定义字符串时,只允许包含两个串时,只允许包含两个字符,多于两个字符时,字符,多于两个字符时,只能用只能用DB来定义。来定义。48(H)48(H)45(
28、E)45(E)4C(L)4C(L)4C(L)4C(L)4B(K)4B(K)4F(O)4F(O)FIRSTFIRST4F(O)4F(O)SECONDSECONDTHIRDTHIRD4F(O)4F(O)4B(K)4B(K)例例4-23 操作数用?定义不确定值的变量,用操作数用?定义不确定值的变量,用作保管存储空间,以便存放运算结果。作保管存储空间,以便存放运算结果。M1 DB ?,?,?M2 DW 1234H,?,?M1M1M2M2? ? ? ? ?12123434例例4-24 操作数用操作数用DUP来定义反复变量来定义反复变量ONE DB 5 DUP0TWO DW 10 DUP?THREE DB
29、 3 DUP1,20000000000000000? ?0000ONEONE? ?TWOTWO? ? ?共10个字共10个字THREETHREE010102020101010102020202FOUR DB 2 DUP1,3 DUP10H;DUP 嵌套嵌套FOURFOUR01011010101001011010101010101010操作数是变量或标号:操作数是变量或标号: 用伪指令用伪指令DW和和DD可以将变量或标号的可以将变量或标号的偏移地址存入存储器中,当用偏移地址存入存储器中,当用DD来定义时,来定义时,原变量或标号的偏移地址存入低位字中,原原变量或标号的偏移地址存入低位字中,原变量或
30、标号的段地址存入高位字中。变量或标号的段地址存入高位字中。例例4-25 PP DB 1,2,3;变量;变量PPAD1:MOV AX,BX;标号;标号AD1、AD2AD2:MOV BX,CXONE DW PP;将变量;将变量PP的偏移地址值赋给的偏移地址值赋给 ;字变量;字变量ONE TWO DW AD1;将标号;将标号AD1的偏移地址值赋的偏移地址值赋 ; 给字变量给字变量TWOTHREE DD AD2;将标号;将标号AD2的偏移地址值的偏移地址值 和段地址值赋给双字变量和段地址值赋给双字变量THREE假设变量的假设变量的PP的偏移地址为的偏移地址为1000H,标号,标号AD1的偏移地址为的偏
31、移地址为2000H,标号,标号AD2的偏移地址为的偏移地址为3000H,段地址为,段地址为4000H。00001010000000002020303000004040ONEONETWOTWOTHREETHREEPP的偏移地址PP的偏移地址AD1的偏移地址AD1的偏移地址AD2的偏移地址AD2的偏移地址AD2的段地址AD2的段地址二、表达式赋值语句二、表达式赋值语句 表达式赋值语句有两种,赋值语句表达式赋值语句有两种,赋值语句EQU和等号语句和等号语句=,它们均不占用内存。,它们均不占用内存。1.赋值语句赋值语句EQU格式:符号名格式:符号名 EQU 表达式表达式功能:用来给变量、标号、常数、指
32、令、表功能:用来给变量、标号、常数、指令、表达式等定义一个符号名,程序中用到达式等定义一个符号名,程序中用到EQU左左边的变量、标号时可用右边的常数值或表达边的变量、标号时可用右边的常数值或表达式替代,但一经定义在同一个程序模块中就式替代,但一经定义在同一个程序模块中就不能重新定义。不能重新定义。例例4-27 COUNT EQU 100 DATA EQU COUNT+2 A1 EQU BX+SI B1 EQU OFFSET A1 C1 EQU ADD假设有以下指令,那么代表:假设有以下指令,那么代表:MOV AX,COUNT MOV AX,100MOV BX,DATA MOV BX,102MO
33、V 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语句可以解除对某一个标号的语句可以解除对某一个标号的赋值,使它在后面可以重新定义。赋值,使它在后面可以重新定义。PURGE C1 ;C1不再替代不再替代ADD2.等号
34、语句等号语句= 等号语句等号语句=与与EQU语句具有一样功能,语句具有一样功能,区别在于区别在于EQU中左边的标号不允许重新定义,中左边的标号不允许重新定义,而用而用=定义的语句允许重新定义。定义的语句允许重新定义。例例4-28 COUNT=100COUNT=COUNT+10A1=BX+SIMOV AX,A1B1=ADDA1=BX MOV CX,A1三、段定义语句三、段定义语句 前面讲过,存储器的物理地址由段地址前面讲过,存储器的物理地址由段地址和偏移地址组合而成,任何一个逻辑段,无和偏移地址组合而成,任何一个逻辑段,无论是代码段,数据段,堆栈段,附加段,都论是代码段,数据段,堆栈段,附加段,
35、都必需进展段定义,以便衔接程序把不同段和必需进展段定义,以便衔接程序把不同段和模块连成一个可执行程序。此外还必需明确模块连成一个可执行程序。此外还必需明确段和段存放器之间的关系,这可运用段分配段和段存放器之间的关系,这可运用段分配语句来完成。语句来完成。1.段定义语句段定义语句 SEGMENTENDS格式:格式:段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 分分类名类名 段名段名 ENDS功能:将一个逻辑段定义成一个整体。功能:将一个逻辑段定义成一个整体。段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 分类名分类名 段名段名 ENDS段名段名是逻辑段的标识符,不可
36、省略,它确是逻辑段的标识符,不可省略,它确定了逻辑段在存储器中的地址,定了逻辑段在存储器中的地址,SEGMENT和和ENDS前的段名必需一样。前的段名必需一样。SEGMENTENDS是段定义的伪指令助是段定义的伪指令助记符。任何一个逻辑段必需以记符。任何一个逻辑段必需以SEGMENT开场,开场,ENDS终了,不可省略,并且必需成对出现,终了,不可省略,并且必需成对出现,两者之间是本逻辑段的内容。两者之间是本逻辑段的内容。SEGMENT后面可以带三个参数:定位类型、后面可以带三个参数:定位类型、组合类型、组合类型、分类名分类名,三个参数必需按格式中规,三个参数必需按格式中规定的次序陈列,分类名必
37、需用单引号定的次序陈列,分类名必需用单引号 括起来。括起来。三个参数用来添加类型及属性阐明,三个参数用来添加类型及属性阐明,普通情况下可以省略,假设需求用衔接程序把普通情况下可以省略,假设需求用衔接程序把本程序与其它程序相连时,需求用到这些参数。本程序与其它程序相连时,需求用到这些参数。1定位类型定位类型定位类型参数是对该段起始地址定位。通定位类型参数是对该段起始地址定位。通常段名确定了该段的首地址,整个逻辑段存放常段名确定了该段的首地址,整个逻辑段存放在首地址开场的一片延续存储单元中。普通情在首地址开场的一片延续存储单元中。普通情况下各个逻辑段的首地址在况下各个逻辑段的首地址在节节的整数边境
38、上的整数边境上MASM把把1M字节的存储空间从字节的存储空间从0开场,每开场,每16个存储单元叫一节,即每个逻辑段的起始地个存储单元叫一节,即每个逻辑段的起始地址是址是16的整数倍末的整数倍末4位为位为0。1定位类型定位类型 实践运用时,可由定位类型参数来定位各实践运用时,可由定位类型参数来定位各逻辑段的首地址。定位类型参数主要有下面逻辑段的首地址。定位类型参数主要有下面4种:种:PARA指定定位段的起始地址必需在指定定位段的起始地址必需在节的整数边境,当定位类型参数缺省时,就节的整数边境,当定位类型参数缺省时,就当成当成PARA。BYTE指定该段起始地址定位在存储指定该段起始地址定位在存储单
39、元的任何字节地址。单元的任何字节地址。WORD指定该段起始地址定位在字的指定该段起始地址定位在字的边境,即段的首地址必需是偶数。边境,即段的首地址必需是偶数。PAGE指定该段起始地址定位在页的指定该段起始地址定位在页的边境,即段的首地址必需是边境,即段的首地址必需是256的整数倍。的整数倍。2组合类型组合类型 组合类型参数主要提出了各个逻辑段之组合类型参数主要提出了各个逻辑段之间的组合方式,例各段独立、各段覆盖或顺间的组合方式,例各段独立、各段覆盖或顺序组合等。主要参数有以下序组合等。主要参数有以下6种:种:NONE该段与其他同名段不进展衔接,该段与其他同名段不进展衔接,各段独立存在于存储器中
40、,各段独立存在于存储器中,NONE可作为缺可作为缺省参数。省参数。PUBLIC该段与其它模块中的同名段该段与其它模块中的同名段衔接时,由低地址到高地址衔接起来,组成衔接时,由低地址到高地址衔接起来,组成一个逻辑段,衔接次序由衔接命令指定,衔一个逻辑段,衔接次序由衔接命令指定,衔接时满足定位类型要求。接时满足定位类型要求。COMMON该段在衔接时与其它模块该段在衔接时与其它模块中的同名有一样的起始地址,采用覆盖的方中的同名有一样的起始地址,采用覆盖的方式在存储器中存放,衔接长度为各分段中最式在存储器中存放,衔接长度为各分段中最大长度。大长度。AT 表达式表达式定位该段的起始地址在表定位该段的起始
41、地址在表达式所指定的节边境上,普通情况下各个逻达式所指定的节边境上,普通情况下各个逻辑段在存储器中的位置由系统自动分配,当辑段在存储器中的位置由系统自动分配,当用户要求某个逻辑段在指定节的边境上时,用户要求某个逻辑段在指定节的边境上时,就要用到就要用到AT参数来实现,参数来实现,AT不能用来指定不能用来指定代码段。代码段。STACK指定该段为堆栈段,此参数在指定该段为堆栈段,此参数在堆栈段中不可省略,多个模块只需设置一个堆栈段中不可省略,多个模块只需设置一个堆栈段,各个模块中的堆栈段采用覆盖方式堆栈段,各个模块中的堆栈段采用覆盖方式组合,容量为各个模块中所设置的最大堆栈组合,容量为各个模块中所
42、设置的最大堆栈段容量。段容量。MEMORY定位该段与其它模块中的定位该段与其它模块中的同名段有一样的首地址,采用覆盖方式在存同名段有一样的首地址,采用覆盖方式在存储器中组合衔接,其功能与储器中组合衔接,其功能与COMMON参数参数类似,区别是第一个带类似,区别是第一个带MEMORY参数逻辑参数逻辑段覆盖在其它同名段的最上层,其它带此参段覆盖在其它同名段的最上层,其它带此参数的同名段按照数的同名段按照COMMON方式处置。方式处置。3分类名分类名段定义语句的第三个参数为分类名,必段定义语句的第三个参数为分类名,必需用单引号需用单引号 括起来,分类名可选择不超越括起来,分类名可选择不超越40个字符
43、的称号,主要作用是汇编程序衔接个字符的称号,主要作用是汇编程序衔接时将一切分类名一样的逻辑段组成一个段组。时将一切分类名一样的逻辑段组成一个段组。2.段分配语句段分配语句ASSUME 在在8086系统中存储器采用分段构造,各系统中存储器采用分段构造,各段容量段容量64K字节,用户可以设置多个逻辑段,字节,用户可以设置多个逻辑段,但只允许但只允许4个逻辑段同时有效,段分配语句个逻辑段同时有效,段分配语句用来完成将逻辑段分别定义成代码段、堆栈用来完成将逻辑段分别定义成代码段、堆栈段、数据段和附加段。段、数据段和附加段。ASSUME为伪指令助记符,放在为伪指令助记符,放在代码段的开场,不可省略。提供
44、应汇编程序,代码段的开场,不可省略。提供应汇编程序,阐明当前代码段,数据段,堆栈段和附加段阐明当前代码段,数据段,堆栈段和附加段4个如何定义。个如何定义。2.段分配语句段分配语句ASSUME格式:格式:ASSUME CS:段名,:段名,DS:段名,:段名, SS:段名,:段名,ES:段名:段名ASSUME为伪指令助记符,放在为伪指令助记符,放在代码段的开场,不可省略。提供应汇编程序,代码段的开场,不可省略。提供应汇编程序,阐明当前代码段,数据段,堆栈段和附加段阐明当前代码段,数据段,堆栈段和附加段4个如何定义。个如何定义。 ASSUME后面有各段存放器的名后面有各段存放器的名CS:,:,DS:
45、,:,SS:,:,ES:,用来存放当前有效的:,用来存放当前有效的逻辑段的段地址,后面紧跟冒号逻辑段的段地址,后面紧跟冒号:及段名。及段名。各段存放器之间用逗号各段存放器之间用逗号,分开,段名必需分开,段名必需是用段定义语句是用段定义语句SEGMENTENDS定义过定义过的名字。可以用的名字。可以用ASSUME NOTHING取消取消前面由前面由ASSUME所指定的段存放器。所指定的段存放器。 如:如: ASSUME ES:NOTHING4个逻辑段不一定全部要定义,通常代码个逻辑段不一定全部要定义,通常代码段和数据段是必需的,附加段可以省略。但段和数据段是必需的,附加段可以省略。但当代码段中运
46、用了串指令,必需设置附加段当代码段中运用了串指令,必需设置附加段作目的串基址用,附加段也可用来存放数据,作目的串基址用,附加段也可用来存放数据,增大数据段容量。增大数据段容量。由于由于ASSUME伪指令只指定某个段分伪指令只指定某个段分配给哪个存放器,并将代码段的段地址自动配给哪个存放器,并将代码段的段地址自动装入装入CS存放器中而不能把其他段地址装入相存放器中而不能把其他段地址装入相应的段存放器中,所以在代码段的开场要有应的段存放器中,所以在代码段的开场要有一段初始化程序完成这一任务。对于堆栈段一段初始化程序完成这一任务。对于堆栈段来说,除了将段地址装入来说,除了将段地址装入SS存放器外,还
47、要存放器外,还要将栈顶偏移地址装入堆栈指针存放器将栈顶偏移地址装入堆栈指针存放器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:D1DATASTART:MOV AX,D1DATA ;将数据段地址;将数据段地址DSMOV DS,AXMOV AL,5MOV BX
48、,OFFSET TABLEXLAT TABLEMOV AH,ALMOV AL,7 MOV BX,OFFSET TABLEXLAT TABLEMOV BX,AXC1CODE ENDS END START四、过程定义语句四、过程定义语句 过程也称子程序。在主程序中,经常要过程也称子程序。在主程序中,经常要用到一些程序段,程序段的功能和构造一样,用到一些程序段,程序段的功能和构造一样,仅有一些变量赋值不同,此时可以将这些程仅有一些变量赋值不同,此时可以将这些程序段独立编写用过程定义语句进展定义,然序段独立编写用过程定义语句进展定义,然后在主程序中对它进展过程调用。这样既节后在主程序中对它进展过程调用
49、。这样既节省了内存空间,也便于进展模块化程序设计,省了内存空间,也便于进展模块化程序设计,使编程明晰,运用灵敏。使编程明晰,运用灵敏。格式:格式: 过程名过程名 PROC 属性属性;过程内容;过程内容RET N 过程名过程名 ENDP 四、过程定义语句四、过程定义语句功能:定义一个过程,主程序可以用功能:定义一个过程,主程序可以用CALL指令调用它。指令调用它。过程名过程名是给所定义的过程取的名字,不是给所定义的过程取的名字,不可缺省。它是主程序调用指令的目的操作数,可缺省。它是主程序调用指令的目的操作数,即子程序入口的符号地址。像标号一样过程即子程序入口的符号地址。像标号一样过程名具有三种属
50、性:名具有三种属性:段属性:为该过程所在段的段地址。段属性:为该过程所在段的段地址。偏移地址属性:指该过程第一个字节与段偏移地址属性:指该过程第一个字节与段首址之间间隔字节。首址之间间隔字节。间隔属性:为间隔属性:为NEAR或或FAR。格式中的属。格式中的属性就是指间隔属性,定义性就是指间隔属性,定义NEAR允许过程在允许过程在段内调用,定义段内调用,定义FAR允许过程在段间调用,允许过程在段间调用,NEAR为缺省运用。为缺省运用。PROCENDP过程定义伪指令助记符,过程定义伪指令助记符,成对出现,不可缺省。二者前面有一样的过成对出现,不可缺省。二者前面有一样的过程名,整个过程,整个过程内容
51、包括在程名,整个过程,整个过程内容包括在PROCENDP之内。之内。RET N为过程内部的前往指令。过程为过程内部的前往指令。过程内部至少有一条内部至少有一条RET指令,它可以在过程的指令,它可以在过程的任何位置上,使过程前往到主程序调用它的任何位置上,使过程前往到主程序调用它的CALL指令之下一条指令。指令之下一条指令。RET NRET后面的后面的N为弹出值,可以为弹出值,可以缺省,缺省,N表示从过程前往后,堆栈中应有表示从过程前往后,堆栈中应有N个字节的值作废,个字节的值作废,N必需为正偶数。过程内必需为正偶数。过程内部可以有多个部可以有多个RET,表示此过程具有多个前,表示此过程具有多个
52、前往出口。往出口。 在汇编言语源程序中,运用在汇编言语源程序中,运用CALL指令指令调用过程,过程调用允许嵌套和递归调用。调用过程,过程调用允许嵌套和递归调用。嵌套调用指在一个被调用的过程中,又调用嵌套调用指在一个被调用的过程中,又调用另一个过程;递归调用是指在一个被调用的另一个过程;递归调用是指在一个被调用的过程中,又调用了本身的过程。嵌套与递归过程中,又调用了本身的过程。嵌套与递归的深度由堆栈段的容量决议由于过程调用时的深度由堆栈段的容量决议由于过程调用时必需将当前的地址压入堆栈维护起来,使调必需将当前的地址压入堆栈维护起来,使调用前往时能前往到正确的前往地址。另外在用前往时能前往到正确的
53、前往地址。另外在子程序入口也有许多参数要维护,以免影响子程序入口也有许多参数要维护,以免影响主程序原来的运转形状。主程序原来的运转形状。例例4-30 近过程定义及调用格式近过程定义及调用格式CCODE SEGMENT ABC PROC NEAR RETABC ENDP CALL ABC CCODE ENDS例例4-31 远过程定义及调用格式远过程定义及调用格式C1CODE SEGMENT KKK PROC FAR RETKKK ENDP C1CODE ENDSC2CODE SEGMENT CALL KKK C2CODE ENDS例例4-32 过程嵌套调用格式过程嵌套调用格式CCODE SEGM
54、ENTCCODE SEGMENT KKK PROC NEAR CALL LLL RETKKK ENDP LLL PROC NEAR RETLLL ENDPCCODE ENDS五、程序开场和终了语句五、程序开场和终了语句1.NAME格式:格式:NAME 程序名程序名功能:为源程序目的模块赋名字。功能:为源程序目的模块赋名字。2.TITLE格式:格式:TITLE 文本名文本名功能:将文本名赋给源程序目的模块作名字。功能:将文本名赋给源程序目的模块作名字。3.ORG格式:格式:ORG 表达式表达式功能:给汇编程序设置位置指针,指定下面功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。语句的起
55、始偏移地址。ORG是伪指令助记符,不可缺省。是伪指令助记符,不可缺省。表达式表达式给定的偏移地址值,表达式的计给定的偏移地址值,表达式的计算结果必需是正整数。普通情况下,段定义算结果必需是正整数。普通情况下,段定义语句语句SEGMENT指出了段的起点,偏移地址指出了段的起点,偏移地址为为0,段内各个语句或数据的地址由段地址开,段内各个语句或数据的地址由段地址开始依次类推可确定。当用户要求某条指令或始依次类推可确定。当用户要求某条指令或数据为某个指定地址时,可用数据为某个指定地址时,可用ORG语句来改语句来改变,变,ORG语句可以放在程序的任何位置。语句可以放在程序的任何位置。例例4-33 用用
56、ORG指定代码段起始地址指定代码段起始地址CODE SEGMENTORG 100H ASSUME CS:CODE,DS:DATASTART: ;此代码段起始偏移地址为;此代码段起始偏移地址为100HMOV AX,DATACODE ENDS例例4-34 用用ORG改动数据段起始地址改动数据段起始地址DATA SEGMENTORG 100H A1 DB 1,2,3 ;A1偏移地址为偏移地址为100HORG 200HA2 DW 7,8,9;A2 偏移地址为偏移地址为200HDATA ENDS4.END格式:格式:END 标号名标号名功能:标志汇编源程序终了功能:标志汇编源程序终了END是伪指令助记符
57、,不可缺省,放在是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只需一个源程序的最后一行,每个模块只需一个END。汇编程序到汇编程序到END语句停顿汇编。语句停顿汇编。标号名标号名是该程序中第一条可执行语句的是该程序中第一条可执行语句的标号名,可以缺省,假设一个程序包含多个模标号名,可以缺省,假设一个程序包含多个模块,块,END后面带的标号为主程序模块中的标后面带的标号为主程序模块中的标号称号。号称号。例例4-35CODE SEGMENTASSUME CS:CODE,DS:DATASTART:CODE ENDSEND START六、构造定义语句六、构造定义语句七、外部伪指令及对准伪指令
58、七、外部伪指令及对准伪指令1.外部伪指令外部伪指令 程序中包含多个模块时,有些程序或程序中包含多个模块时,有些程序或数据在各个模块间要相互共享,可用外部数据在各个模块间要相互共享,可用外部伪指令伪指令PUBLIC和和EXTRN来实现此功能。来实现此功能。其中其中PUBLIC用来定义共享模块,用来定义共享模块,EXTRN用来援用共享模块。用来援用共享模块。格式:格式:PUBLIC 称号,称号,称号,称号, EXTRN 称号:类型,称号:类型,称号:类型,称号:类型,PUBLIC伪指令助记符,不可缺省。伪指令助记符,不可缺省。称号称号本语句的操作数,它是本模块中已本语句的操作数,它是本模块中已经定
59、义过的变量、标号或常数,可供其它模经定义过的变量、标号或常数,可供其它模块共享。块共享。EXTRN伪指令助记符,不可缺省。伪指令助记符,不可缺省。称号称号其它模块中用其它模块中用PUBLIC语句定义过语句定义过的变量、标号或常数,供本模块援用,不可的变量、标号或常数,供本模块援用,不可缺省。称号后面紧跟冒号缺省。称号后面紧跟冒号:。类型属性类型属性是指该称号应具有的属性,假设是指该称号应具有的属性,假设所定义的称号是变量,那么类型为所定义的称号是变量,那么类型为BYTE或或WORD;假设称号是标号,那么类型为;假设称号是标号,那么类型为NEAR或或FAR;假设称号是常数,那么类型为;假设称号是
60、常数,那么类型为ABS。类型。类型属性应与在其它模块中被定义时的属性一样。属性应与在其它模块中被定义时的属性一样。EXTRN语句的援用,必需与已用语句的援用,必需与已用PUBLIC语句定义过的称号相呼应。语句定义过的称号相呼应。例例4-42DATA SEGMENTA1 DB 10H,20HA2 DW 4 DUP0A3 EQU 1000HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATATMF LABEL FARPUBLIC A2,A3,TMF CODE ENDS模块模块CODE中定义共享资源中定义共享资源PDATA SEGMENTP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售增长计划
- 足球训练中的心理辅导与激励
- 部编版初中语文必读名著书目(完整版)
- 黑龙江2025年02月共青团黑龙江省委员会事业单位上半年公开招考3名工作人员笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 初中语文生活美文农家客
- 科技类APP用户体验设计挑战与对策
- 部编版道德与法治四年级下册全册教案
- 浙江国企招聘2025国网浙江省电力有限公司高校毕业生招聘1000人(第一批)笔试参考题库附带答案详解
- 领导力培训如何培养企业未来的领导者
- 超声科仪器设备采购过程中的风险控制
- 工业品买卖合同(样表)
- (完整)消化性溃疡PPT课件ppt
- 《教育学原理》马工程教材第二章教育与社会发展
- 《常见疾病康复》期中考试试卷含答案
- 地球使用者地朴门设计手册
- 筑基功法精选
- 欧洲电力市场深度报告:欧洲电力市场供需格局和电价分析
- 2023年考研考博-考博英语-煤炭科学研究总院考试历年高频考点真题荟萃带答案
- 塔式起重机操作使用安全专项方案
- 统计用产品分类目录
- 冀教版小学数学三年级下册小数的初步认识
评论
0/150
提交评论