1、汇编语言程序格式汇编语言程序格式汇编语言程序格式汇编语言程序格式汇编语言程序格式汇编语言程序格式一、汇编语句类型和格式一、汇编语句类型和格式1 1语句类型语句类型硬指令语句(指令性语句)是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成伪指令语句(指示性语句)是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编宏指令语句 是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入汇编语言程序格式汇编语言程序格式2 2语句的格式语句的格式(1 1)执行性语句)执行性语句 标号标号:硬指令助记符硬指令助记符 操作数,操作数操作数,操
2、作数 ;注释;注释(2 2)说明性语句)说明性语句 名字名字 伪指令助记符伪指令助记符 参数,参数参数,参数 ;注释;注释汇编语言程序格式汇编语言程序格式 8086按照逻辑段组织程序,具有代码段、数据段、附加段和堆栈段一个汇编语言源程序可以包括若干个代码段、数据段或堆栈段段与段之间的顺序可以随意排列。逻辑段用汇编语言源程序中的段定义伪指令段定义伪指令来定义汇编语言程序格式汇编语言程序格式 完整段定义伪指令 指定段寄存器伪指令 段寄存器的装入 可执行程序的正常结束汇编语言程序格式汇编语言程序格式1 1完整段定义伪指令(完整段定义伪指令(SEGMENTSEGMENT、ENDSENDS)作用:作用:
3、控制汇编程序和连接程序在内存中组织代码和数据的方式。控制汇编程序和连接程序在内存中组织代码和数据的方式。格式:格式:段名段名 SEGMENTSEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 段名段名 ENDSENDS注意:注意:uSEGMENTSEGMENT和和ENDSENDS总是总是成对出现成对出现u中间省略部分称为中间省略部分称为段体段体。对代码段来说,则主要是程序代码;。对代码段来说,则主要是程序代码;对其它段来说,一般用于变量、符号等的定义对其它段来说,一般用于变量、符号等的定义u方括号中的为可选项,当有可选项时方括号中的为可选项,当有可选项时各项顺序不能错各项顺序不能
4、错,可选,可选项之间用空格隔开项之间用空格隔开汇编语言程序格式汇编语言程序格式(1)(1)段名段名 段名是用户自定义的,但不要与指令助记符或伪指令段名是用户自定义的,但不要与指令助记符或伪指令重名重名 用来用来指示汇编程序为该段分配的存储区的首地址指示汇编程序为该段分配的存储区的首地址 段名有段地址和偏移地址两个属性段名有段地址和偏移地址两个属性 段开始和段结束的段名必须相同段开始和段结束的段名必须相同汇编语言程序格式汇编语言程序格式(2)(2)定位类型定位类型 说明说明段的起始地址的边界要求段的起始地址的边界要求,指示连接程序按定位类,指示连接程序按定位类型提出的要求,安排各段在内存的型提出
5、的要求,安排各段在内存的相互衔接方式相互衔接方式。它有。它有5 5种可种可选择类型:选择类型:BYTE BYTE:段的起始地址可以从任何地址开始段的起始地址可以从任何地址开始。段起始地址段起始地址(20(20位位):B B WORDWORD:段的起始地址必须以:段的起始地址必须以偶地址开始偶地址开始 段起始地址段起始地址(20(20位位):0 B0 B汇编语言程序格式汇编语言程序格式 DWORD DWORD:段的起始地址:段的起始地址必须为必须为4 4的倍数的倍数 段起始地址段起始地址(20(20位位):0 0 B0 0 B PARA PARA:段的起始地址必须:段的起始地址必须从小段边界开始
6、从小段边界开始 段起始地址段起始地址(20(20位位):0 0 0 0 B 0 0 0 0 B PAGEPAGE:段的起始地址:段的起始地址必须从页的边界开始必须从页的边界开始 段起始地址段起始地址(20(20位位):0 0 0 0 0 0 0 0 B 0 0 0 0 0 0 0 0 B如未指定定位类型,则汇编程序默认为如未指定定位类型,则汇编程序默认为PARAPARA。汇编语言程序格式汇编语言程序格式(3)(3)组合类型组合类型 当程序有多个段时,组合类型用来说明段与段之间是怎样连接和定位的,共有6种组合类型:不指定或称隐含方式:表示本段与其他模块中的同名段无连接关系,它将作为一个独立的段运
7、行。PUBLIC:本段与其他模块中说明为PUBLIC方式的同名段顺序连接,组成一个大的逻辑段,它们共用同一个段起始地址。COMMON:本段与其他模块中说明为COMMON方式的同名段从同一地址开始重叠连接,段长是同名段中最长的段的长度。汇编语言程序格式汇编语言程序格式 STACK STACK:表示:表示该段是堆栈段的一部分。把所有相同该段是堆栈段的一部分。把所有相同 类类别名别名的具有的具有STACKSTACK组合类型的段连接成一个连续段组合类型的段连接成一个连续段,该段,该段长度为各原有段的总和。将长度为各原有段的总和。将连续段首地址送连续段首地址送SSSS,段内最大,段内最大偏移地址送偏移地
8、址送SPSP(SPSP指向栈顶)。当指向栈顶)。当定义了定义了STACKSTACK属性后,在属性后,在主程序中可省略对主程序中可省略对SSSS和和SPSP的初始化的初始化。MEMORY MEMORY:与:与PUBLICPUBLIC同义。同义。汇编语言程序格式汇编语言程序格式(4)(4)类别名类别名 类别名必须用单引号括起来。连接时对不同模块、类别名必须用单引号括起来。连接时对不同模块、不同名的程序段只要不同名的程序段只要类别名类别名相同相同,则,则放在一个连续放在一个连续的物理空间的物理空间,但每段之间是独立的,不进行组合。,但每段之间是独立的,不进行组合。汇编语言程序格式汇编语言程序格式2
9、2指定段寄存器伪指令(指定段寄存器伪指令(ASSUMEASSUME)作用:作用:明确段和段寄存器之间的关系明确段和段寄存器之间的关系,即,即告诉汇编程序,告诉汇编程序,在运行期间通过哪个段才能找到所要的指令和数据在运行期间通过哪个段才能找到所要的指令和数据 格式:格式:ASSUMEASSUME 段寄存器名:段名段寄存器名:段名,段寄存器名:段名段寄存器名:段名 例如:例如:ASSUME CSASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACK汇编语言程序格式汇编语言程序格式3 3段寄存器的装入段寄存器的装入 ASSUME伪指令只是指出各段和段寄存器之
10、间的关系,但并未真正将段基地址装入相应的段寄存器中,所以在程序的代码段开始处就应该先进行段基址的装入 数据段DS、附加段ES和堆栈段SS的段基址由用户程序代码装入 代码段CS在加载程序后由系统自动装入汇编语言程序格式汇编语言程序格式(1)DS(1)DS、ESES的装入的装入 MOV AXMOV AX,DATA DATA ;数据段段基地址送;数据段段基地址送AXAX寄存器寄存器 MOV DSMOV DS,AX AX ;AXAX寄存器的内容送数据段寄存器寄存器的内容送数据段寄存器DSDS或或 MOV AXMOV AX,SEG X SEG X ;变量;变量X X所在数据段的段基址送所在数据段的段基址
11、送AXAX寄存器寄存器 MOV DSMOV DS,AXAX汇编语言程序格式汇编语言程序格式(2)CS(2)CS的装入的装入 对对CSCS和和IPIP的装入方法是利用的装入方法是利用ENDEND后的后的标号来完成的。标号来完成的。如:如:STARTSTART:END END STARTSTART 系统自动将系统自动将STARTSTART所在段的段地址送所在段的段地址送CSCS寄存器,将寄存器,将STARTSTART所在所在段内的偏移地址段内的偏移地址送送IPIP寄存器寄存器。汇编语言程序格式汇编语言程序格式(3)SS(3)SS的装入的装入方法方法1 1:由系统自动装填。由系统自动装填。要求在要求
12、在定义堆栈段时,必须把定义堆栈段时,必须把参数写全。参数写全。这时,将程序装入内存,系统会自动地把堆这时,将程序装入内存,系统会自动地把堆栈段地址和堆栈指针置入栈段地址和堆栈指针置入SSSS和和SPSP中,因而可以不在代码中,因而可以不在代码段中装入段中装入SSSS和和SPSP的值。的值。STACK1 SEGMENT STACK1 SEGMENT PARA STACK STACKPARA STACK STACKDB 50H DUP(?)DB 50H DUP(?)STACK1 ENDSSTACK1 ENDS汇编语言程序格式汇编语言程序格式方法方法2 2:手动装填手动装填STACK1 SEGMEN
13、T PARASTACK1 SEGMENT PARADW 50H DUP(?)DW 50H DUP(?)TOP LABEL WORDTOP LABEL WORD;TOPTOP属性为属性为WORDWORDSTACK1 ENDSSTACK1 ENDSCODE SEGMENTCODE SEGMENTASSUME CSASSUME CS:CODECODE,SSSS:STACK1STACK1STARTSTART:MOV AXMOV AX,STACK1STACK1MOV SSMOV SS,AXAX ;堆栈段的段地址送;堆栈段的段地址送SSSSMOV SPMOV SP,OFFSET TOPOFFSET TOP
14、;堆栈段的栈顶地址送;堆栈段的栈顶地址送SPSPTOPTOP是该堆栈的初始栈顶部地址。是该堆栈的初始栈顶部地址。汇编语言程序格式汇编语言程序格式4 4操作系统下操作系统下可执行程序的正常结束可执行程序的正常结束方法方法1(1(非标准方法非标准方法):):在在CODE ENDSCODE ENDS之前增加如下语句:之前增加如下语句:MOV AXMOV AX,4C00H4C00H INT 21H INT 21H方法方法2(2(标准方法标准方法):):MAIN PROC FARMAIN PROC FARPUSH DSPUSH DS ;保存原来的;保存原来的PSPPSP段地址段地址MOV AXMOV A
15、X,0H0H ;0 0送送AX AX PUSH AXPUSH AX ;0 0压栈压栈RETRET ;返回;返回DOSDOSMAIN ENDPMAIN ENDP汇编语言程序格式汇编语言程序格式完整段定义的源程序格式完整段定义的源程序格式 DATA SEGMENTDATA SEGMENT;定义数据段;定义数据段DATADATA STRING STRINGDB HelloDB Hello,Everybody Everybody!,0DH0DH,0AH0AH,$DATA ENDSDATA ENDS;数据段结束;数据段结束 CODE SEGMENTCODE SEGMENT ;定义代码段;定义代码段COD
16、E CODE ASSUME CSASSUME CS:CODECODE,DSDS:DATADATA ;确定;确定CSCS、DSDS、SSSS指向的逻辑段指向的逻辑段 STARTSTART:MOV AXMOV AX,DATADATA ;设置数据段的段地址;设置数据段的段地址DSDS MOV DSMOV DS,AXAX MOV DX MOV DX,OFFSET STRINGOFFSET STRING;利用功能调用显示信息;利用功能调用显示信息 MOV AHMOV AH,9 9 INT 21H INT 21H MOV AH MOV AH,4CH 4CH ;利用系统功能调用返回;利用系统功能调用返回DO
17、SDOS INT 21H INT 21H CODE ENDS CODE ENDS ;代码段结束;代码段结束 END START END START ;汇编结束;汇编结束汇编语言程序格式汇编语言程序格式 简化的段定义简化的段定义书写简单书写简单,有利于有利于实现汇编语言程序模块实现汇编语言程序模块与高级语言程序模块的与高级语言程序模块的连接连接,它可以由操作系统自动安排段,它可以由操作系统自动安排段序,自动保证名字定义的一致性。序,自动保证名字定义的一致性。汇编语言程序格式汇编语言程序格式1 1存储模式选择伪操作存储模式选择伪操作(MODEL)MODEL)格式:格式:功能:功能:本语句本语句一般
18、放在段定义之前一般放在段定义之前,用来,用来说明在存储器中说明在存储器中是如何安放各个段是如何安放各个段的。的。模式类型说明代码段、数据段在程序中如何安排;模式类型说明代码段、数据段在程序中如何安排;代码、数据的寻址是近还是远。代码、数据的寻址是近还是远。根据它们的不同组合,模式类型可以有如下根据它们的不同组合,模式类型可以有如下5 5种种。汇编语言程序格式汇编语言程序格式 Tiny Tiny模式:也叫微模式,模式:也叫微模式,所有数据及代码放入同一个物所有数据及代码放入同一个物理段内理段内,该模式用于编写较小的源程序,这种模式的源程,该模式用于编写较小的源程序,这种模式的源程序最终可以形成序
19、最终可以形成COMCOM文件文件。SmallSmall:也叫小模式,:也叫小模式,所有数据放入一个所有数据放入一个 64KB64KB的段中,的段中,所有代码放入另一个所有代码放入另一个64KB64KB的段中的段中,即程序中只有一个数据,即程序中只有一个数据段和一个代码段这是一般应用程序最常用的一种模式。段和一个代码段这是一般应用程序最常用的一种模式。汇编语言程序格式汇编语言程序格式 Medium Medium:也叫中模式:也叫中模式:所有数据放入一个所有数据放入一个 64KB64KB的段的段中,代码可以放入多于一个的段中中,代码可以放入多于一个的段中,即,即程序中可以有多程序中可以有多个代码段
20、个代码段。CompactCompact:也叫压缩模式,所有代码放入一个也叫压缩模式,所有代码放入一个64KB64KB的的段中;数据可以放入多于一个的段中段中;数据可以放入多于一个的段中,即程序中,即程序中可以有可以有多个数据段多个数据段。LargeLarge:也叫大模式,代码和数据都可以分别放入多:也叫大模式,代码和数据都可以分别放入多于一个的段中,即程序中于一个的段中,即程序中可以有多个代码段和多个数据可以有多个代码段和多个数据段段。汇编语言程序格式汇编语言程序格式2 2数据段定义伪指令数据段定义伪指令(.DATA)(.DATA)格式:格式:.DATA .DATA 名字名字 定义一个数据段,
21、如果定义一个数据段,如果有多个数据段,则用名字来区有多个数据段,则用名字来区别:别:只有一个数据段时,只有一个数据段时,隐含段名为隐含段名为DATADATA。3 3堆栈段定义伪指令堆栈段定义伪指令(.STACK)(.STACK)格式:格式:.STACK .STACK 长度长度 定义一个堆栈段,并形成定义一个堆栈段,并形成SSSS及及SPSP的初值,的初值,SPSP的默认值的默认值为为10241024,隐含段名为,隐含段名为STACKSTACK。可选的长度参数指定堆栈可选的长度参数指定堆栈段所占存储区的字节数,默认大小是段所占存储区的字节数,默认大小是1KB1KB。汇编语言程序格式汇编语言程序格
22、式4 4代码段定义伪指令代码段定义伪指令(.CODE)(.CODE)格式:格式:.CODE .CODE 名字名字 定义一个代码段,如果有定义一个代码段,如果有多个代码段,则用名字来多个代码段,则用名字来 区区别别:只有一个代码段时,:只有一个代码段时,隐含段名为隐含段名为CODECODE。5 5程序开始伪指令程序开始伪指令(.STARTUP)(.STARTUP)格式:格式:.STARTUP.STARTUP 产生程序开始执行的代码产生程序开始执行的代码,同时还,同时还指定了程序开始执指定了程序开始执行的起点。行的起点。在小模式下,在小模式下,可以省略将数据段基址装入可以省略将数据段基址装入DSD
23、S的语句的语句。汇编语言程序格式汇编语言程序格式6 6程序返回伪指令程序返回伪指令(.EXIT)(.EXIT)格式:格式:.EXIT .EXIT 参数参数 功能:功能:.EXIT.EXIT产生终止程序执行返回操作系统的指令代产生终止程序执行返回操作系统的指令代码。可选参数是一个返回的数码,通常用码。可选参数是一个返回的数码,通常用0 0代表代表没有错误没有错误 例如:例如:.EXIT 0.EXIT 0对应的代码是:对应的代码是:MOV AXMOV AX,4C00H4C00H INT 21H INT 21H汇编语言程序格式汇编语言程序格式简化段定义的源程序格式简化段定义的源程序格式MODELMO
24、DEL SMALLSMALL ;定义程序的存储模式;定义程序的存储模式STACKSTACK;定义堆栈段;定义堆栈段DATADATA ;定义数据段;定义数据段 STRING DB HelloSTRING DB Hello,Everybody!Everybody!,0DH0DH,0AH0AH,$;在数据段定义要显示的字符串;在数据段定义要显示的字符串CODECODE ;定义代码段;定义代码段STARTUPSTARTUP ;说明程序起始位置,并建立;说明程序起始位置,并建立DSDS、SSSS内容内容 MOV DXMOV DX,OFFSET STRINGOFFSET STRING;指定字符串在数据段的
25、偏移地址;指定字符串在数据段的偏移地址 MOV AHMOV AH,9 9 INT 21H INT 21H ;利用;利用DOSDOS功能调用显示信息功能调用显示信息EXIT 0EXIT 0 ;程序结束点,返回;程序结束点,返回DOSDOS ENDEND ;汇编结束;汇编结束汇编语言程序格式汇编语言程序格式简化段定义的源程序格式简化段定义的源程序格式MODELMODEL SMALLSMALL ;定义程序的存储模式;定义程序的存储模式STACKSTACK;定义堆栈段;定义堆栈段DATADATA ;定义数据段;定义数据段 STRING DB HelloSTRING DB Hello,Everybody
26、!Everybody!,0DH0DH,0AH0AH,$;在数据段定义要显示的字符串;在数据段定义要显示的字符串CODECODE ;定义代码段;定义代码段Start:Start:MOV AX,DATA MOV AX,DATA MOV DS,A MOV DS,A ;说明程序起始位置,并建立;说明程序起始位置,并建立DSDS、SSSS内容内容 MOV DXMOV DX,OFFSET STRINGOFFSET STRING ;指定字符串在数据段的偏移地址;指定字符串在数据段的偏移地址 MOV AHMOV AH,9 9 INT 21H INT 21H ;利用;利用DOSDOS功能调用显示信息功能调用显示
27、信息 MOV AH,4cHMOV AH,4cH INT 21H INT 21H ;程序结束点,返回;程序结束点,返回DOSDOS END startEND start ;汇编结束;汇编结束汇编语言程序格式汇编语言程序格式综合练习综合练习在数据段定义一字节变量,存储一个在数据段定义一字节变量,存储一个0-90-9之间的十进制数之间的十进制数(1 1)编写汇编语言源程序,将该十进制数显示到屏幕上)编写汇编语言源程序,将该十进制数显示到屏幕上(2 2)用)用debugdebug将汇编生成的可执行文件调入内存,查看将汇编生成的可执行文件调入内存,查看数据段的内容数据段的内容(3 3)在内存中修改数据段
28、中定义的十进制数,用)在内存中修改数据段中定义的十进制数,用t t或或g g命命令显示运行结果令显示运行结果思考:思考:(1)(1)如何在屏幕上显示一个两位的十六进制数如何在屏幕上显示一个两位的十六进制数(2)(2)如何在屏幕上显示一个两位的十进制数如何在屏幕上显示一个两位的十进制数汇编语言程序格式汇编语言程序格式 DATA SEGMENT DATA SEGMENT A DB 6 A DB 6 DATA ENDS DATA ENDS CODE SEGMENT CODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA START START:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX MOV DL,6 MOV DL,6 ADD DL,30H ADD DL,30H MOV AH,2 MOV AH,2 INT 21H INT 21H MOV AH MOV AH,4CH4CH INT 21H INT 21H CODE ENDS CODE ENDS END START END START
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。