《ch08-汇编语言程序格式2》由会员分享,可在线阅读,更多相关《ch08-汇编语言程序格式2(54页珍藏版)》请在金锄头文库上搜索。
1、汇编语言程序格式,主讲人:黄永平,目录,一、汇编语言概述 二、汇编语言格式 三、伪指令 四、操作数字段 五、汇编语言源程序的结构,一、汇编语言概述,机器语言,计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。 用机器语言编写的程序是计算机唯一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序,所以,机器语言程序被称为目标程序。,一、汇编语言概述,汇编语言,为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。所以汇编语言是一种
2、用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。 用汇编语言编写的程序称为汇编源程序。 汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序(汇编器,编译器)。,一、汇编语言概述,高级语言,汇编语言虽然较机器语言直观,但仍然烦琐难懂。于是人们研制出了高级程序设计语言。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。目前广泛应用的高级语言有多种,如BASIC、FORTRAN、P
3、ASCAL、C、C+、Java,C#等等。 例出你所知道的计算机语言有哪些?,一、汇编语言概述,汇编语言的特点,(1)汇编语言与处理器密切相关,可移植性差。 (2)汇编语言程序效率高。 (3)编写汇编语言源程序比编写高级语言源程序烦琐。 (4)调试汇编语言程序比调试高级语言程序困难。,一、汇编语言概述,汇编语言的主要应用场合,(1)程序执行占用较短的时间,或者占用较小存储容量的场合。 (2)程序与计算机硬件密切相关,程序直接控制硬件的场合,实时控制。 (3)需提高大型软件性能的场合(选一个好的C编译器可解决)。 (4)没有合适的高级语言的场合。(OS中上下文保存等,如linux),一、汇编语言
4、概述,汇编语言程序的建立及处理过程,编辑程序,汇编源程序 xxx.ASM,汇编程序,MASM5.0 TASM MASM32,NotePad UtraEdit Notepad+,浮动目标文件 xxx.OBJ,连接程序,可执行文件 xxx.EXE ,LINK,Emu8086 -IDE仿真环境,系统库lib 系统.obj,二、汇编语言格式,汇编语言中有三种基本语句: 指令语句汇编时,产生对应的机器目标代码。 伪指令汇编时,无目标代码,用于定义符号、分配内存、初始化存储器。 宏指令用宏名称来定义的一段指令序列。(如C中#define ),二、汇编语言格式,标号: 机器指令助记符 操作数 ;注释,标号是
5、机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:” 。,汇编指令机器指令 指令助记符为语句的核心成分,表示了该语句的操作类型。,操作数表示指令助记符的操作对象。,指令语句格式(机器指令),注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。,next: MOV AX, BX ; 把BX内容送到AX,二、汇编语言格式,符号名 伪指令助记符 操作数 ;注释,常量名 变量名 过程名 段名 结构名 记录名,伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。,伪指令后面的操作数可以
6、是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。,伪指令语句格式(汇编程序解释),伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。,var1 DW 100 ; 定义一个字变量var1,其值为100 C中 unsigned integer var1=100;,三、伪指令,三、伪指令,段定义伪指令(SEGMENT/ENDS),段名 SEGMENT 定位类型组合类型字长类型类别 . . 段名 ENDS,ASSUME 段寄存器:段名,段寄存器:段名,,指出哪个段用哪个段寄存器,为了汇编程序把不同的段与模块连接,三、伪指令,1段名 该段名字,用来指
7、出汇编程序为该段分配的存储区起始位置。 2定位类型(指定该段起始地址边界值的类型) (1)BYTE:表示本段起始地址可以从任一地址处开始存放。 (2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。 (3)DWORD:表示本段要从4倍地址处开始存放,即段起始地址的最低二位必须是0。 (4)PARA:表示本段必须从能被16倍地址处开始存放,即段起始地址最低四位必须是0。 (5) PAGE:表示本段要从能被256倍地址处开始存放,即起始地址的最低八位必须是0。,三、伪指令,3.组合类型(用来告诉连接程序link.exe,本段与其它模块中同名段的组合连接关系) 有六种类
8、型可供选择。 (1)“不选择” (2)PUBLIC:连接时,把与该段名相同的段连接在一起。 (3)STACK:指定该段为堆栈段的一部分 (4)COMMON:指定该段与其它同名的段有相同的段起始地址。 (5)MEMORY:指定该段将分配在所有其它段的前面(高地址)。 (6)PRIVATE: 该段为独立段,不与其它同名段合并。 (7)AT 表达式:用于指定由表达式值所确定的段所在的起始地址。不能用于代码段。,三、伪指令,4.字长类型(用于386以上,用来说明使用16位寻址方式或32位寻址方式) (1)USE16:使用16位寻址方式。 (2)USE32:使用32位寻址方式。,三、伪指令,5.类别(连
9、接时,连接程序会把类别相同的所有段放在连续的内存区域中) DATA :段类别是数据段。 -DS CODE :段类别是代码段。 -CS STACK :段类别是堆栈段。 -SS EXTRA :段类别是附加数据段。-ES,三、伪指令,对连接程序进行连接后存储区各段相对位置分布。 DATA1 SEGMENT DATA CODE SEGMENT CODE STACK1 SEGMENT STACK DATA2 SEGMENT DATA STACK2 SEGMENT STACK 经连接程序连接后,各段的相对位置如下: DATA1 SEGMENT DATA DATA2 SEGMENT DATA STACK1
10、SEGMENT STACK STACK2 SEGMENT STACK CODE SEGMENT CODE,三、伪指令,【例】有两个模块,各模块段定义如下:,模块1: DATA1 SEGMENT PARA PUBLIC DATA1 M1 DB 45H DUP(0) DATA1 ENDS DATA2 SEGMENT PARA COMMON DATA2 N1 DB 102H DUP(0) DATA2 ENDS END,三、伪指令,模块2: DATA1 SEGMENT PARA PUBLIC DATA1 M2 DB 104H DUP(11H) DATA1 ENDS DATA2 SEGMENT PARA
11、 COMMON DATA2 N2 DB 105H DUP(0) DATA2 ENDS DATA3 SEGMENT T1 DB 50 DUP(20H) DATA3 ENDS END,三、伪指令,模块1、模块2连接后段的定位组合方式示意图,三、伪指令,ASSUME 段寄存器:段名,段寄存器:段名,,假定伪指令 (ASSUME) -段分配伪指令,功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。,ASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2,DATA1 SEGMENT DATA DATA1 ENDS DATA2 SEGMENT STACK
12、DATA2 ENDS DATA3 SEGMENT DATA DATA3 ENDS CODE SEGMENT CODE ASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2 START: MOV AX, DATA1 MOV DS, AX MOV AX,DATA2 MOV SS,AX MOV AX,DATA3 MOV ES,AX CODE ENDS END START,三、伪指令,指定哪个段用哪个段寄存器,给段寄存器装入值,CS由系统自动装入,定义了 二个数据段, 一个堆栈段, 一个代码段,三、伪指令,段组定义伪指令 (GROUP),段组名 GROUP 段名,段
13、名,,功能:将GROUP后段名所指定的段分配在同一个物理存储器段中,分给该段一个段组名。,DATA1 SEGMENT DATA DATA1 ENDS DATA2 SEGMENT DATA DATA2 ENDS AA5 GROUP DATA1, DATA2 CODE SEGMENT CODE ASSUME CS:CODE, DS:AA5 START: MOV AX, AA5 MOV DS, AX CODE ENDS END START,三、伪指令,定义了二个数据段,一个代码段,三、伪指令,地址计数器伪指令 (ORG,EVEN,ALIGN),地址计数器(偏移计数器) $ :本指令地址 MASM5.
14、0, emu8086支持 ORG 表达式 -设置地址计数器IP EVEN -使下一变量或指令开始于偶数地址。 ALIGN n -使下一变量或指令开始于n的整数倍地址。 N=2,4,8,16,三、伪指令,数据定义伪指令 (DB,DW,DD,DF,DQ,DT),变量名 操作符 操作数,操作数, ;注释,功能:为操作数分配存储单元,并用变量名与存储单元相联系。,常数 表达式 字符串,DB -1 字节(字节),定义字节变量 DW -2 字节(字), 定义字 变量 DD -4 字节(双字),定义双字变量 DF -6 字节(三字),定义三字变量 DQ -8 字节(四字),定义四字变量 DT -10字节(五
15、字),定义五字变量,三、伪指令,常数、表达式,ORG 200H DATA1 DB 12H, 2+6,34H EVEN ;下一个从偶数地址开始 DATA2 DW 789AH ALIGN 4 ;下一个从4倍地址开始 DATA3 DD 12345678H DATA4 DW $,6699H,三、伪指令,字符串,ORG 100H DATA1 DB abcd DATA2 DB AB DATA3 DW AB,三、伪指令,?,ORG 400H DATA1 DB 1,2,?,4 DATA2 DW 5,?,6 DATA3 DF ? DATA4 DB 8,三、伪指令,n DUP(),ORG 300H DATA1 DB 2 DUP(12H,34H,56H),如何定义一个数组?,Duplication,三、伪指令,过程定义伪指令(PROC/ENDP),过程名 PROC 属性 . . . 过程名 ENDP,NEAR近调用(段内) FAR远调用(段间),用CALL 过程名调用此过程,三、伪指令,模块连接伪指令(PUBLIC,EXTRN),PUBLIC 符号1 ,符号2,,1.PUBLIC全局符说明伪指令,功能:全局符号定义,其它模块可使用。,EXTRN 符号1:类型 ,符号2:类型,,2.EXTRN外部符说明伪指令,功能: 其它模块用PUBLIC定义的,本