资源描述
第二级,第三级,第四级,第五级,汇编语言程序格式,汇编语言程序格式,汇编语言程序格式,一、汇编语句类型和格式,1语句类型,硬指令语句(指令性语句),是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成,伪指令语句(指示性语句),是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编,宏指令语句,是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入,一、汇编语句类型和格式1语句类型,2语句的格式,(1)执行性语句,标号,:,硬指令助记符 操作数,操作数 ;注释,(2)说明性语句,名字 伪指令助记符 参数,参数 ;注释,2语句的格式,二、完整段定义格式,8086按照逻辑段组织程序,,具有代码段、数据段、附加段和堆栈段,一个,汇编语言源程序可以包括若干个代码段、数据段或堆栈段,段与段之间的顺序可以随意排列。,逻辑段用汇编语言源程序中的,段定义伪指令,来定义,二、完整段定义格式 8086按照逻辑段组织程序,具有代码段、,二、完整段定义格式,完整段定义伪指令,指定段寄存器伪指令,段寄存器的装入,可执行程序的正常结束,二、完整段定义格式 完整段定义伪指令,1完整段定义伪指令(SEGMENT、ENDS),作用:,控制汇编程序和连接程序在内存中组织代码和数据的方式。,格式:,段名,SEGMENT,定位类型,组合类型,类别名,段名,ENDS,注意:,SEGMENT和ENDS总是,成对出现,中间省略部分称为,段体,。对代码段来说,则主要是程序代码;对其它段来说,一般用于变量、符号等的定义,方括号中的为可选项,当有可选项时,各项顺序不能错,,可选项之间用空格隔开,1完整段定义伪指令(SEGMENT、ENDS),(1)段名,段名是用户自定义的,但不要与指令助记符或伪指令重名,用来,指示汇编程序为该段分配的存储区的首地址,段名有段地址和偏移地址两个属性,段开始和段结束的段名必须相同,(1)段名,(2)定位类型,说明,段的起始地址的边界要求,,指示连接程序按定位类型提出的要求,安排各段在内存的,相互衔接方式,。它有5种可选择类型:,BYTE:,段的起始地址可以从任何地址开始,。,段起始地址(20位):,B,WORD:段的起始地址必须以,偶地址开始,段起始地址(20位):,0 B,(2)定位类型,DWORD:段的起始地址,必须为4的倍数,段起始地址(20位):,0 0 B,PARA:段的起始地址必须,从小段边界开始,段起始地址(20位):,0 0 0 0 B,PAGE:段的起始地址,必须从页的边界开始,段起始地址(20位):,0 0 0 0 0 0 0 0 B,如未指定定位类型,则汇编程序默认为PARA。,DWORD:段的起始地址必须为4的倍数,(3)组合类型,当程序有多个段时,组合类型用来说明,段与段之间是怎样连接和定位的,,共有6种组合类型:,不指定或称隐含方式:表示本段与其他模块中的,同名段无连接关系,,它将作为一个独立的段运行。,PUBLIC:,本段与其他模块中说明为PUBLIC方式的同名段顺序连接,组成一个大的逻辑段,它们共用同一个段起始地址。,COMMON:本段与其他模块中说明为COMMON方式的,同名段从同一地址开始重叠连接,,段长是同名段中最长的段的长度。,(3)组合类型,STACK:表示,该段是堆栈段的一部分。把所有相同 类别名的具有STACK组合类型的段连接成一个连续段,,该段长度为各原有段的总和。将,连续段首地址送SS,段内最大偏移地址送SP,(SP指向栈顶)。当,定义了STACK属性后,在主程序中可省略对SS和SP的初始化,。,MEMORY:与PUBLIC同义。,STACK:表示该段是堆栈段的一部分。把所有相同 类别,(4)类别名,类别名必须用单引号括起来。连接时对不同模块、不同名的程序段只要,类别名相同,,则,放在一个连续的物理空间,,但每段之间是独立的,不进行组合。,(4)类别名,2指定段寄存器伪指令(ASSUME),作用:,明确段和段寄存器之间的关系,,即,告诉汇编程序,在运行期间通过哪个段才能找到所要的指令和数据,格式:,ASSUME,段寄存器名:段名,,,段寄存器名:段名,例如:ASSUME CS:CODE,DS:DATA,SS:STACK,2指定段寄存器伪指令(ASSUME),3段寄存器的装入,ASSUME伪指令只是指出各段和段寄存器之间的关系,但并未真正将段基地址装入相应的段寄存器中,所以,在程序的代码段开始处,就应该先进行,段基址的装入,数据段DS、附加段ES和堆栈段SS的,段基址由用户程序代码装入,代码段CS在加载程序后由系统自动装入,3段寄存器的装入,(1)DS、ES的装入,MOV AX,DATA ;数据段段基地址送AX寄存器,MOV DS,AX ;AX寄存器的内容送数据段寄存器DS,或,MOV AX,SEG X ;变量X所在数据段的段基址送AX寄存器,MOV DS,AX,(1)DS、ES的装入,(2)CS的装入,对CS和IP的装入方法是利用,END后的,标号来完成的。,如:,START:,END,START,系统自动将START所在段的段地址送CS寄存器,将START所在,段内的偏移地址,送IP寄存器,。,(2)CS的装入,(3)SS的装入,方法1:,由系统自动装填。,要求在,定义堆栈段时,必须把参数写全。,这时,将程序装入内存,系统会自动地把堆栈段地址和堆栈指针置入SS和SP中,因而可以不在代码段中装入SS和SP的值。,STACK1 SEGMENT,PARA STACK STACK,DB 50H DUP(?),STACK1 ENDS,(3)SS的装入,方法2:,手动装填,STACK1 SEGMENT PARA,DW 50H DUP(?),TOP LABEL WORD;TOP属性为WORD,STACK1 ENDS,CODE SEGMENT,ASSUME CS:CODE,SS:STACK1,START:,MOV AX,STACK1,MOV SS,AX ;堆栈段的段地址送SS,MOV SP,OFFSET TOP;堆栈段的栈顶地址送SP,TOP是该堆栈的初始栈顶部地址。,方法2:手动装填,4操作系统下,可执行程序的正常结束,方法1(非标准方法):,在CODE ENDS之前增加如下语句:,MOV AX,4C00H,INT 21H,方法2(标准方法):,MAIN PROC FAR,PUSH DS;保存原来的PSP段地址,MOV AX,0H;0送AX,PUSH AX;0压栈,RET;返回DOS,MAIN ENDP,4操作系统下可执行程序的正常结束,完整段定义的源程序格式,DATA SEGMENT,;定义数据段DATA,STRINGDB Hello,Everybody!,0DH,0AH,$,DATA ENDS,;数据段结束,CODE SEGMENT,;定义代码段CODE,ASSUME CS:CODE,DS:DATA,;确定CS、DS、SS指向的逻辑段,START:,MOV AX,DATA,;设置数据段的段地址DS,MOV DS,AX,MOV DX,OFFSET STRING;利用功能调用显示信息,MOV AH,9,INT 21H,MOV AH,4CH ;利用系统功能调用返回DOS,INT 21H,CODE ENDS,;代码段结束,END START,;汇编结束,完整段定义的源程序格式,三、简化段定义格式,简化的段定义,书写简单,,,有利于,实现汇编语言程序模块与高级语言程序模块的,连接,,它可以由操作系统自动安排段序,自动保证名字定义的一致性。,三、简化段定义格式 简化的段定义书写简单,有利于实现汇,1存储模式选择伪操作(MODEL),格式:,MODEL 模式类型,功能:,本语句,一般放在段定义之前,,用来,说明在存储器中是如何安放各个段,的。,模式类型说明代码段、数据段在程序中如何安排;代码、数据的寻址是近还是远。,根据它们的不同组合,模式类型可以有如下5种,。,1存储模式选择伪操作(MODEL),Tiny模式:也叫微模式,,所有数据及代码放入同一个物理段内,,该模式用于编写较小的源程序,这种模式的源程序最终可以形成,COM文件,。,Small:也叫小模式,,所有数据放入一个 64KB的段中,所有代码放入另一个64KB的段中,,即程序中只有一个数据段和一个代码段这是一般应用程序最常用的一种模式。,Tiny模式:也叫微模式,所有数据及代码放入同一个物理段,Medium:也叫中模式:,所有数据放入一个 64KB的段中,代码可以放入多于一个的段中,,即,程序中可以有多个代码段,。,Compact:,也叫压缩模式,所有代码放入一个64KB的段中;数据可以放入多于一个的段中,,即程序中,可以有多个数据段,。,Large:也叫大模式,代码和数据都可以分别放入多于一个的段中,即程序中,可以有多个代码段和多个数据段,。,Medium:也叫中模式:所有数据放入一个 64KB的段,2数据段定义伪指令(.DATA),格式:.DATA 名字,定义一个数据段,如果,有多个数据段,则用名字来区别:,只有一个数据段时,,隐含段名为DATA。,3堆栈段定义伪指令(.STACK),格式:.STACK 长度,定义一个堆栈段,并形成SS及SP的初值,SP的默认值为1024,隐含段名为STACK。,可选的长度参数指定堆栈段所占存储区的字节数,默认大小是,1KB,。,2数据段定义伪指令(.DATA),4代码段定义伪指令(.CODE),格式:.CODE 名字,定义一个代码段,如果有,多个代码段,则用名字来 区别,:只有一个代码段时,,隐含段名为CODE,。,5程序开始伪指令(.STARTUP),格式:.STARTUP,产生程序开始执行的代码,,同时还,指定了程序开始执行的起点。,在小模式下,,可以省略将数据段基址装入DS的语句,。,4代码段定义伪指令(.CODE),6程序返回伪指令(.EXIT),格式:.EXIT 参数,功能:.EXIT产生终止程序执行返回操作系统的指令代码。可选参数是一个返回的数码,通常用0代表没有错误,例如:.EXIT 0对应的代码是:,MOV AX,4C00H,INT 21H,6程序返回伪指令(.EXIT),简化段定义的源程序格式,MODELSMALL,;定义程序的存储模式,STACK,;定义堆栈段,DATA,;定义数据段,STRING DB Hello,Everybody!,0DH,0AH,$,;在数据段定义要显示的字符串,CODE,;定义代码段,STARTUP,;说明程序起始位置,并建立DS、SS内容,MOV DX,OFFSET STRING;指定字符串在数据段的偏移地址,MOV AH,9,INT 21H ;利用DOS功能调用显示信息,EXIT 0,;程序结束点,返回DOS,END,;汇编结束,简化段定义的源程序格式,简化段定义的源程序格式,MODELSMALL,;定义程序的存储模式,STACK,;定义堆栈段,DATA,;定义数据段,STRING DB Hello,Everybody!,0DH,0AH,$,;在数据段定义要显示的字符串,CODE,;定义代码段,Start:,MOV AX,DATA,MOV DS,A,;说明程序起始位置,并建立DS、SS内容,MOV DX,OFFSET STRING;指定字符串在数据段的偏移地址,MOV AH,9,INT 21H ;利用DOS功能调用显示信息,MOV AH,4cH,INT 21H,;程序结束点,返回DOS,END start,;汇编结束,简化段定义的源程序格式,综合练习,在数据段定义一字节变量,存储一个0-9之间的十进制数,(1)编写汇编语言源程序,将该十进制数显示到屏幕上,(2)用debug将汇编生成的可执行文件调入内存,查看数据段的内容,(3)在内存中修改数据段中定义的十进制数,用t或g命令显示运行结果,思考:,(1)如何在屏幕上显示一个两位的十六进制数,(2)如何在屏幕上显示一个两位的十进制数,综合练习在
展开阅读全文