《汇编语言程序设计(sha)》由会员分享,可在线阅读,更多相关《汇编语言程序设计(sha)(69页珍藏版)》请在金锄头文库上搜索。
1、第五章 汇编语言程序设计 第五章 汇编语言程序设计 主要内容: l 汇编语言源程序的结构 l 汇编语言语句格式 l 伪指令 l 汇编语言程序设计 第五章 汇编语言程序设计 5.1 概述 程序是一组为完成某种功能而按一定顺序(由算法 确定)编排的指令序列。 机器语言:二进制数形式的指令和数据,既不直观 ,又不易理解和记忆( B0 64 ) 助记符:用便于记忆的英语单词表示的指令操作码 。它反映了指令的功能和主要特征,便于人们理解 和记忆(MOV AL,64H) 汇编语言:汇编语言是一种用符号表示的、面向 CPU 指令系统的程序设计语言,是用指令的助记 符、符号地址、标号等编写程序的语言 。 第五
2、章 汇编语言程序设计 汇编程序 汇编源程序需翻译成机器语言,变成可执 行文件,机器才能执行,这个翻译过程叫汇编 。高级语言中称该过程为“解释”或“ 编译”。执行翻译的程序称为“汇编程序” 。 汇编 汇编语言源程序 机器语言目标程序 第五章 汇编语言程序设计 汇编语言程序设计与执行过程 输入汇编语言源程序 源文件 .ASM 汇编(编译) 目标文件 .OBJ 链接 可执行文件 .EXE 调试 最终程序 第五章 汇编语言程序设计 5.1.1 汇编语言源程序的结构 汇编语言源程序通常由一个或几个程序 模块组成,每个模块一般由三个逻辑段组成 : 数据段存放数据、变量 堆栈段堆栈区域 代码段存放程序指令
3、第五章 汇编语言程序设计 一个基本的汇编语言程序框架如下: stack SEGMENT DB 100 DUP (stack) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code, DS:data, ES:data start: MOV AX, data MOV DS, AX MOV ES, AX MOV AL, 4CH INT 21H code ENDS END start 堆栈段 数据段 代码段 第五章 汇编语言程序设计 5.1.2 汇编语言的语句与格式 汇编语言的语句有两种: 指令性语句由8086指令助记符构成的语 句
4、 指示性语句由伪指令构成的语句 指令性语句的格式为: 标号: 指令助记符 目的操作数,源操作数 ;注释 指示性语句的格式为: 名字 伪指令 操作数1,操作数2,操作数n ;注释 注:各部分之间至少要用一个空格作为分隔符。 第五章 汇编语言程序设计 指令性语句由CPU执行,每一条指令性语 句都有一条机器码指令与其对应; 指示性语句由汇编程序执行。它指出汇编 程序应如何对源程序进行汇编,如何定义变 量、分配存储单元以及指示程序开始和结束 等。指示性语句无机器码指令与其相对应。 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。 第五章 汇编语言程序设计 语句的构成元素: 标号:指令的符号
5、地址,用来代表指令在存储 器中的地址。只能出现在指令性语句中,标号后 应加上冒号。 名字:段、过程、变量的名字,用来代表它们 在存储器中的地址。只能出现在指示性语句中, 名字后不加冒号。 指令助记符:8086助记符、伪指令 操作数:指令的操作对象,可以是:寄存器、 存储单元、常数或表达式 第五章 汇编语言程序设计 5.1.3 语句中的操作数 1.常量 包括数值常数和字符串常数 数值常数: 二进制数,以B结尾。如01001101B。 十进制数,如85。 十六进制数,以H结尾。第1个数字为A-F时 ,前面应加0,如0F160H。 字符串常数: 包含在单引号中的若干字符。 汇编时被翻译成对应的ASC
6、II码 第五章 汇编语言程序设计 有三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR: NEAR表示标号所在语句与转移指令/ 调用指令在同一码段内。 FAR标号所在语句与转移指令/调用 指令不在同一代码段内。 若没有对类型进行说明,默认为NEAR。 标号通常作为转移指令或CALL指令的转移地址。 2.标号指令所在内存单元的符号地址 第五章 汇编语言程序设计 变量即内存中的存储单元或数据区。 变量名是存储单元(数据区)的符号地 址或名字。 变量也有三个属性: 段地址变量所在段的段地址 偏移量变量单元地址与段首地址之间的 位移量 类
7、型有BYTE、WORD和DWORD三种 变量在程序中作为存储器操作数被引用 3.变量 第五章 汇编语言程序设计 标号和变量名的使用规则 组成:A-Z(不分大小写), 0-9, ? . _ $ 不能以数字开头,句号(.)只能作为首字符 长度小于31个字符 不能与关键字(指令助记符、伪指令、预定 义符号等)重名 不能重复定义 例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #ABC 第五章 汇编语言程序设计 4.表达式 表达式是常数、寄存器、标号、变量与 运算符的组合。 包括数值表达式和地址表达式。 MOV AX, 12 - 4 ;数值
8、表达式 LEA BX, string + 4 ;地址表达式 运算符有5种:算术、逻辑、关系、取地 址、属性。 1)算术运算符 有5个: +,-,*,/,MOD 2)逻辑运算符 有4个: AND、OR、XOR、NOT 第五章 汇编语言程序设计 3)关系运算符 有6个:EQ、NE、LT、GT、LE、GE 关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1,关系为假,结果为全0 例:MOV AX,2 LT 7;(AX)=0FFFFH 4)取地址运算符 SEG:取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 MOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,
9、SEG VAR ;取变量VAR的段地址 第五章 汇编语言程序设计 5)属性运算符 PTR:用来临时改变存储器操作数的类型。 格式: PTR BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址 NEAR、FAR 用于描述转移、调用的目的地址 例:STR1 DW ? ;STR1定义为字类型 MOV AX,STR1 ;合法 MOV AL,STR1 ;非法 MOV AL, BYTE PTR STR1 ;合法 第五章 汇编语言程序设计 5.2 伪指令 数据定义伪指令 符号定义伪指令 段定义和段寄存器指定伪指令 过程定义伪指令 结束伪指令 由汇编程序执行的指令,它本身不被汇编成由汇编程序执行
10、的指令,它本身不被汇编成 机器指令。常用的伪指令有:机器指令。常用的伪指令有: 功能:指示汇编完成规定操作的命令 第五章 汇编语言程序设计 5.2.1 数据定义伪指令 DB DW 变量 DD 操作数1,操作数2, DQ DT 功能:用于定义变量,用变量和存储单元相联系 ,为变量分配内存单元 DB-字节类型 DW-字类型 DD-双字类型 DQ-四字类型 DT-五字类型 第五章 汇编语言程序设计 格式中操作数的形式: 1、一个或多个常数/数值表达式 30H 40H 02H 00H 35H FDH 04H DATA1 DB 30H DATA2 DW 0240H,3500H DATA3 DB (-1*
11、3),(16/4) DATA1 DATA2 DATA3 MOV AX,DATA1;错误 MOV AL,DATA1;正确 MOV AX, DATA2;正确 MOV AL, DATA2;错误 MOV AL, BYTE PTR DATA2;正确 第五章 汇编语言程序设计 2、? ? 用来保留存储空间 , 但不存入数据 DATA5 DB ? DATA6 DW ? - - - 41H 42H 43H 44H 42H 41H 44H 43H DATA5 DATA6 DATA7 DATA8 3、字符串 DATA7 DB ABCD DATA8 DW AB, CD 注意:3个及其以上的字符 只能用DB定义。 第
12、五章 汇编语言程序设计 4、重复方式DUP 格式:变量 定义符 n DUP(表达式1) 其中,n为重复次数 表达式1为重复内容 - - 05H 00H 00H 05H 00H 00H DATA9 DB 2 DUP (?) DATA10 DB 2 DUP(5,2 DUP(0) DATA9 DATA10 第五章 汇编语言程序设计 5.2.2 符号定义伪指令 把一个表达式用一个符号表示,以后凡是出 现该表达式的地方都可用这个符号表示。 1. 等值语句EQU 格式:符号名 EQU 表达式 PORT EQU 40H ; 用PORT代替40H COUNT EQU CX ; 用COUNT代替CX寄存器 M
13、EQU MOV ; 用M代替MOV指令助记符 注: EQU语句不能重新定义,即在同一源程序中,用EQU 定义过的符号不能赋予不同的值。 第五章 汇编语言程序设计 2. 等号语句= 格式:符号名 表达式 例: PP = = 89FAH ;赋值赋值 PP = = PP+1 ; PP = 89FBHPP = 89FBH DIST = BYTE PTRSI+BPDIST = BYTE PTRSI+BP GOTO = JMP GOTO = JMP 例:B EQU BP+8 B EQU 20H 不行! 用EQU定义的符号未清除前,不能重新定义 。清除EQU定义可用PURGE伪指令。 用”=”定义的符号可在
14、任何时候进行重 定义 二者均不占用存储空间,仅是给符号赋值 第五章 汇编语言程序设计 5.2.3 段定义伪指令 汇编语言程序是按段来组织程序和数据的。 用于告诉汇编程序和链接程序如何按逻辑段 来组织程序和利用存储器。 三类段:代码(程序)、数据、堆栈 格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS 功能:定义段名和段属性 SEGMENTSEGMENT语句后可以带有可选参数语句后可以带有可选参数,用以用以规定规定 逻辑段的其他一些逻辑段的其他一些属性属性。 第五章 汇编语言程序设计 1)定位类型 说明如何确定逻辑段的边界。有四种: PARA: 16的倍数地址,地址低4位为零,
15、默认 值。 BYTE : 从任何地址开始。 WORD : 段的起始地址必须是偶数,地址低1 位为0。 PAGE : 256的倍数地址,地址低8位为0。 第五章 汇编语言程序设计 2) 2) 组合类型组合类型 说明不同模块中同名段的组合方式。 PUBLIC:所有此类型的同名段组合成一个逻辑段 ,公用一个段地址,运行时装入同一个物理段中 COMMON:所有此类型的同名段具有相同的起始 地址(覆盖),共享相同的存储区域 AT:指定段的起始地址,不能用于代码段 STACK:专用于说明堆栈段,组合方式同PUBLIC 3) 类别 用单引号括起来的字符串。所有同类别的段被安 排在连续的存储区域中。 第五章 汇编语言程序设计 1. 地址计数器$ 功能:指出汇编地址的偏移量,记载下一 个变量或指令在当前段中的偏移量 l每个段开始时,$=0,随着汇编过程的进 行而自动增值 l$用于指令时,表示本条指令的第一个字 节地址, $用于其他情况时,表示当前值 如:JNE $+6,转向JNE指令的首地址加6 5.2.4 地址计数器伪指令