《汇编语言程序格式》PPT课件.ppt
《《汇编语言程序格式》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序格式》PPT课件.ppt(78页珍藏版)》请在三一办公上搜索。
1、 汇编程序功能 伪操作 汇编语言程序格式 汇编语言程序的上机过程,第3章 汇编语言程序结构,编辑程序,.ASM 文件,汇编程序,.OBJ 文件,连接程序,.EXE 文件,文本编辑器,MASM,LINK,汇编语言程序的建立及执行过程:,在计算机上运行汇编语言程序的步骤是:用编辑程序(任何一种文本编辑程序)建立ASM文件;用MASM程序把ASM文件转换成OBJ文件;用LINK程序把OBJ文件转换成EXE文件;用DOS命令直接键入文件名就可执行该程序;用调试程序DEBUG(或CODEVIEW)跟踪调试程序。,4.1 汇编程序功能,汇编程序功能,汇编程序的主要功能:检查源程序,给出出错信息;处理伪操作
2、(伪指令);展开宏指令;产生目标文件(.obj)和列表文件(.lst)。,4.2 伪操作(伪指令),伪操作是汇编程序对源程序进行汇编时处理的操作,(不像机器指令那样是程序运行期间由计算机来执行的)完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。,处理器选择伪操作 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作,.8086 选择 8086 指令系统.286 选择 80286 指令系统.286P 选择保护模式下的 80286 指令系统.386 选择 80386 指令系统.386P 选择保护模式下的
3、 80386 指令系统.486 选择 80486 指令系统.486P 选择保护模式下的 80486 指令系统.586 选择 Pentium 指令系统.586P 选择保护模式下的 Pentium 指令系统,4.2.1 处理器选择伪操作:,这类伪操作一般放在程序的最前面,如不给出,则汇编程序默认值为.8086。,4.2.2 段定义伪操作:,段定义伪操作的格式:,段名 SEGMENT 定位类型 组合类型 使用类型 类别;语句序列段名 ENDS,1)段名 段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。,1.完整的段定义伪指令,2)定位方式(1)PARA:表示本段必须从能被16整除的
4、地址处开始存放,即段起始地址最低四位必须是0。(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(3)BYTE:表示本段起始地址可以从任一地址处开始存放。(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。默认为 PARA,3)组合方式组合方式有六种类型可供选择。,(1)PRIVATE 该段为私有段,在连接时将不与其他同名段合并(2)PUBLIC 该段在连接时可以把不同模块的同名段相连接而形成一个段。每一段从小段的边界开始,所以各段之间有小于16个字节的间隙。(3)COMMON 该段在连接时可以把不同模块中的同名段重叠而形
5、 成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。(4)STACK 把不同模块的同名段组合而成一个堆栈段。各段之间没有间隙。(5)MEMORY 同PUBLIC(6)AT 表达式 使段地址是表达式所计算出来的16位值,CS除外。默认为 PRIVATE,【例】有两个模块,各模块段定义如下模块1:DATA1SEGMENT PARA PUBLIC DATA1M1DB 45H DUP(0)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N1 DB 102H DUP(0)DATA2ENDSEND,模块2:DATA1SEGMENT PARA PUBLIC DATA1M2
6、DB 104H DUP(11H)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N2DB 105H DUP(0)DATA2ENDSDATA3SEGMENTT1DB 50 DUP(20H)DATA3ENDSEND,该段的定位组合方式示意图如图所示。,4)使用类型 USE16 使用16位寻址方式 段长64K USE32 使用32位寻址方式 段长4G 5)类别 在引号中给出连接时组成的段组的类型名。在连接后形成的装入模块中,可使相同类别的段位置靠在一起。,假定伪指令ASSUME格式:ASSUME 段寄存器:段名,段寄存器:段名功能:建立段寄存器与段之间的对应关系。该伪指
7、令一般出现在代码段中。DATA1SEGMENTADB 1,2,3DATA1ENDSCODESEGMENTASSUMEDS:DATA1,CS:CODE,其中段寄存器名必须是CS,DS,ES 和SS(对于386 及后继机型还有FS 和GS)中的一个。段名必须是由SEGMENT定义的段中的段名。,段定义伪操作:,完整的段定义格式举例,data segment;定义数据段 data ends;-extra segment;定义附加段 extra ends;-code segment;定义代码段 assume cs:code,ds:data,es:extrastart:mov ax,data mov d
8、s,ax;段地址 段寄存器 code ends end start,code segmentmain proc far assume start:push ds mov ax,0 push ax retmain endpcode ends end start,code segmentassume start:mov ax,4c00h int 21hcode ends end start,例:一个完整的段定义格式,STACK SEGMENT STACK;定义堆栈段STACK.;分配堆栈段的大小STACK ENDSDATA SEGMENT;定义数据段.;定义数据DATA ENDSCODE SEGM
9、ENT CODE;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA;程序开始 MOV DS,AX.;程序代码 MOV AX,4C00H;程序终止,返回DOS INT 21HCODE ENDS;代码段结束.;子程序代码END START;汇编结束,例:一个完整的段定义格式,2.存储模型与简化段定义伪指令,前面介绍了完整的段定义格式,用完整段定义格式虽然可以控制段的各种属性,但程序员很少使用。现在的汇编程序提供了一种简化的段定义方式,它使定义段更简单、方便。具体形式如下:.MODEL SMALL;定义存储模式.STACK;定义堆栈段.DA
10、TA;定义数据段.;定义数据.CODE;定义代码段.STARTUP;程序起始点,并建立DS和SS内容.;程序代码.EXIT 0;程序结束点,返回DOS.;子程序END;汇编结束,存储模式与简化段定义伪操作,(1)MODEL 伪操作.MODEL 存储模式,语言类型,操作系统类型,堆栈选项 存储模式:tiny 所有数据和代码都放在一个段.com(0100H)small 所有数据和代码各放在一个段 medium 代码使用多个段,数据合并一个段 compact 所有代码使用一个段,数据可放多个段 large 数据和代码都可用多个段 huge 数据和代码都可用多个段,数据段可超过64K flat 允许用
11、32位偏移量,DOS下不允许。,TINY:该存储类型是为编写COM文件类型而设置的。SMALL:所有的数据变量必须在一个数据段之内,所有的代码也必须在一个代码段之内。在这种模型下,数据段寄存器的内容保持不变,所有转移也都是段内转移。MEDIUM:所有的数据变量必须在一个数据段之内,但代码段可以有多个。在这种模型下,数据段寄存器的内容保持不变,转移可以是段间转移。COMPACT:数据段可以有多个,但代码段只能有一。LARGE:数据段和代码段都可以有多个,但一个数组的字节数不能超过64KB。HUGE:数据段和代码段都可以有多个,一个数组的字节数也可以超过64KB。FLAT:只能在80386及其以后
12、的计算机系统中运行。,SMALL存储模式,一般的程序都可用这种模式。在小型模式下,一个程序至多只能有一个代码段和一个数据段,每段不大于64KB。这里的数据段是指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不可超过64KB;因此小模式下程序的最大长度为128KB。访问操作数或指令都只需要使用16位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是近属性(NEAR),即小型模式下的调用类型和数据指针缺省分别为近调用和近指针。,.model small.stack 100H.data.code.startup.exit 0end,.MODEL 存储模式,语言类型,操作系统类型,
13、堆栈选项 语言类型说明可使汇编语言程序与其它语言程序达到共享的目的。所有有效的语言类型可以是C、BASIC、FORTRAN等。操作系统类型说明程序运行于哪个操作系统之下,OS_DOS该选项的缺省值。堆栈选项类型的值有二个可选值:NEARSTACK和FARSTACK。其中:NEARSTACK是该选项的缺省堆栈类型。NEARSTACK堆栈段和数据段是同一段;FARSTACK堆栈段和数据段是不同的段,且堆栈不在段组DGROUP中。例如:.MODEL SMALL,C,OS_DOS,FARSTACK,简化的段定义伪操作.code name.data.data?.fardata name 默认名:FAR_
14、DATA.fardata?name 默认名:FAR_BSS.const.stack size 默认为1KB,汇编语言提供7种标准段,通常在编写一个独立的汇编程序时定义以下三个标准段:.STACK 大小;堆栈段它的参数指定堆栈段所占存储区的字节数,默认是1KB。.DATA;数据段它用于定义具有初值的变量,当然也允许定义无初值的变量。无初值变量可以安排在另一个段中,它用.data?伪指令创建。.CODE 段名;代码段它的参数指定该代码段的段名。如果没有给出段名,则采用默认段名。,简化段定义伪指令指明一个逻辑段的开始,同时自动结束前面的一个段,不用ENDS作为段结束符。采用简化段定义伪指令前,需有.
15、MODEL存储模式语句。使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义符号,例如:data表示由.data等定义的数据段的段名。,例:简化段定义.MODEL SMALL.STACK 100H.DATA.CODESTART:MOV AX,DATA MOV DS,AX MOV AX,4C00H INT 21H END START,格式:段组名 GROUP 数据段名1,数据段名2功能:汇编程序把各数据段组成一个段组,以便程序在访问各数据段时使用一个数据段寄存器DS。如:data1 segment data1 ends data2 segment data2 ends datagr
16、oup group data1,data2 code segment assume cs:code,ds:datagroup start:mov ax,datagroup mov ds,ax,3.段组定义伪操作,dseg1 segment word public data dseg1 ends dseg2 segment word public data dseg2 ends datagroup group dseg1,dseg2cseg segment para public code assume cs:cseg,ds:datagroupstart:mov ax,datagroup mov
17、 ds,ax mov ax,4c00h int 21hcseg ends end start,data1 segment word const1 dw 100data1 endsdata2 segment word var1 dw?data2 endsdatagroup group data1,data2code segment assume cs:code,ds:datagroup,mov ax,datagroup mov ds,ax mov ax,const1 mov var1,ax mov ax,4c00h int 21hcode ends end start,TITLE text;指定
18、列表文件每页打印的标题NAME module_name;指出模块的名字END label;表示源程序结束,label 指示程序;开始执行的起始标号.STARTUP;定义程序的入口点.EXIT return_value;退出程序并返回操作系统;return_value常用0作返回值,4.2.3 程序开始和结束伪操作,可以没有,在汇编程序MASM中,提供了二组简化的代码伪指令:.STARTUP 和.EXIT。.STARTUP在代码段的开始,用于自动初始化寄存器DS、SS和SP;.EXIT用于结束程序的运行。,.model small.data.code.startup.exit 0end,.mod
19、el small.data.codestart:mov ax,data mov ds,ax mov ax,4c00h int 21h end start,4.2.4 数据定义及存储器分配伪操作:,变量名 助记符 操作数,操作数,;注释,变量名必须是一个合法的标识符,它可以写,也可以不写;助记符用于确定内存单元的数据类型,如:DB(字节)、DW(字)、DD(双字)、DF(6字节)、DQ(四字)、DT(10字节)。操作数是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号,分开;如果某个存储单元没有初值表达式,则必须用一个问号?来表示;在定义语句的后面可以书写注释
20、内容,也可以不写。,DATA_BYTE DB 10,4,10H,?DATA_WORD DW 100,100H,-5,?,例:1,注:“?”表示保留存储空间但不存入数据,DATA_BYTE,DATA_WORD,【例】,DATA1 DB 10,4,10HDATA2 DW 100,100H,-5DATA3 DD 3*20,0FFFDH,0 4,1 0,6 4,0 0,0 0,0 1,F B,F F,3 C,0 0,0 0,0 0,F D,F F,0 0,0 0,0 A,DATA1,DATA2,DATA3,10d,4,10h,ARRAY DB HELLO DB AB DW AB,ARRAY,DW1DD
21、12345678HDW2DD0abcd1243H,DW1,DW2,例,例:3,例2图,例3图,重复说明符DUP 从前面的内容里,我们知道了定义少量内存变量的定义形式,但如果在程序中要说明50个、100个、200个甚至更多的、同类型的内存变量时,若采用前面所学的方法,对它们一一加以说明显然是不可行的。为此,汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下:repeat_count DUP(表达式,表达式,表达式)解释:repeat_count是重复次数,(表达式,表达式,表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是含义另一个DUP的式子。如果在表达式的括号中有多个表
22、达式,那么,它们之间要用逗号,分开。,0 1,0 2,-,0 0,0 1,0 2,-,-,0 0,BUF1,BUF2,-,100个字节,例:BUF1 DB 2 DUP(0,1,2,?)BUF2 DB 100 DUP(?),例如:BUFFER DB 100 DUP(?)STRING DB 120 DUP(ABCDE),0DB 2 DUP(0,2 DUP(1,2),3)DATA1 DW 50 DUP(10H,20 DUP(1,2,3),20H)POINTS DD 12,30 DUP(0)从上面的例子可看出:用DUP说明内存变量相当于在高级语言中定义数组。,buffer,100字节,画出存储单元的分
23、配图,计算分配字节数,强制属性操作符 PTR 在程序中,我们有时需要对同一个存储单元以不同的属性来访问,或对一些不确定的存储属性需要显式指定等,这时,我们就需要强制属性操作符PTR。该操作符的作用有点象C语言中的类型强制方法。对于指令:MOV BX,1H,其目标操作数BX是寄存器间接寻址方式,它指向一个存储单元。在作传送操作时,是把“1H”扩展成8位作字节传送,还是扩展成16位作字传送呢?这就使该指令具有二义性,因为BX指向的存储单元可以字节或字的首地址。含有该指令的程序在汇编时,可能会产生警告或出错信息。,为了使指令中存储单元操作数具有明确的属性,我们可以使用强制属性操作符PTR。其一般格式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言程序格式 汇编语言 程序 格式 PPT 课件
链接地址:https://www.31ppt.com/p-5541246.html