版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 汇编语言程序格式4.1 汇编语言的执行过程4.2 汇编语言的程序格式4.3 伪指令4.4 汇编语言的上机过程,Assemble Language,一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述),通常是为特定计算机或计算机系列专门设计的。,Assemble Language,用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序翻译成机器语言程序。汇编语言指令与翻译成的汇编过程示意:,采用汇编语言进行程序设计的优点,可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间 常用来编写实时控制程序、实时通信程序,有时也用
2、来编制某些系统软件程序。,缺点:,编程效率低(与人们描述计算过程的需要差距大) 与机器硬件的具体结构联系过于紧密在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。,4.1 汇编语言程序的执行过程:,编辑程序,. ASM 文件,汇编程序,. OBJ 文件,连接程序,. EXE 文件,Edit 等,MASM,LINK,出错,检查源程序; 测出源程序中的语法错误,并给出出错信息; 产生目标文件(.OBJ),并可给出列表文件(同时列出汇编语言源程序和机器语言目标程序的文件,称之为.LST文件)和交叉索引文件(列出程序中使用的符号、变量和标号以及引用情况,称之为.CRF文件)。 展开宏指令
3、。,汇编示意图,汇编程序的主要功能,汇编程序分两种,一种是基本汇编(ASM.EXE),一种是宏汇编(MASM.EXE),宏汇编功能比较强。,连接程序,汇编之后生成的OBJ文件必须经过链接过程,才能成为扩展名.EXE的可执行文件。 链接的过程就是调用连接程序(LINK.EXE),对OBJ文件进行定位、链接,最后生成扩展名为EXE的可执行文件。如果需要,也可生成MAP文件和LIB文件。,连接示意图:,调试程序(DEBUG.COM),DEBUG PROG.EXE - U (反汇编) - g =起始地址 断点地址 - T = 地址 指令条数,汇编语言程序开发中的相关文件,Handwritten sou
4、rce program,EDIT Editor program,MASM assembler program,LINK linker program,DEBUG debug program,Final debugged run module,PROG1.LST,PROG1.OBJ,PROG1.CRF,Other .OBJ files,Libraries,4.2 汇编语言程序格式 8088汇编语言的源程序是由多个段组成的, 一个可执行的汇编程序一般至少有一个代码段,其中包含可执行的语句。 一般程序结构: (1)代码段:存放程序执行的指令 (2)数据段:存放程序所需的数据 (3)堆栈段:存放程序执
5、行的临时信息,数据段定义格式,DATA SEGMENT SOURCE_BUFFER DB 40 DUP (A) ARRAY DB 1,-1,2,-2,3,-3,4,-4,5,-5 COUNT EQU 50 DATA ENDS .,附加段的定义,EXTRA SEGMENT DEST_BUFFER DB 50 DUP (?) EXTRA ENDS,堆栈段的定义,STACK SEGMENT STACK STA DB 50 DUP (?) STACK ENDS,示例程序,DATA SEGMENT ;数据段定义 SOURCE_BUFFER DB 40 DUP (A) ARRAY DB 1,-1,2,-2
6、,3,-3,4,-4,5,-5 COUNT EQU 50 DATA ENDS EXTRA SEGMENT ;附加段定义 DEST_BUFFER DB 50 DUP (?) EXTRA ENDS CODE SEGMENT ;代码段定义 MAIN PROC FAR ASSUME CS:CODE , DS:DATA, ES: EXTRA,接上面,START:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX,接上面,LEA SI,SOURCE_BUFFER LEA DI,DEST_BUFFER CLD MOV
7、CX,COUNTR REP MOVSB RET MAIN ENDP CODE ENDS END START,编写一个完整的汇编程序,其实现 w=x+y-6 的功能 my_data segment mov ah,4ch x dw 05 int 21h y dw 4 my_code ends w dw ? my_data ends end begin my_code segment assume cs:my_code assume ds:my_data begin: mov ax, my_data mov ds, ax mov ax,x ; (ax)=5 add ax,y ;(ax)=5+4=9
8、sub ax,6 ;(ax)=9-6=3 mov w,ax,05 00 04 00,x,DS,CS,y,w,其基本格式如下:,一、 基本格式,S_NAME1 SEGMENT 语句 语句 S_NAME1 ENDS S_NAME2 SEGMENT 语句 语句 S_NAME2 ENDS S_NAME3 SEGMENT 语句 语句 S_NAME3 ENDS END,CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START PROC FAR ;将本程序作为DOS操作系统的子程序。 BEGIN: PUSH DS XOR AX, AX PUSH AX ; 标准
9、程序前缀 MOV AX, DATA MOV DS, AX MOV ES, AX RET START ENDP CODE ENDS END BEGIN,汇编源程序的格式一,CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK BEGIN: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AH, 4CH INT 21H ;DOS 功能调用,结束程序,返回DOS CODE ends END BEGIN,汇编源程序的格式二,而每个段是由语句行构成的。一个语句行的基本格式为: 标识符 操作码 操作数1 ,操作数2 ;注释,二、 语句行
10、构成 1、 8088汇编语句中的标记 (1) 标识符 标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以下3点: 标识符可由数字、字母和下划线组成; 不能以数字开头,数据可用在非开头的其它位置; 其最大长度为31个字符。,(2). 保留字 保留字是汇编语言中预先保留的特殊字串,只能用于特殊用途,所有8086/8088的指令、伪指令和寄存器名都是保留字。如AX、MOV、DB、INT、EQU等等。 保留字不能用作标识符 (3). 界符 界符是用于一个程序或一条指令中不同部分的分隔符,如MOV AX, 0010H中的“,”就是界符。其内容见下表: 8086/8088
11、汇编语言的界符 ; * , : + - = ( ) $ & ? . /,(4). 常量 常量就是指令中的一些不变的数据。它可以用二进制、十六进制、十进制和八进制表示,也可以用引号引起来的字串。例如: 二进制:00011101B 十六进制:0C5AAH 十进制:9856D 八进制:237O 字串:The 2X means 2 multiple X 其中的B、H、D和O为数制的结尾符。,(5). 注释 注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分的关系,一般写在某语句的后面或某段的开始处,注释的前面由“;”前导,表示后面的内容为注释。如果一行写不下,换行后也要使用“;”
12、前导。,2 、 符号 在8086/8088汇编语言的源程序中为了使程序有很好的可读性和易修改性,通常使用有一定意义的符号来代替某些单元、数据或表达式。符号可分为四类:寄存器、变量、标号、数。如SUM、DATA1。 (1). 寄存器 8086/8088的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如AX为字寄存器,而AL则为字节寄存器。只有AX、BX、CX、DX可分为字和字节寄存器。 (2). 变量 变量是存放在某些单元中的操作数,使用有一定意义的符号来代表这些单元。所有的变量都有一个固定的地址,它由段和偏移组成;同时还有一个类型,它可以是字节、字或双字。在程序中,变量可以使用数
13、据定义伪指令进行初始化,见伪指令一节中的数据定义部分。,(3). 标号 标号实际上是用符号表示的地址,因此它也是由段、偏移地址和类型组成,其类型分为段内(NEAR)和段间(FAR)两种,通过 SEG 标号 OFFSET 标号 可以分别得到标号的段地址和偏移地址。 如果是NEAR类型,在程序执行时,只取标号的偏移地址,例如在过程调用(CALL)时,只取IP,而对于FAR类型,则要取段地址和偏移地址,在CALL时要取IP和CS。 (4). 数 在程序设计中,为了程序有良好的可读性和可修改性,有些数据使用符号来表示,通过伪操作,将数据与某些符号相联系。,分析运算符 分析运算在汇编语言程序设计中很重要
14、。它包括 取存储单元偏移:OFFSET 取存储单元段: SEG 取类型:TYPE 按类型取长度:LENGTH(对于变量中使用dup的情况,汇编程序将会送分配给该变量的单元数,而对于其他情况则回送1) 取字节数: SIZE(length*type),例1: 设有数据段中使用 DATA1 DB 5 定义了一个单元,则 MOV AL, DATA1 可将DATA1中的数传送到AL中, AL=05 MOV AX, SEG DATA1 可将DATA1的所在段地址传到AX中,AX=2000 MOV AX, OFFSET DATA1 可将DATA1的偏移地址传入AX中, AX=1500 例2: 设有数据段中使
15、用 DATA1 DW 100 DUP (?) 定义了100个字单元,则 MOV AX, TYPE DATA1 AX=2 MOV AX, SIZE DATA1 AX=200 MOV AX, LENGTH DATA1 AX=100,05 A2 00 10 85,DS,CS,DATA1,2000:1500, 综合运算符 PTR改变存储器地址操作数的操作类型,但其段地址和偏移地址不变。 如: DATA1 DW 100 DUP(?),05 A2 00 10 85,DS,MOV AL, DATA1 MOV AL, BYTE PTR DATA1,DATA1,DATA1 SEGMENT WBUFFER EQU
16、 THIS WORD BUFFER DB 12H, 34H, 00H, 91H DATA1 ENDS CODE1 SEGMENT ASSUME CS: CODE1, DS: DATA1 START: MOV AX, DATA1 MOV DS, AX MOV AL, BUFFER MOV BX, WBUFFER CODE1 ENDS END START,THIS用来建立新的存储器地址操作数,且不分配存储单元。新的操作 数类型在THIS中指定,而其段地址和偏移量就是汇编时的当前值。,12 34 00 91 85,DS,BUFFER,WBUFFER,AL=12H BX=3412H,4.3 伪指令 在
17、8086/8088汇编语言中伪指令是用于诸如数据定义、存储区分配等功能。所谓伪指令是非机器指令,它是在汇编期间进行操作的。,4.3.1 符号定义语句 EQU 为了使程序便于阅读和修改,我们有时使用一个符号来代表一个值,而符号代表了一定的意义,在程序中使用一个符号代表一个值进行操作,其格式为: 符号 EQU 表达式 例如: PORT EQU 3F8H 在程序中可使用 MOV DX, PORT 对DX进行赋值,实际上PORT就是一个常量。,还可在语句中进行运算,如: DATA_PORT EQU 3F8H STAT_PORT EQU 3F8H+2 SEED EQU 10 FUNC EQU SEED*
18、SEED+2*SEED+1 = 号操作 对符号的赋值还可使用“=”操作,它与EQU的区别是“=”操作可以重复定义,而EQU则不能重复定义。如: X=3 Y=6 Y=Y*Y-X MOV AX, Y 通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。即 MOV AX, 21H (33D),4.3.2 数据定义语句 数据定义语句用于为数据分配相应的存储单元。用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有: 字节定义DB 字定义DW 双字定义DD 重复定义 m DUP(n)_ (重复m次个数据 n ) 与数据相联系的符号名称为变量。
19、数据定义语句的格式为: 变量名 操作符 数据项,通过上述定义,在存储器中将产生如图所示的结果,以DATA1到DATA5为例: 例: DATA1 DB ? DATA2 DW 1000H DATA3 DD 3000A455H DATA4 DW 4 DUP(0) DATA5 DW 0120H, 0240H, 0360H,DS,随机 00 10 55 A4 00 30 00 00 00 00 20 01 40 02 60 03,DATA1 DATA2,DATA3,DATA4,DATA5,DS,54 48 49 53 20 49 53 20 41 20 45 58 41 4D 50 4C 45,例: D
20、ATA6 DB THIS IS A EXAMPLE,DATA6,T H I S I S A E X A M P L E,注意: 1:数据定义语句在存储器中占有相应的 单元,如上面语句中的第二句在程序 运行时将会以00和10占据两个存储单元。 而EQU只是定义了一个数据,在汇编 后以实际数据的形式体现在程序中。 也就是说,EQU语句不会占有存储单 元。 2:EQU可以用在指令中,而数据定义语 句不可以。,4.3.3 段定义语句 在段定义中,SEGMENT和ENDS总是成对使用的,它们将数据和程序分为多个段,如数据段、栈段和代码段。 ASSUME是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是
21、数据段,哪个是代码段,哪个是栈段。 ORG用于指定目标程序存放单元的起始偏移地址,通常写在第一条源程序的前面,用于指定这段程序的首地址。如使用了: ORG 100 则程序执行时就从CS:100处开始执行其后面的程序。,MOV BX, OFFSET M1 MOV AX, BX MOV DX, 0 MOV BX, OFFSET M2 MUL BX MOV BX, OFFSET M3 MOV BX, AX MOV BX, OFFSET M4 MOV BX, DX MOV AH, 4CH INT 21H CODE_SEG ENDS END START,从上述程序中,我们可总结出如下结论: SEGMEN
22、T和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。 ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。 首条被执行的语句有一个标号,在程序的结尾使用END后跟上这个标号,用以标出这个程序的开始执行处。,4.3.5 过程定义语句 和其它程序设计一样,8086/8088汇编程序设计有过程或子程序的设计方法。8086/8066汇编程序的过程从运行位置上分为近过程(NEAR)和远过程(
23、FAR),其定义如下: PROC_NAME1 PROC NEAR RET PROC_NAME1 ENDP PROC_NAME2 PROC FAR RET PROC_NAME2 ENDP,过程和其它程序可定义在同一个段中,也可定义在不同的段中。对过程的调用要使用CALL语句,如: CALL PROC_NAME1 CALL PROC_NAME2 如果在过程定义中没有写明是NEAR过程或FAR过程,则汇编器将这个过程默认为NEAR过程。,4.3.6 基数控制语句 汇编语言程序允许使用多种数制,如: 二进制:00011101B 十六进制:0C5AAH 十进制:9856D,DOS系统功能调用实现字符的输入输出,系统功能调用是DOS为系统程序员及用户提供的一组常用子程序,DOS规定用中断指令INT 21H进入各功能调用子程序的总入口,再为每个功能调用规定一个功能号以便进入相应各个子程序的入口。子程序的入口参数及出口参数在每个功能调用的说明中可以查到。 DOS系统功能调用的使用方法如下: 在AH中存入所要调用功能
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大数据行业测试题目及答案
- 养老院膳食服务制度
- 养老院老人意见建议收集处理制度
- 文化艺术申论题目及答案
- 养老院老年人意外伤害预防与处理制度
- 系统工程考试题目及答案
- 门前四包责任制度
- 销售人员奖罚制度
- 碳水交易事例分析题目及答案
- 通过公司法证券法明确中小股东权利如累积投票权、关联交易回避表决制度
- 空气能维保合同协议
- 2019营口天成消防JB-TB-TC5120 火灾报警控制器(联动型)安装使用说明书
- 买卖肉合同样本
- 2025年中国三氯丙酮市场调查研究报告
- 五下语文快乐读书吧《三国演义》导读单
- 2025届高考语文复习:以《百合花》为例掌握小说考点
- 面向对象系统分析与设计(MOOC版)全套教学课件
- DLT-循环流化床锅炉停(备)用维护保养导则
- JT-T-1248-2019营运货车能效和二氧化碳排放强度等级及评定方法
- 人教PEP英语六年级下册全册教案教学设计及教学反思
- 语文七年级下字帖打印版
评论
0/150
提交评论