1、1微型计算机原理及其应用微型计算机原理及其应用第四章:汇编语言程序设计第四章:汇编语言程序设计2第四章第四章 汇编语言程序设计汇编语言程序设计1.1.汇编语言程序格式汇编语言程序格式2.2.伪指令语句伪指令语句3.3.DOSDOS系统功能调用和系统功能调用和BIOSBIOS中断调用中断调用4.4.程序设计方法程序设计方法3 汇编语言汇编语言是利用指令的是利用指令的助记符助记符、符号地址符号地址、标号标号来编写的语言。来编写的语言。用汇编语言编写的程序称为用汇编语言编写的程序称为汇编语言源程序汇编语言源程序;把汇编语言源程序翻译成由机器代码组成的目标把汇编语言源程序翻译成由机器代码组成的目标程序
2、的过程称为程序的过程称为汇编汇编;用来把汇编语言源程序自动翻译成目标程序的软用来把汇编语言源程序自动翻译成目标程序的软件叫件叫汇编程序汇编程序。4 计算机语言可分为计算机语言可分为机器语言机器语言、汇编语言汇编语言、高级语高级语言言三类。三类。机器语言是计算机唯一能识别的语言(二进制语机器语言是计算机唯一能识别的语言(二进制语言)言)汇编语言汇编语言是是面向机器面向机器的语言,不同的的语言,不同的CPUCPU有不同有不同的汇编语言(的汇编语言(PCPC机汇编、单片机汇编)机汇编、单片机汇编)优点:直接针对硬件操作,效率高,节省内存,优点:直接针对硬件操作,效率高,节省内存,运行速度快,实时性能
3、好。运行速度快,实时性能好。高级语言是高级语言是面向过程面向过程的语言:如的语言:如BasicBasic、c c、PascalPascal 目前流行的目前流行的面向对象面向对象的语言:的语言:VBVB、VCVC、C#C#80868086系统中常用的汇编程序:系统中常用的汇编程序:宏汇编程序宏汇编程序MASMMASM5【例例】显示输出显示输出“This is a sample program.”This is a sample program.”DATA DATA SEGMENTSEGMENT ;数据段数据段DA1 DA1 DBDB This is a sample program.This i
4、s a sample program.DBDB 0DH,0AH,0DH,0AH,;回车符和换行符的回车符和换行符的ASCIIASCII码码DATA DATA ENDSENDS STACK STACK SEGMENTSEGMENT STACK STACK;STACK STACK;堆栈段堆栈段 ST1 ST1 DBDB 100 DUP 100 DUP(?);定义定义100100个空的字节单元个空的字节单元STACK STACK ENDSENDSCODE CODE SEGMENTSEGMENT ;代码段代码段 ASSUMEASSUME CS:CODE,DS:DATA,SS:STACK ;CS:COD
5、E,DS:DATA,SS:STACK ;段分配段分配MAIN MAIN PROCPROC FAR ;FAR ;主过程开始主过程开始START:MOV AXSTART:MOV AX,STACK ;STACK ;初始化初始化SSSS MOV SS MOV SS,AXAX6 PUSH DSPUSH DS ;为返回为返回DOSDOS设置堆栈设置堆栈 MOV AXMOV AX,0 0 PUSH AX PUSH AX MOV AX MOV AX,DATA ;DATA ;初始化初始化DSDS MOV DS MOV DS,AXAX MOV AHMOV AH,9 ;99 ;9号调用号调用,显示字符串显示字符串,
6、以以结束结束 MOV DX MOV DX,OFFSET DA1 OFFSET DA1 INT 21H INT 21H RET RET ;返回;返回DOSDOSMAIN MAIN ENDPENDP ;主过程结束;主过程结束CODE CODE ENDSENDS ;代码段结束;代码段结束 ENDEND START START ;源程序结束;源程序结束7【例例】显示输出显示输出“Hello!”Hello!”DATA DATA SEGMENTSEGMENT ;数据段数据段STRING STRING DBDB Hello!,Hello!,DATA DATA ENDSENDS CODE CODE SEGME
7、NTSEGMENT ;代码段代码段 ASSUMEASSUME CS:CODE,DS:DATA ;CS:CODE,DS:DATA ;段分配段分配START:MOV AXSTART:MOV AX,DATA ;DATA ;初始化初始化DSDS MOV DS MOV DS,AXAX MOV AHMOV AH,9 ;99 ;9号调用号调用,显示字符串显示字符串,以以结束结束 MOV DX MOV DX,OFFSET STRING OFFSET STRING INT 21H INT 21H MOV AH,4CH MOV AH,4CH ;返回;返回DOSDOS INT 21HINT 21HCODE CODE
8、 ENDSENDS ;代码段结束;代码段结束 ENDEND START START ;源程序结束;源程序结束8 由例程看出:由例程看出:(1)8086(1)8086汇编源程序具有汇编源程序具有分段结构分段结构 段名段名 SEGMENTSEGMENT 段名段名 ENDSENDS 在源程序中各段的顺序可以任意,段的数目可根在源程序中各段的顺序可以任意,段的数目可根据需要确定(据需要确定(至少有一个代码段至少有一个代码段),原则上不受),原则上不受限制。而每个段又是由若干语句组成,限制。而每个段又是由若干语句组成,语句是汇语句是汇编语言源程序的基础编语言源程序的基础。(2)(2)CSCS不能人为设置
9、,不能人为设置,其它段寄存器的初始化其它段寄存器的初始化需需两两条指令条指令完成(完成(MOV AX,MOV AX,DATADATA MOV DS,AX MOV DS,AX)。)。9(3)(3)两种两种返回返回DOSDOS的方法:的方法:MAIN MAIN PROCPROC FAR FAR ;将主程序建立为过程;将主程序建立为过程 PUSH DS ;PUSH DS ;将将DOSDOS段值和偏移量(段值和偏移量(0 0)入栈)入栈 MOV AX,0 MOV AX,0 PUSH AX PUSH AX RET;RET;返回返回DOS(DOS(将将0 0和和DOSDOS段值段值IPIP、CS)CS)M
10、AIN MAIN ENDPENDP ;主过程结束;主过程结束使用使用4CH4CH号的号的DOSDOS系统功能调用系统功能调用 MOV AX,4C00H(MOV AX,4C00H(或或MOV AH,4CHMOV AH,4CH)INT 21HINT 21H(4)(4)全部全部源程序源程序用用ENDEND伪指令伪指令结束结束。10MASMMASM中可使用的中可使用的语句语句分成分成两类:两类:指令性语句指令性语句和和伪指令语句伪指令语句。一、一、指令性语句指令性语句 特点:与特点:与机器指令相对应机器指令相对应,汇编时产生目标代码汇编时产生目标代码。标号:指令助记符标号:指令助记符 操作数,操作数操
11、作数,操作数 ;注释;注释标号标号:表示:表示本指令语句的符号地址本指令语句的符号地址,后跟冒号,后跟冒号“:”,用,用作转移的目标地址;作转移的目标地址;指令助记符指令助记符:指出:指出指令的操作类型指令的操作类型,由,由英文字母缩写英文字母缩写而成;而成;操作数操作数:指明参加指令运算的数据,有无操作数、单操作:指明参加指令运算的数据,有无操作数、单操作数和双操作数之分,其中双操作数之间用逗号数和双操作数之分,其中双操作数之间用逗号“,”,”分隔,分隔,操作数与指令助记符之间用空格隔开;操作数与指令助记符之间用空格隔开;注释注释:用来说明一条指令或一段程序的功能,前面:用来说明一条指令或一
12、段程序的功能,前面以分号以分号“;”为标记为标记,汇编程序对注释不进行汇编,增加可读性,汇编程序对注释不进行汇编,增加可读性 其中其中指令助记符指令助记符是关键字,是关键字,不可省略不可省略,其余部分均可省略。,其余部分均可省略。4-1 4-1 汇编语言程序格式汇编语言程序格式11二、二、伪指令语句伪指令语句特点:特点:没有对应的机器指令没有对应的机器指令(本身(本身不产生目标代码不产生目标代码),只),只为汇编程序提供汇编信息为汇编程序提供汇编信息。格式:格式:名字名字 伪指令指示符伪指令指示符 操作数,操作数操作数,操作数 ;注释;注释名字名字:给伪指令取的名称,用符号地址表示给伪指令取的
13、名称,用符号地址表示,名字后不带,名字后不带冒号冒号“:”,只用空格符与伪指令指示符相分隔;,只用空格符与伪指令指示符相分隔;伪指令指示符伪指令指示符:是:是MASM规定的符号,明确不同的操作;规定的符号,明确不同的操作;操作数操作数:规定同指令性语句,区别在于:规定同指令性语句,区别在于操作数可能多于操作数可能多于2个个;注释注释:规定同指令性语句:规定同指令性语句其中其中不可省略的部分是伪指令指示符不可省略的部分是伪指令指示符,其余均可缺省。其余均可缺省。三、数据项三、数据项 操作数的三种基本数据项操作数的三种基本数据项:常数、变量、标号:常数、变量、标号12常量常量:固定值,不能改变:固
14、定值,不能改变 a.a.数字常数数字常数:字母后缀字母后缀B B、Q(Q(或或O)O)、D D可省略、可省略、H H b.b.字符串常数字符串常数:ABCABCASCIIASCII码字节序列码字节序列41H41H、42H42H、43H43H c.c.符号常数符号常数:COUNT COUNT EQUEQU 100 100变量变量:某操作:某操作数据数据所所存放单元的符号地址存放单元的符号地址,在,在CSCS以外以外的其的其它段由它段由DBDB、DWDW等定义等定义标号标号:某条:某条指令指令所所存放单元的符号地址存放单元的符号地址,在,在CSCS中定义中定义变量和标号均具有变量和标号均具有三种属
15、性三种属性:a.a.段值段值(SEGMENTSEGMENT):可用可用分析运算分析运算SEGSEG取出取出b.b.段内偏移地址段内偏移地址(OFFSETOFFSET):可用可用分析运算分析运算OFFSETOFFSET取出取出c.c.类型类型(TYPETYPE):可用):可用分析运算分析运算TYPETYPE取出取出 变量变量:每个元素所包含的字节数每个元素所包含的字节数,有,有BYTEBYTE、WORDWORD和和DWORDDWORD三种类型。三种类型。标号标号:可转移的距离(或可转移的距离(或距离属性距离属性),有有NEARNEAR和和FARFAR两种。两种。13四、四、MASMMASM中的表
16、达式中的表达式 表达式由表达式由运算对象运算对象和和运算符运算符组成,在组成,在汇编过程中汇编过程中完成表达式运算完成表达式运算。其中运算对象可以是常数、变。其中运算对象可以是常数、变量、标号、寄存器等。量、标号、寄存器等。1.1.算术运算符算术运算符(运算对象和运算结果均为整数)(运算对象和运算结果均为整数)包括:包括:+、-等等,常用于常用于地址运算地址运算。注:注:两符号地址相减两符号地址相减表示表示某符号地址占用的内存某符号地址占用的内存字节数字节数。【例例】ARRAY DB 1,2,3,4,5,6,7,8ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 TRY D
17、B 20 MOV CX,MOV CX,TRY-ARRAYTRY-ARRAY 汇编后:汇编后:MOV CX,MOV CX,8 8 142.2.逻辑运算符逻辑运算符(按位运算)(按位运算)包括:包括:ANDAND、OROR、NOTNOT、XORXOR例:例:ANDAND ALAL,8FH ,8FH ANDAND 73H 73H 运算符运算符,汇编汇编过程中完成过程中完成 指令助记符指令助记符,程序,程序执行执行时完成。时完成。3.3.关系运算符关系运算符 包括:包括:EQEQ、NE(NE(不等不等)、LT(LT(小于小于)、GTGT(大于)、(大于)、LE()LE()、GE()GE()a.a.结果
18、为真结果为真,输出全输出全1 1(字节运算为(字节运算为OFFHOFFH或字运算为或字运算为OFFFFHOFFFFH)b.b.结果为假结果为假,输出全输出全0 0【例例】MOV AX,MOV AX,10H10H GE 16GE 16汇编后:汇编后:MOV AX,MOV AX,0FFFFH0FFFFH154.4.数值返回运算符数值返回运算符(或(或分析运算符分析运算符)功能:功能:返回运算对象的某个参数值返回运算对象的某个参数值。包括:包括:SEGSEG、OFFSETOFFSET、TYPETYPE、LENGTHLENGTH、SIZESIZESEGSEG 变量或标号变量或标号 ;取段基址取段基址
19、常用法:常用法:MOV AXMOV AX,SEG M1SEG M1(或用段名或用段名)MOV DS MOV DS,AXAXOFFSETOFFSET 变量变量/标号标号 ;取偏移地址值取偏移地址值 常用法:常用法:MOV BXMOV BX,OFFSET DA1 OFFSET DA1;设地址指针设地址指针 LEA BXLEA BX,DA1DA1TYPETYPE 变量变量/标号标号 ;取类型属性取类型属性 变量返回变量返回1 1(DBDB)、2(DW)2(DW)、4 4(DDDD)等等 标号返回标号返回-1-1(NEARNEAR)、-2-2(FARFAR)(0FFH)(0FEH)(0FFH)(0FE
20、H)16DATADATASEGMENTSEGMENT;定义数据段定义数据段VAR1 DB 10H,18H,25H,34HVAR1 DB 10H,18H,25H,34H;定义字节数据定义字节数据VAR2 DW 2300H,1200HVAR2 DW 2300H,1200H ;定义字数据定义字数据VAR3 DD 11002200H,33004400H;VAR3 DD 11002200H,33004400H;定义双字数据定义双字数据DATADATAENDSENDS;数据段结束数据段结束设设DATADATA段起始于物理地址段起始于物理地址30000H30000H处,则处,则 MOV BX,MOV BX,
21、SEGSEG VAR1VAR1 汇编成:汇编成:MOV BX,MOV BX,3000H3000H MOV CX,MOV CX,SEGSEG VAR2VAR2 汇编成:汇编成:MOV CX,MOV CX,3000H3000H MOV DX,MOV DX,SEGSEG VAR3VAR3 汇编成:汇编成:MOV DX,MOV DX,3000H3000H MOV BX,MOV BX,OFFSETOFFSET VAR1VAR1 汇编成:汇编成:MOV BX,MOV BX,0000H0000H MOV CX,MOV CX,OFFSETOFFSET VAR2VAR2 汇编成:汇编成:MOV CX,MOV C
22、X,0004H0004H MOV DX,MOV DX,OFFSETOFFSET VAR3VAR3 汇编成:汇编成:MOV DX,MOV DX,0008H0008H17【例例】A1 DB 20H,30HA1 DB 20H,30H A2 DW 0438H A2 DW 0438H A3 DD?A3 DD?L1:MOV AH,L1:MOV AH,TYPETYPE A1A1 MOV BH,MOV BH,TYPETYPE A2A2 MOV AL,MOV AL,TYPE A3TYPE A3 MOV BL,MOV BL,TYPETYPE L1L1汇编后:汇编后:MOVMOV AH,AH,1 1 MOV BH,
23、MOV BH,2 2 MOV AL,MOV AL,4 4 MOV BL,MOV BL,0FFH0FFH18LENGTHLENGTH 变量变量 ;返回返回重复操作符重复操作符DUPDUP之前的重复次数之前的重复次数,若若不是由不是由DUPDUP定义定义,则都,则都返回返回1 1。SIZE SIZE 变量变量 ;返回该变量包含的总字节数返回该变量包含的总字节数。SIZE=LENGTHSIZE=LENGTH*TYPETYPE 注:注:SEGSEG、OFFSETOFFSET、TYPETYPE可用于变量和标号前可用于变量和标号前,返,返回三种属性值;而回三种属性值;而LENGTHLENGTH和和SIZE
24、SIZE只对变量才有效只对变量才有效。【例例】M1 DW 100 DUP(?)M1 DW 100 DUP(?)M2 DW 1,2,3 M2 DW 1,2,3 M3 DB A B C D M3 DB A B C D MOV CX,MOV CX,LENGTHLENGTH M1M1 MOV BL,MOV BL,LENGTH M2LENGTH M2 MOV AL,MOV AL,LENGTHLENGTH M3M319汇编后:汇编后:MOV CX,MOV CX,100100 MOV BL,MOV BL,1 1 MOV AL,MOV AL,1 1 若指令改为:若指令改为:MOV CX,MOV CX,SIZE
25、SIZE M1M1 MOV BL,MOV BL,SIZE M2SIZE M2 MOV AL,MOV AL,SIZE M3SIZE M3 则汇编后:则汇编后:MOV CX,MOV CX,200200 MOV BL,MOV BL,2 2 MOV AL,MOV AL,1 1205.5.修改属性运算符修改属性运算符(综合运算符)(综合运算符)功能:功能:修改变量修改变量/标号的三种属性标号的三种属性段操作符段操作符:修改段基址与偏移地址来源的默认关修改段基址与偏移地址来源的默认关系系,格式如下:,格式如下:段前缀:段前缀:变量或地址表达式变量或地址表达式例:例:MOV AX MOV AX,ES:ES:
26、BXBXPTRPTR:对变量对变量/标号赋予新的属性标号赋予新的属性,以保证操作数,以保证操作数类型的匹配,常与类型的匹配,常与BYTEBYTE、WORDWORD、NEARNEAR、FARFAR等连用。等连用。格式:格式:新类型新类型 PTR PTR 变量变量/标号标号例:例:MOV BX,10H ;MOV BX,10H ;汇编时提示错误汇编时提示错误 MOV MOV BYTE PTRBYTE PTRBX,10H;BX10HBX,10H;BX10H MOV MOV WORDWORD PTRPTRBX,10H;BX,BX+10010HBX,10H;BX,BX+10010H21例:例:N1 N1
27、DB DB 15H,36H15H,36H N N2 2 DW 1DW 11 122H22H,3344,3344H H MOV AXMOV AX,WORD PTRWORD PTR N1N1 执行后:执行后:AX=AX=36153615H H MOV BLMOV BL,BYTE PTRBYTE PTR N N2 2 执行后:执行后:BL=BL=2222H H MOV AX,MOV AX,WORD PTRWORD PTR N1+1 N1+1 执行后:执行后:AX=AX=22362236H H注:若符号地址出现在操作数中,其类型为注:若符号地址出现在操作数中,其类型为DBDB、DWDW所定义的所定义的
28、类型(如类型(如直接直接寻址、寄存器寻址、寄存器相对相对寻址、寻址、相对相对基址变址寻基址变址寻址),如类型不匹配汇编时提示址),如类型不匹配汇编时提示Warning Warning ErrorError:OperandOperand types must matchtypes must match 或或 Illegal sizeIllegal size for operandfor operand;若存;若存储器操作数中不包含符号地址(如寄存器间接寻址等),储器操作数中不包含符号地址(如寄存器间接寻址等),则该操作数的类型不确定,指令中的另一操作数必须明确则该操作数的类型不确定,指令中的另一
29、操作数必须明确类型,否则汇编时提示类型,否则汇编时提示Severe Severe ErrorError:OperandOperand must have must have size.size.例:例:LEA BX,N1LEA BX,N1之后之后 CMP BX,10H CMP BX,10H 或或 INC BXINC BX均出错。均出错。22THISTHIS:对变量对变量/标号赋予新的属性标号赋予新的属性,且该变量或标号的段且该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。地址和偏移地址与下一个存储单元的地址相同。格式:格式:变量变量/标号标号 EQU THIS EQU THIS 类型
30、类型 例:例:FIRST EQU FIRST EQU THIS BYTETHIS BYTE TABLE TABLE DWDW 200 DUP(?)200 DUP(?)TABLE TABLE为字类型为字类型,FIRST,FIRST为字节类型,两者地址相同。为字节类型,两者地址相同。(该数据区具有双重类型属性)(该数据区具有双重类型属性)MOV AL MOV AL,FIRSTFIRST MOV AX MOV AX,TABLE TABLE 均正确。均正确。SHORTSHORT:说明转向地址为:说明转向地址为短转移短转移(8 8位位移量位位移量)格式:格式:SHORT SHORT 标号标号例:例:JM
31、P SHORT LPJMP SHORT LP MOV MOV -128-128+127+127之间之间LP:MOVLP:MOV236.6.其它运算符其它运算符 方括号方括号 a.a.表示表示地址表达式地址表达式例:例:M1 DB 10H,20H,30H,40HM1 DB 10H,20H,30H,40H M2 DW 1234H,5678H,9ABCH M2 DW 1234H,5678H,9ABCH MOV BX,OFFSET M1 MOV BX,OFFSET M1 MOV CL,BX ;10H MOV CL,BX ;10HCLCL MOV BX,OFFSET M2 MOV BX,OFFSET M
32、2 MOV DX,MOV DX,BX+2BX+2 ;M2 ;M2的第二个单元的第二个单元5678H5678HDXDX b.b.表示表示多重变量的下标值多重变量的下标值(下标从(下标从0 0开始算)开始算)例:例:MOV CXMOV CX,M20M20 ;1234HCX1234HCX MOV MOV M21M21,CX CX ;CXM2CXM2的第二个单元,覆盖的第二个单元,覆盖5678H5678H244-2 4-2 伪指令语句伪指令语句特点特点:无对应的机器代码无对应的机器代码,在在汇编期间汇编期间进行处理进行处理 (不是由不是由CPUCPU执行执行)()(为汇编程序提供汇编信息为汇编程序提供
33、汇编信息)一、一、数据定义数据定义语句语句功能:为一个数据项功能:为一个数据项分配存储单元分配存储单元,用一个,用一个符号名符号名与这个存储单元相联系,且为此存储单元与这个存储单元相联系,且为此存储单元提供提供任意初始值任意初始值。例:例:ARRAY DB 1,2,4ARRAY DB 1,2,4 则则ARRAYARRAY记为记为第一个字节的偏移地址第一个字节的偏移地址该伪指令助记符有:该伪指令助记符有:DBDB 定义定义字节字节 DWDW 定义定义字字 DDDD 定义定义双字双字251 1、操作数是、操作数是常数或表达式常数或表达式,可以为数据或地址,可以为数据或地址 DA DW 1122H,
34、34H,5 DA DW 1122H,34H,5*20H20H2 2、操作数为、操作数为字符串字符串,字符串必须用,字符串必须用单引号单引号括起来括起来 STR1 DB OKSTR1 DB OK STR2 DW OK STR2 DW OK 注:注:字符串字符串一般用一般用DBDB定义,有时定义,有时2 2个字符可用个字符可用DWDW定义定义3 3、可用、可用?保留空单元保留空单元(分配内存单元但不初始化)(分配内存单元但不初始化)M1 DB?M1 DB?M2 DW 1234H M2 DW 1234H,?,?4 4、用、用重复操作符重复操作符DUPDUP初始化重复数据初始化重复数据 格式:格式:D
35、B(DB(或或DW)DW)重复次数重复次数 DUPDUP(重复内容)(重复内容)注:注:DUPDUP可嵌套可嵌套 ARR DW 3 DUP(1,2 DUP(0),2);ARR DW 3 DUP(1,2 DUP(0),2);变量共占变量共占?个字节单元个字节单元242426二、二、表达式赋值表达式赋值语句(语句(不占用内存不占用内存)1 1、赋值语句、赋值语句 EQUEQU 格式格式:符号名符号名 EQU EQU 表达式表达式(表达式应有确定值表达式应有确定值)COUNT EQU 100 COUNT EQU 100 EQUEQU左边的名字等价于右边的表达式左边的名字等价于右边的表达式2 2、等号
36、语句、等号语句 =COUNT=100COUNT=100 与与EQUEQU语句具有相同功能。语句具有相同功能。区别:区别:EQUEQU中的符号名不允许重复定义中的符号名不允许重复定义,应先用,应先用PURGEPURGE语句解除,而语句解除,而“=”=”伪指令可以伪指令可以。例:例:C1 EQU 100C1 EQU 100 PURGEPURGE C1 C1 ;C1C1不再代表不再代表100100 C1 EQU 200 C1 EQU 20027三、三、段定义段定义语句语句1 1、段定义语句、段定义语句 SEGMENTSEGMENTENDSENDS SEGMENTSEGMENT和和ENDSENDS必须
37、必须成对使用成对使用,将,将源程序分段源程序分段。段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 分类名分类名 段名段名 ENDSENDS 在在SEGMENTSEGMENT和和ENDSENDS之间,对于之间,对于数据段、附加段和堆数据段、附加段和堆栈段栈段中,一般是一些中,一般是一些伪指令伪指令;而对于;而对于代码段代码段,主要,主要是是指令指令序列和序列和伪指令伪指令。28(1 1)定位类型:对段起始地址定位)定位类型:对段起始地址定位 此参数一般此参数一般缺省缺省,缺省值为,缺省值为PARAPARA,表示段起始地址,表示段起始地址必须在节的整数边界(存储空间从
38、必须在节的整数边界(存储空间从0 0开始,每开始,每1616个个存储单元叫一节)。存储单元叫一节)。(2 2)组合类型组合类型:提出各个逻辑之间的组合方式:提出各个逻辑之间的组合方式 此参数此参数在堆栈段中不可缺省在堆栈段中不可缺省,用,用STACKSTACK指定该段为指定该段为堆栈段堆栈段。而在。而在其它段中一般缺省其它段中一般缺省,缺省值为,缺省值为NONENONE,表示该段与其它同名段不进行连接,各段独立存在表示该段与其它同名段不进行连接,各段独立存在于存储器中。于存储器中。(3 3)分类名分类名 此参数一般此参数一般缺省缺省,主要作用是汇编程序连续时将所,主要作用是汇编程序连续时将所有
39、分类名相同的逻辑段组成一个段组。有分类名相同的逻辑段组成一个段组。292 2、段分配段分配语句(语句(ASSUMEASSUME)ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRAASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRA 该语句该语句不可省略不可省略,一般放在代码段的开始。,一般放在代码段的开始。用来用来建立建立4 4个个段寄存器段寄存器(CSCS、DSDS、ESES、SSSS)与程序)与程序中中所取段名所取段名(位于(位于SEGMENTSEGMENT和和ENDSENDS之前)之间的之前)之间的对对应关系应关系。但但ASSUM
40、EASSUME语句只指定某个段分配给哪个段寄存器,语句只指定某个段分配给哪个段寄存器,它它并不能把段基址装入段寄存器并不能把段基址装入段寄存器中,故中,故DSDS、ESES、SSSS的具体值还必须分别通过两条的具体值还必须分别通过两条MOVMOV指令得到(如初指令得到(如初始化始化SSSS,还应加上,还应加上SPSP的初始化)的初始化),但但CSCS的赋值的赋值是在是在程序初始化时程序初始化时自动完成自动完成的。的。30 总结:总结:分段程序的两种完整段定义格式分段程序的两种完整段定义格式(1 1)DATA SEGMENT DATA SEGMENT ;数据段;数据段 DATA ENDSDATA
41、 ENDS STACK SEGMENT STACK STACK SEGMENT STACK ;堆栈段;堆栈段 STT DW 100 DUP(?)STT DW 100 DUP(?)TOP EQU SIZE STT TOP EQU SIZE STT STACK ENDSSTACK ENDS CODE SEGMENT CODE SEGMENT ;代码段;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK;ASSUME CS:CODE,DS:DATA,SS:STACK;段分配段分配 MAIN PROC FAR MAIN PROC FAR ;主过程;主过程 START:MOV AX,
42、STACK START:MOV AX,STACK ;初始化;初始化SSSS和和SPSP MOV SS,AX MOV SS,AX MOV SP,TOP MOV SP,TOP DW 100 DUP(?)DW 100 DUP(?)TOP EQU$TOP EQU$31 PUSH DS ;PUSH DS ;为返回为返回DOSDOS设置堆栈设置堆栈 MOV AX,0 ;(XOR AX,AX),(AND AX,0)MOV AX,0 ;(XOR AX,AX),(AND AX,0);(SUB AX,AX);(SUB AX,AX)PUSH AX PUSH AX MOV AX,DATA;MOV AX,DATA;初始
43、化初始化DSDS MOV DS,AX MOV DS,AX RET ;RET ;返回返回DOSDOSMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END START END START32(2)(2)前面两个段相同前面两个段相同 CODE SEGMENTCODE SEGMENT ASSUME ASSUME START:START:段寄存器及段寄存器及SPSP初始化初始化 MOV AH,4CHMOV AH,4CH ;利用利用4CH4CH号号DOSDOS系统系统 INT 21HINT 21H ;功能调用返回功能调用返回DOSDOS CODE ENDS CODE ENDS
44、END START END START33例:两个例:两个1616位无符号二进制数相乘。位无符号二进制数相乘。DATA SEGMENTDATA SEGMENTD1 DW 1234HD1 DW 1234HD2 DW 5678HD2 DW 5678HP1 DD?P1 DD?P2 DD?P2 DD?DATA ENDSDATA ENDSSTACK SEGMENT STACKSTACK SEGMENT STACKSTT DB 100 DUP (?)STT DB 100 DUP (?)TOP EQU TOP EQU SIZESIZE STT STT STACK ENDSSTACK ENDSCODE SEG
45、MENTCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA ASSUME CS:CODE,SS:STACK,DS:DATA34START:START:MOVMOV AX,STACKAX,STACK MOV SS,AXMOV SS,AX MOV SP,TOP MOV SP,TOP MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AXL1:MOV AX,D1L1:MOV AX,D1 MUL D2 MUL D2 MOV BX,OFFSET P1 MOV BX,OFFSET P1 MOV BX,AX MOV BX,AX MOV B
46、X+2,DX MOV BX+2,DX MOV AH,4CHMOV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END START END START35四、四、过程定义过程定义语句(子程序定义语句)语句(子程序定义语句)格式:格式:过程名过程名 PROCPROC NEAR NEAR或或FARFAR RET RET 过程名过程名 ENDPENDPa.a.每定义一个过程,每定义一个过程,PROCPROC和和ENDPENDP要要成对出现成对出现,两者前面的过程,两者前面的过程名应一致。名应一致。b.b.主、子程序主、子程序在同一代码段在同一代码段中,则定义为中,
47、则定义为NEARNEAR型(或型(或缺省缺省)主、子程序主、子程序不在同一代码段不在同一代码段中,则定义为中,则定义为FARFAR型;型;一般可将主程序定义为一般可将主程序定义为FARFAR属性(主过程作为属性(主过程作为DOSDOS调用的一个调用的一个远端子过程)远端子过程)c.c.要调用一个过程,在主调函数中用要调用一个过程,在主调函数中用CALL CALL 过程名过程名,而过程返,而过程返回必须通过回必须通过RETRET语句。语句。36例:用过程调用的方法,将内存中例:用过程调用的方法,将内存中4 4个个BCDBCD码相加。码相加。DATA SEGMENTDATA SEGMENTONE
48、DB 22H,33H,44H,55HONE DB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HTWO DB 55H,66H,77H,88HSUM DB 20 DUP (?)SUM DB 20 DUP (?)DATA ENDSDATA ENDSSTACK SEGMENT STACKSTACK SEGMENT STACKSTT DB 100 DUP (?)STT DB 100 DUP (?)TOP EQU TOP EQU SIZESIZE STT STTSTACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:COD
49、E,SS:STACK,DS:DATA ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATAES:DATASTART:START:MOVMOV AX,STACKAX,STACK MOV SS,AX MOV SS,AX MOV SP,TOP MOV SP,TOP37 MOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AXMOV ES,AX MOV SI,OFFSET ONE ;MOV SI,OFFSET ONE ;设置地址指针设置地址指针 MOV BX,OFFSET TWO MOV BX,OFFSET TWO MOV DI
50、,OFFSET SUM MOV DI,OFFSET SUM CLD ;CLD ;清方向标志清方向标志 CLCCLC ;清进位标志清进位标志 MOV CX,4MOV CX,4 ;循环次数循环次数LL:CALL ABCLL:CALL ABC LOOP LLLOOP LL MOV AH,4CHMOV AH,4CH INT 21H INT 21H38ABC PROC NEAR ABC PROC NEAR ;完成单字节数据加法运算完成单字节数据加法运算 LODSB ;LODSB ;DSDS:SIAL,SI+1SI:SIAL,SI+1SIL1:L1:ADCADC AL,BX;AL,BX;带进位带进位相加相