1、1,第4章 汇编语言程序设计,2,主要内容,汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计,3,4.1 汇编语言源程序,了解: 汇编语言源程序的结构 汇编语言语句类型及格式,4,一、汇编语言源程序结构,5,1. 汇编语言源程序与汇编程序,汇编语言源程序 汇编程序,用助记符编写,汇编程序,汇编语言源程序,机器语言目标程序,源程序的编译程序,6,2. 汇编语言程序设计与执行过程,输入汇编语言源程序(EDIT) 汇编(MASM) 链接(LINK) 调试(TD),源文件 . ASM,目标文件 .OBJ,可执行文件.EXE,最终程序,7,3. 汇编语言源程序结构,数据段名 S
2、EGMENT 数据段名 ENDS附加段名 SEGMENT 附加段名 ENDS,堆栈段名 SEGMENT 堆栈段名 ENDS代码段名 SEGMENT 代码段名 ENDSEND,8,二、汇编语言语句类型及格式,9,1. 汇编语言语句类型,指令性语句指示性语句,CPU执行的语句,能够生成目标代码,CPU不执行,而由汇编程序执行的语句,不生成目标代码,10,2. 汇编语言语句格式,指令性语句:标号: 前缀 助记符 操作数,操作数 ;注释,指令的符号地址 标号后要有冒号,操作码,注释前加分号,11,指示性语句格式,名字 伪指令助记符 操作数 ,操作数, ;注释,变量的符号地址 其后不加冒号,指示性语句中
3、至少有一个操作数,12,3. 标号、名字,标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。 英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。,13,4. 操作码,指令码 伪指令助记符 指示汇编程序要完成的操作。 作用: 定义变量 分配存储单元 指示程序开始和结束等,命令CPU要完成的操作,14,5. 注 释,用分号作为注释的开始; 用于说明程序或语句的功能,以便于阅读和理解,15,6. 操作数,寄存器 存储器单元 常量 变量或标号 表达式,16,常 量,数字常量 字符串常量 例:A MOV AL,A 例:AB
4、CD,汇编时被译成对应的ASCII 码41H,42H,43H,44H,用单引号引起的字符或字符串,17,变 量,代表内存中的数据区,程序中视为存储器操作数 变量的属性:变量所在段的段地址变量单元地址与段首地址之间的位移量。字节型、字型和双字型,段 值,偏移量,类 型,18,表达式,算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算,19,算术运算和逻辑运算符,算术运算符 +,-,*,/,MOD 逻辑运算符 AND,OR,NOT,XOR 例: MOV AL,8 AND 4 MOV AL,8+4-1,20,关系运算符,表示关系是否成立的运算符 参与关系运算的必须是两个数值 关系成立,结果=
5、FFFFH 关系不成立,结果=0。 运算符: EQ,NE,LT,GT,LE,GE,例:MOV AL,3 LT 4,21,取值运算符,取得其后变量或标号的偏移地址 取得其后变量或标号的段地址,TYPE 取变量的类型 LENGTH 取所定义存储区的长度 SIZE 取所定义存储区的字节数,用于分析存储器操作数的属性,OFFSET,SEG,22,取值运算符例,MOV AX,SEG DATAMOV DS,AXMOV BX,OFFSET DATALEA BX,DATA,等价于,23,取值运算符例,若BUFFER存储区用如下伪指令定义: BUFFER DW 200 DUP(0)则:TYPE BUFFER 等
6、于2LENGTH BUFFER 等于200SIZE BUFFER 等于400,24,属性运算符,用于指定其后存储器操作数的类型运算符:PTR例:MOV BYTR PTRBX,12H,25,其它运算符,方括号: 段重设符段寄存器名: ,方括号中内容为操作数的偏移地址,用于修改默认的段基地址,26,4.2 伪指令,掌握: 伪指令的格式及实现的操作 伪指令的应用,27,伪指令,由汇编程序执行的“指令系统” 作用: 定义变量; 分配存储区 定义逻辑段; 指示程序开始和结束; 定义过程等。,28,常用伪指令,数据定义伪指令 符号定义伪指令 段定义伪指令 结束伪指令 过程定义伪指令 宏命令伪指令,29,一
7、、数据定义伪指令,用于定义数据区中变量的类型及大小 格式:变量名 伪指令助记符 操作数, ;注释,表示符号地址,定义变量类型,定义变量值及区域大小,30,1. 数据定义伪指令助记符,DB 定义的变量为字节型 DW 定义的变量为字类型(双字节) DD 定义的变量为双字型(4字节) DQ 定义的变量为4字型(8字节) DT 定义的变量为10字节型,31,数据定义伪指令例,DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H,以上变量在内存中的存放形式,32,数据定义伪指令的几点说明,伪指令的性质决定
8、所定义变量的属性; 定义字符串必须用DB伪指令 例:DATA1 DB ABCD,66H,A,B,C,D,41H,42H,43H,44H,66H,33,2. 重复操作符,作用: 为一个数据区的各单元设置相同的初值 目的: 常用于声明一个数据区 格式:变量名 伪指令助记符 n DUP(初值,) 例:BW 20 DUP(0),34,3. “?”的作用,表示随机值,用于预留存储空间 MEM1 DB 34H,A,?DW 20 DUP(?),预留40个字节单元,每单元为随机值,随机数 占1个字节单元,35,数据定义伪指令例,M1 DB How are you? M2 DW 3 DUP(11H),3344H
9、DB 4 DUP(?) M3 DB 3 DUP(22H,11H,?),变量在内存中的分区,36,数据定义伪指令例,M1,H,o,w, ,a,M2,11H,11H,00H,44H,33H,r,e, ,y,o,u,?,11H,00H,00H,随机数,M3,11H,22H,11H,22H,11H,22H,XX,XX,XX,XX,XX,XX,XX,37,二、符号定义伪指令,格式:符号名 EQU 表达式 操作:用符号名取代后边的表达式,不可重新定义 例:CONSTANT EQU 100VAR EQU 30H+99H,EQU说明的表达式不占用内存空间,38,三、段定义伪指令,说明逻辑段的起始和结束; 说明
10、不同程序模块中同类逻辑段之间的联系形态,39,段定义伪指令格式,段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,说明逻辑段的起点,说明不同模块中同名段的组和连接方式,40,定位类型,PARA: 段的起点从节边界开始(16个字节为1节) BYTE: 段的起点从存储器任何地址开始 WORD:段的起点从偶地址开始 PAGE: 段的起点从页边界开始(256个字节为1页),41,组合类型,与其它模块中的同名段在满足定位类型的前提下具有的组合方式: NONE: 不组合 PUBLIC: 依次连接(顺序由LINK程序确定) COMMON: 覆盖连接 STACK: 堆栈段的依次连接 AT 表达式
11、:段定义在表达式值为段基的节边界 MEMORY: 相应段在同名段的最高地址处。,42,类别,不同模块连接时将相同类别的段放在连续的内存区域中,43,段定义伪指令例,DATA SEGMENT PUBLIC CODE MEM1 DB 11H,22H DATA ENDS,44,四、设定段寄存器伪指令,说明所定义逻辑段的性质 格式:ASSUME 段寄存器名:段名,段寄存器名:段名,,45,五、结束伪指令,表示源程序结束 格式:END 标号,46,一个完整源程序结构例,DSEG SEGMENT DATA1 DB 1,2, DATA2 DW 1234H DSEG ENDS ESEG SEGMENTDB 2
12、0 DUP(?) ESEG ENDS SSEG SEGMENT STACK STACKDB 200 DUP(?) SSEG ENDS,47,一个完整源程序结构例,CSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOV AX,DSEGMOV DS,AXMOV AX,ESEGMOV ES,AXMOV AX,SSEGMOV SS,AXCSEG ENDSEND START,源程序代码,48,六、过程定义伪指令,用于定义一个过程体 格式:过程名 PROC NEAR / FAR RET过程名 ENDP,P162例,过程入口的符号地址,49,七
13、、宏命令伪指令,源程序中由汇编程序识别的具有独立功能的一段程序代码 格式:宏命令名 MACRO ENDM,宏体,P163例,宏,50,八、其它伪指令,段内程序代码或变量的起始偏移地址 格式:ORG 表达式 例:ORG 2000H,计算值为非负常数,ORG,51,其它伪指令,NAME-为目标程序设定一个名字 格式:NAME 模块名TITLE-为程序清单指定打印标题 格式:TITLE 标题名,可以缺省,52,4.3 功能调用,DOS 功能调用 BIOS功能调用,53,DOS 功能调用,包含多个子功能的功能包,用软中断指令调用,中断类型码固定为21H; 各子功能采用功能号来区分。,附录D,54,DO
14、S 功能调用,设备管理 目录管理 文件管理 其它,55,DOS 功能调用,调用格式:MOV AH,功能号INT 21H,56,一、单字符输入,调用方法:MOV AH,01INT 21H 输入的字符在AL中,57,单字符输入例,GET_KEY: MOV AH,1 INT 21H CMP AL,Y JZ YES CMP AL,N JZ NO JNZ GET_KEY YES: NO: ,交互式应答程序,58,二、字符串输入,注意问题: 调用格式 字符输入缓冲区的定义,59,1. 调用格式,功能号OAH字符串在内存中的存放地址 INT 21H,AH,DS:DX,60,2. 定义字符缓冲区,用户自定义缓
15、冲区格式:,0DH,N1,N2,整个缓冲区,最大可键入字符数,实际键入字符数,存放键入的字符,存放字符个数:65533,61,输入字符串程序段,DAT1 DB 20,?,20 DUP(?)LEA DX,DAT1MOV AH,0AHINT 21H,在数据段中定义,62,输入缓冲区,14H,?,20个字节,定义后的输入缓冲区初始状态:,63,三、单字符显示输出,功能号O2H待输出字符 INT 21H,AH,DL,64,单字符显示输出例,MOV AH,02 MOV DL,41H INT 21H,执行结果: 屏幕显示A,65,四、字符串输出显示,功能号O9H待输出字符串的偏移地址 INT 21H,AH
16、,DS:DX,66,字符串输出显示,被显示的字符串必须以$结束,且所显示的内容不应出现非可见的ASCII码,67,字符串输出显示例,DATA SEGMENT MESS1 DB Input String: 0DH,0AH,$ DATA ENDS CODE SEGMENT MOV AH,09 MOV DX,OFFSET MESS1 INT 21H,68,4.4 汇编语言程序设计,设计步骤: 根据实际问题抽象出数学模型 确定算法 画程序流程图 分配内存工作单元和寄存器 程序编码 调试,69,程序流程图符号,起始:,功能:,判断:,子过程:,70,汇编语言程序结构,顺序结构 循环结构 先判定型 后判定型 分枝结构 单分枝 多分枝 子程序结构,71,本章注意点,完整的汇编语言源程序结构 定义逻辑段,说明段的含义,初始化段寄存器 伪指令 数据定义方式 字符及字符串的输入和显示输出 字符输入缓冲区的定义,输出字符串的定义 源程序的编写 几种结构(顺序、循环、分枝等),72,作业:,作业请从服务器下载 本章书后习题可根据个人情况选择练习,谢谢大家!,