《汇编语言程序设计 课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计 课件.ppt(116页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 80x86汇编语言程序设计,第五节 编写完整的汇编语言程序,第四节 宏汇编指令,第三节 汇编语言的语句,第二节 汇编语言语句的组成,第一节 汇编语言概述,第六节 汇编语言程序设计,机器语言二进制数形式的指令和数据。 B0 64 是什么意思?这就是机器语言。既不直观,又不易理解和记忆. MOV AL,64H ;很容易记忆理解,这就是助记符。,助记符用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。,第一节 汇编语言概述,指令除了操作码以外,还有一个操作数问题。,操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移
2、地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。于是人们采用标号或符号来代替地址,例: LP1: mov ax,VAR loop LP1 汇编语言指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。 用汇编语言编写的程序叫汇编语言源程序。,面向过程的语言,如C、C+、BASIC、PASCAL等优点:更接近人类语言的语法习惯,易于掌握,便于建立数学模型和实现复杂算法缺点:与机器语言无明显对应关系,因此编译出来的机器语言程序效率相对较低,占用内存多,执行时间长。,高级语言,汇编程序,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语
3、言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件 .ASM汇编(编译) 目标文件 .OBJ链接 可执行文件 .EXE调试 最终程序,编辑器: EDIT.exe编程序: MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe,DATASEGMENTSTRINGDBHELLO WORLD!, 0DH, 0AH, $DATAENDSCODESEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AX;初
4、始化数据段的段地址MOVAH, 09HLEADX, STRING;输出字符串INT21HMOVAH, 4CHINT21H;调用4CH号系统功能返回DOSCODEENDSENDBEGIN,数据段,代码段,一个简单的8086系统下的汇编语言程序:,第二节 汇编语言语句的组成,汇编语言程序的语句中包含的元素,一、字符集,二、保留字与标识符,三、常量、变量与标号,四、表达式及运算符,一、字符集,允许使用的字符:字母,包括大写字母AZ和小写字母az;数字,包括09;特殊字符,包括:+ - * / =() ; , “ . :? $ & 及空格、制表符、回车、换行等。注意:除了字符串,字母都是不区分大小写一
5、系列相连的空格、制表符效果相当于一个空格一系列相连的回车换行相当于一次回车换行分号“;”后一直到行尾的内容都是注释字符“&”若用于某行的开头,则表示该行是上一行的续行,二、保留字与标识符,1、保留字在汇编语言中有特定意义的词,可分为:指令助记符及指令前缀如:MOV、ADD、REP等寄存器名如:AX、EBX、CL等伪指令助记符如: DB、SEGMENT等其他保留字,包括运算符、操作符等如: EQ、LT、OFFSET、SEG等,2、标识符,标识符是程序员自己起的名字,如变量名、标号、段名、过程名等标识符的命名规则:标识符必须由字母、数字和几个特殊字符(包括 _ $ ? :)组成,而且第一个字符不能
6、是数字(否则可能与16进制的数字混淆)标识符不能与某个保留字相同,以免混淆尽量用有意义的英文单词或缩写来命名,以增加程序的可读性,三、常量、变量与标号,1、常量数字常量二进制:以B结尾,如10101010B八进制:以Q结尾,如123Q,67Q十进制:以D结尾,“D”可省略,如1234D,5678十六进制:以H结尾,AF开头的数须在前面加“0” 如:1234H,0FFFFH字符串常量用单引号或双引号引起来的一个或多个ASCII字符每个字符的值等于其ASCII码值例:A=41H一个字节,12=31H、32H两个字节,2、变量,变量是存放在存储器中的操作数 可通过变量的名字来访问变量变量具有三个属性
7、:段属性,即变量所在的段的基地址;偏移量属性,即变量相对于段的起始地址的偏移量;类型属性,包括BYTE(字节)、WORD(字)、DWORD(双字),3、标号,标号是一条指令性语句的起始地址标号具有三个属性:段属性,即标号所在的段的基地址;偏移量属性,即标号相对于段的起始地址的偏移量;类型属性,包括NEAR(近程,即段内)、FAR(远程,即段间),四、表达式及运算符,由常量、变量、标号和一些运算符、操作符构成的式子表达式的值在汇编的过程中就已经被汇编程序计算出来运算符的分类:,1、算术运算符,五种算术运算:加:+、 减:-、 乘:*、 除:/、 模:MOD合法地址表达式:地址-地址(处在同个段中
8、);地址常数ADDR1-ADDR2(假设两个地址处在同个段中)ADDR1+1ADDR2-2非法地址表达式:地址+地址;地址*地址;地址/地址;常量-地址;地址-地址(处在不同段中)ADDR1+ADDR2ADDR1*ADDR2ADDR1/2100-ADDR1SEG1_A-SEG2_B (假设两个地址处在不同段中),2、逻辑运算符,五种逻辑运算:与AND、或OR、异或XOR、非NOT、逻辑左移SHL、逻辑右移SHR 只用于数字表达式中例:MOV AL,10101010B AND 11001100B ;AL10001000BMOV AX,1000100010001000B XOR 110011001
9、1001100B;AX0100010001000100B,3、关系运算符,六种关系运算符:EQ(Equal,相等)NE(Not Equal,不等)LT(Less Than,小于)LE(Less than or Equal,小于或等于)GT(Great Than,大于)GE(Great than or Equal,大于或等于)运算结果:关系为真,则运算结果为0FFFFH关系为假,则运算结果为0 如:MOV BX,1 EQ 2; 结果 BX=0MOV AX,(3 LT 4) AND 1;结果 AX=1,4、属性运算符,(1)型重新指定操作符PTR功能:临时指定或修改存储器操作数的数据类型属性或地址
10、类型属性格式:类型 PTR 表达式例:VAR_WDW1234HMOV AX,VAR_W ;AX1234HMOV AL,BYTE PTR VAR_W ;AL34H,PTR与EQU连用作用:定义与表达式类型不同的新变量名或新标号,但不分配新的存储单元例:数据段定义:DATA_B DB 1,2,3,4DATA_W EQU WORD PTR DATA_B代码段:MOVAL,DATA_B ;AL1MOVAX,WORD PTR DATA_B ;AX0201HMOVAX,DATA_W ;AX0201H(第2、3条指令等价),(2)类型指定操作符THIS,功能:指定或说明变量或标号的类型例1:DATA_W E
11、QU THIS WORDDATA_B DB1,2,3,4MOVAL,DATA_B ;AL1MOVAX,WORD PTR DATA_B ;AX0201HMOVAX,DATA_W ;AX0201H例2:ADDR_F EQU THIS FARADDR_N: MOV AX,1 JMP ADDR_F ;等价于:JMP FAR PTR ADDR_N,(3)短转移操作符SHORT,功能:一般用在JMP指令 告诉汇编程序该JMP指令是一个短程转移指令 例: JMP SHORT LAB LAB:,5、数值返回操作符,(1)SEG、OFFSET功能:SEG操作符用于求一个标号或变量所在段的基地址OFFSET操作符
12、则用于求标号或变量在段中的地址偏移量例如,对于代码段中的一条指令:2000H:1234H ADDR: INC CX ;段地址=2000H,偏移量=1234H则有:MOV AX,SEG ADDR ;AX2000HMOV AX,OFFSET ADDR ;AX1234H;与指令 “LEA AX,ADDR” 等价,(2)TYPE、LENGTH、SIZE,功能:TYPE:求变量的数值类型属性,即变量具有的字节数BYTE:返回1;WORD:返回2;DWORD :返回4;NEAR:返回0FFH(-1);FAR:返回0FEH(-2)LENGTH:求变量所占用的内存单元数用于由重复操作符DUP()定义的存储器变
13、量对于其他变量,LENGTH的返回值都是1SIZE:计算变量所占存储器的总字节数 关系:SIZE = LENGTH TYPE,例:DATA1 DW 1234HDATA2 DB HELLODATA3 DD 100 DUP(0);表示定义100个值为0的双字MOV AL,TYPEDATA1;AL2MOV AL,TYPEDATA2;AL1MOV AL,TYPEDATA3;AL4MOV BL,LENGTH DATA1;BL1MOV BL,LENGTH DATA2;BL1MOV BL,LENGTH DATA3;BL100MOV CL,SIZEDATA1;CL21=2MOV CL,SIZEDATA2;CL
14、11=1MOV CL,SIZEDATA3;CL4100=400,6、运算符的优先级,表达式计算顺序:先处理优先级别高的运算符对于优先级相等的运算符,则按从左至右的顺序进行处理优先级顺序:()、(优先级最高)LENGTH、SIZEPTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(优先级最低),第三节 汇编语言的语句,汇编语言由指令性语句和指示性语句组成指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应;指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇
15、编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。,第三节 汇编语言的语句,一、指示性语句格式(里的内容可选):名字 伪指令符 操作数,操作数, ;注释名字:变量名、段名等,与指令地址无关,后面不能加冒号伪指令符:指定汇编程序要完成的具体操作操作数:常量、变量或表达式等注释:说明、解释当前语句的作用,功能:为变量分配存储空间格式:变量名 伪指令符 操作数,操作数, ;注释六种数据定义伪指令:DB(字节定义):每个操作数占1个字节DW(字定义):每个操作数占1个字,即2个字节DD(双字定义):每
16、个操作数的长度为双字,即4个字节,1、数据定义伪指令,例:可同时定义多个数据:NUM DW 12H,-1 ;定义2个字STRING DB HELLO,0DH,0AH;定义字符串省略变量名:BUF DB 1,10,100 DB 1 ;省略变量名 ;但该数据仍可通过“BUF+3”访问无初始化数据定义:用问号“?”代替操作数BUFFER DB 2,?,?,? ;定义4个字节 ;其中后3个字节不初始化,DUP操作符:格式:重复的次数 DUP(重复的内容)例:ARRAYDB3 DUP(1,2);等价于:ARRAY DB 1,2,1,2,1,2BUF_WDW100 DUP(?);定义100个字,但不初始化
17、DUP的嵌套使用:ARRAY2DB2 DUP(1,3 DUP(0) ;等价于:ARRAY2 DB 1,0,0,0,1,0,0,0,地址表达式作为操作数:只能用DW、DD定义DW:变量/标号的偏移量DD:变量/标号的段地址和偏移量例:DATA1 DWADDR1+1;把ADDR1偏移量加1后存放到DATA1对应的存储单元中DATA2 DDDATA1;把DATA1的偏移量和段地址存放到DATA2对应的存储单 元中,其中偏移量放低地址,段地址放高地址。,地址计数器“$”“$”:表示到目前为止该段已经使用的地址空间例1:设VAR1地址偏移量为1000H,则:VAR1DB100H DUP (?)之后,$=
18、1100H,因此:ADDR1DW$等价于“ADDR1 DW 1100H”,也等价于“ADDR1 DW ADDR1”例2:STRING DB ABCLEN DW $-STRING ;LEN的值为STRING的长度,(1)等价伪指令EQU格式:符号名EQU 表达式功能:为常量、表达式及其他各种符号定义一个别名例:NUMEQU 12;给数值定义符号名NUM2EQU NUM+10;给12+10=22定义符号名ADDREQU DS:BX+SI ;给寻址表达式定义符号名COUNTEQU CX;给寄存器CX定义符号名CLEAREQU XOR AX,AX;给指令定义符号名,2、符号定义伪指令,(2)解除伪指令
19、PURGE格式:PURGE 符号名,符号名,作用:EQU伪指令不能直接对一个符号名重定义,必须先用PURGE解除例:COUNTEQU CXPURGE COUNTCOUNTEQUCL,(3)等号“=”伪指令格式:符号名=表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名 允许对符号名多次重复定义,且以最后一次定义的值为准 例:CONST= 1;给数值1定义符号名CONSTADDR= BP+DI;给寻址表达式定义符号名ADDRCONST= 0;重定义CONST,格式:段名 SEGMENT定位方式组合方式使用类型类名 ;段中的内容段名 ENDS功能:定义一个段例:DATASEGMENTVA
20、RDB?DATAENDS得到段地址的两种方法:MOVAX,DATAMOVAX,SEG VAR,3、段定义伪指令,(1)定位方式作用:设置该段在存储器中的起始边界分类:BYTE:可从任意的绝对地址开始,如12345H。WORD:可从偶地址开始。如12346H。DWORD:可以任何一个双字的边界开始,如12348H。PARA(缺省方式):必须从存储器的16字节的边界开始,如12340H(最后一位为0)。PAGE:起始地址必须能被256整除,如12300H。,(2)类名用单引号括起来的字符串连接定位时,具有相同类名的逻辑段会被组合在一起 如:在模块1中有段定义: seg1 SEGMENT PARA
21、STACK stack seg1 ENDS 在模块2中有段定义: seg2 SEGMENT PARA STACK stack seg2 ENDS则连接时这两个段被安排在一起。,(3)使用类型(386以上)USE16:缺省类型,表示该段采用16位寻址方式,段基址和段内偏移量都是16位USE32:表示该段采用32位寻址方式,段选择子为16位,段内偏移量则是32位,(4)组合方式作用:指定同类名段的组合方法 分类:PRIVATE(缺省方式):不组合PUBLIC:同类名段按照前后次序连接在一起COMMON:与其他模块中的同类名段有相同的起始物理地址STACK:与其他模块中的同类名段用覆盖的方式连接,从
22、高地址开始覆盖MEMORY:该段必须放在同类名的各个段中的最后AT表达式:直接指定该段的段地址,4、假定伪指令ASSUME格式:ASSUME段寄存器:段名,段寄存器:段名,功能:告诉汇编程序段与段寄存器的对应关系例:DATASEGMENTVAR1DB? DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:ASSUME指令:假定CS为代码段,DS为数据段,5、地址对准伪指令ORG格式:ORG 数值表达式功能:用于指定下一个指令或数据在段内的起始地址例:LAB1:PUSHAXORG2000HLAB2:MOVAL,34则LAB2的地址偏移量为2000H。,6、
23、过程定义伪指令PROC、ENDP功能:定义一个过程格式:过程名PROC过程属性返回指令RET 过程名ENDP过程属性:NEAR:缺省属性,表示段内调用/返回FAR:表示段间调用/返回,7、源程序结束伪指令END格式:END标号标号的地址必须是程序的入口地址,即第一条可执行语句功能:告诉汇编程序,源程序到此已经结束告诉汇编程序,源程序的入口地址是多少例:CODESEGMENTASSUME CS:CODEBEGIN:MOV AX,0;第一条指令语句CODEENDSEND BEGIN;源程序到此为止,8、高级数据结构定义伪指令(1)结构类型数据定义伪指令STRUC/ENDS 结构的定义:结构名STR
24、UC ;DB、DW之类的数据定义伪指令语句序列结构名ENDS例:DATASTRUCXDW0YDB1ZDD2DATAENDS结构定义时并没有分配存储空间,结构变量的申请与赋初值结构变量名结构名例:NEW _DATADATA;申请结构变量“NEW _DATA”,其中X=0,Y=1,Z=0;缺省的初始值表示使用定义时的预设值结构的访问结构变量名.字段名例:MOVAX,NEW_DATA.XMOVBL, NEW_DATA.Y,(2)记录定义伪指令RECORD记录的定义记录名RECORD字段说明,字段说明其中,字段说明的格式是:字段名:宽度=预赋值例:RECRECORDA:8=12H, B:5=10, C
25、:3定义了一个字,其中:A占高8位,预赋值=00010010BB占接下来5位,预赋值=10C占低3位,预赋值为空,记录变量的的申请与赋初值格式:记录变量名记录名例:REC_VARREC申请了一个变量REC_VAR,其值为:00010010B 00001B 010B 预赋值12H 初始化为1 初始化为2,记录的访问WIDTH操作符:求记录或记录中某个字段的宽度(即位数)。格式:WIDTH 记录名或记录字段名记录字段名:求该字段的最低位右移到所在记录最右边所需的移位次数MASK操作符:返回一个8位或16位二进制数,这个数中,对应于指定字段的各位均是1,其余各位均是0。格式:MASK 记录字段名例:
26、 MOV AX,REC_VAR ;AX0001001000001010B MOV BL,WIDTH REC_VAR ;BLREC_VAR的总宽度16 MOV BH,WIDTH A ;BH字段A的宽度8 MOV CL,B ;CL3 MOV DX,MASK C ;DX0000000000000111B,二、指令性语句,格式:标号:指令助记符操作数,操作数,;注释NIL指令NIL指令并不属于80x86的指令系统只用于宏汇编中 作用:保留一个空行 例:L:NIL;留下一个空行,方便以后对程序的修改LOOPL等价于:L:LOOP L,DOS系统功能调用介绍,系统功能调用由OS提供的一组实现特殊功能的子程
27、序供程序员在程序中调用,以减轻编程工作量。,系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。,用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INT n来实现。,在DOS系统中,功能调用都是用软中断指令INT 21H来实现的。,格式:将调用功能所需的入口参数存入指定的寄存器或存储单元中;在寄存器AH中存放所要调用功能的功能号;执行INT 21H指令,转入中断子程序;中断子程序运行完后,从指定的寄存器或存储单元中取得出口参数。,(1)单字符显示(功能号:02H)功能:将指定的字符送到显示器显示 例:MOVDL,A ;入口参数,DL存放字符的ASCI
28、I码MOVAH,02H ;02H号功能调用INT21H ;显示字符A(2)单字符输入(功能号:01H、07H)功能:从键盘输入字符AL例:MOVAH,01H;01H号键盘输入功能调用INT21H;AL输入字符的ASCII码,并显示字符07H号功能调用与01H号相似,但输入的字符没有在屏幕上显示,(3)检测键盘状态(功能号:0BH) 功能:检测当前时刻键盘是否有键按下。如果有,则出口参数AL=0FFH,否则AL=0。该功能不清除输入缓冲。例:循环运行程序段,直到有按键按下为止RUN: ;循环运行的程序段 MOV AH,0BH;0BH号功能调用 INT 21H;检测键盘状态 CMP AL,0 JZ
29、 RUN;AL=0表示没有键按下 MOV AH,01H;没有清除缓冲,仍可读到按键 INT 21H,(4)直接控制台I/O(功能号:06H)功能:输入 / 输出字符:入口参数DL=0FFH:检测当前时刻键盘是否有键按下。如果有,则出口参数AL=输入的字符,ZF=0,清除输入缓冲区;如果没有,则ZF=1。入口参数DL0FFH:将DL中的ASCII码送显示器上显示例:循环运行程序段,直到有按键按下为止RUN:;循环运行的程序段 MOV AH,06H;06H号功能调用 MOV DL,0FFH;DL=0FFH,输入功能调用 INT 21H;检测键盘状态 JZ RUN,(5)字符串显示(功能号:09H)
30、功能:将数据段中的字符串输出到屏幕上字符串的首地址DS:DX中,字符串一定要以字符$作为结尾标志例:DATASEGMENTSTRINGDBHELLO,0DH,0AH,$;需以$结尾DATAENDS代码段:MOVAX,DATAMOVDS,AX;DS字符串所在段的段地址LEADX,STRING ;DX字符串首地址的偏移量MOVAH,09H;09H号功能调用INT21H ;在屏幕上显示“HELLO”,(6)字符串输入(功能号:0AH)功能:字符串输入,回车键结束入口参数: DS:DX:缓冲区首地址(DS:DX):允许输入的最多字符数出口参数:(DS:DX+1):实际输入的字符数(不计回车)(DS:D
31、X+2)开始:输入的字符串(包括回车)例:BUFDB10H,100 DUP(?);输入字符数不超过16MOVAX,DATAMOVDS,AX;DS缓冲区所在段的段地址LEA DX,BUF;DX缓冲区首地址的偏移量MOVAH,0AH;0AH号功能调用INT 21H;输入字符串若输入“123”,则BUF中的内容为:10H,03H(输入3个字符),31H,32H,33H,0DH(回车),(7)打印输出(功能号:05H)功能:将DL寄存器中的字符送打印机打印例:MOVDL,A;需打印的字符AMOVAH,05H;05H号功能调用INT21H;送打印机打印(8)结束调用(功能号:4CH)功能:终止当前程序,
32、并返回到DOS中 例:MOVAH,4CHINT21H,第四节 宏汇编指令,一、宏操作伪指令,宏定义伪指令 MACRO、ENDM,取消宏定义伪指令 PURGE,重复伪指令 REPT、IRP、IRPC,局部符号伪指令 LOCAL,1、宏定义伪指令MACRO、ENDM格式:宏名MACRO 形式参数1,形式参数2,;宏体ENDM;宏定义结束例1:OUTPUTMACROMOVAH,02HINT21HENDM则:OUTPUT 等价于“MOV AH,02H,INT 21H”,例2:OUTPUTMACROASC ;“ASC”为形式参数MOVDL,ASCMOVAH,02HINT21HENDM则:OUTPUT30
33、H等价于:MOVDL,30HMOVAH,02HINT21H,2、取消宏定义伪指令PURGE功能:使用MACRO定义的宏,如果不再需要,就可以用PURGE来注销格式:PURGE宏名1、宏名2,例:PURGEOUTPUT,3、重复伪指令REPT、IRP、IRPCREPT格式:REPT 表达式;宏体ENDM功能:重复执行宏体中的语句,重复次数为表达式的值。例如,下面的宏能将AL中的值逻辑左移4位:REPT4SHLAL,1ENDM,IRP格式:IRP形式参量,;宏体ENDM功能:重复执行宏体,重复的次数是由参数的个数决定例,把AX、BX、CX、DX都压入栈中:IRPREG,PUSHREGENDM,IR
34、PC格式:IRPC形式参量,字符串 ;宏体ENDM功能:重复执行宏体,其参数列表是字符串,一个字符为一个参数例如:IRPCNUM,1234;“1234”表示4个参数1、2、3、4DBNUMENDM等效于:DB1,2,3,4,4、局部符号伪指令LOCAL格式:LOCAL标号、变量等的列表功能:将宏中的标号定义为局部符号,避免重复例:,错误:IRPREG,LAB:PUSHREGENDM展开后:LAB:PUSHAXLAB:PUSHBX(LAB重复使用,出错),正确:IRPREG,LOCALLABLAB:PUSHREGENDM展开后:?0000:PUSHAX?0001:PUSHBX,二、条件汇编,格式
35、:IFxx ;条件块1ELSE;条件块2ENDIF功能:根据某个表达式的真假,决定是否对指定的程序段进行编译,第五节 编写完整的汇编语言程序,一、汇编语言程序与MS-DOS,二、一般的汇编语言程序的整体框架,三、模块化程序设计的思想,一、汇编语言程序与MS-DOS,1、DOS的装入功能确定用于存放程序的内存地址空间建立程序段前缀PSP(Program Segment Prefix)100H个字节,存放程序有关信息及进程间的控制信息最开始的两个字节是一条INT 20H软中断指令在PSP后装入可执行程序:数据段附加段代码段堆栈段,初始化各个相关寄存器的值:DS、ES:PSP所在段的段地址CS、IP
36、:程序的入口地址入口地址 = 第一条可执行语句的段地址和偏移量这个地址是从END语句中标号的地址属性得到的SS初始化为堆栈段的段地址SP指向堆栈段的栈底,2、DOS的返回,方法一:执行PSP中的“INT 20H”指令:CSPSP的段地址IP0具体过程:程序开头:PUSH DS;开始时(DS)=PSP的段地址MOV AX,0PUSH AX;“0”入栈程序过程,要求PUSH与POP配对程序结束:RET;CSPSP的段地址,IP0,例:CODESEGMENTASSUMECS:CODEMAINPROCFARBEGIN:PUSHDS;PSP的段地址入栈MOVAX,0;INT 20H的偏移量为0PUSHA
37、X;把偏移量入栈RET;IP0,CSPSP段地址MAINENDPCODEENDSENDBEGIN,方法二:调用DOS系统的4CH 功能,实现DOS返回:MOVAH,4CHINT21H例:CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,4CH;返回DOSINT21HCODEENDSENDBEGIN,二、一般的汇编语言程序的整体框架,数据段、附加段,堆栈段,ASSUME伪指令,代码段,END伪指令,注释,源程序结构框架框架一:DATASEGMENT;数据段;定义变量、缓冲区等DATAENDSSTACKSEGMENT PARA STACK STACK ;堆栈段部分DBXXXX
38、 DUP(?);定义堆栈的长度STACKENDSCODESEGMENT;代码段部分ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAMAINPROCFARBEGIN:PUSHDSMOVAX,0; 为RET提供转移地址PUSHAX,数据段,堆栈段,MOVAX,DATAMOVDS,AX;初始化段寄存器DS、ESMOVES,AX;程序部分RET;返回DOSMAINENDPPROC_1PROCNEAR/FAR;定义其他过程RETPROC_1ENDPCODEENDSENDMAIN,框架二:采用“4CH”功能返回:(代码段部分)CODESEGMENT;代码段ASSUMECS:C
39、ODE,DS:DATA,&SS:STACK,ES:DATABEGIN:MOVAX,DATAMOVDS,AX;初始化DS、ESMOVES,AX;程序部分MOVAH,4CH;4CH号功能调用INT21H;返回DOSCODEENDSENDBEGIN,三、模块化程序设计的思想,1、模块命名伪指令NAME、TITLE格式:NAME模块名TITLE模块名作用:为模块命名,指示给连接程序进行连接用2、逻辑段与物理段编译连接时,同类逻辑段将组合成一个大的物理段,3、同类名的组合方式PRIVATE(缺省方式):不组合PUBLIC:同类名段按照前后次序连接在一起COMMON:与其他模块中的同类名段有相同的起始物理
40、地址STACK:与其他模块中的同类名段用覆盖的方式连接,从高地址开始覆盖MEMORY:该段必须放在同类名的各个段中的最后AT表达式:直接指定该段的段地址,4、模块之间的通信PUBLIC与EXTRN:格式:PUBLIC 标识符,标识符,EXTRN 标识符:属性,标识符:属性,功能:PUBLIC:说明模块中某些标识符可以被其它模块访问EXTRN:说明本模块中哪些标识符是外部的,以及这些标 识符的属性是什么,例:模块1:NAMEMOD1PUBLICVAR1;公用标识符VAR1DATA1SEGMENT PARA PUBLIC DATAVAR1 DB ? ;字节变量VAR1DATA1ENDS模块2:NAMEMOD2EXTRNVAR1:BYTE;说明VAR1是字节CODE2SEGMENT PARA PUBLIC CODEMOVAL,VAR1;访问MOD1中的字节变量VAR1,