精品课件--汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(5) 使用类型 USE_TYPE 功能:只适用于80386及其以后机型,用来说明使用16位寻址方式还是32位寻址
方式。 格式:USE16 ;使用16位寻址方式 USE32 ;使用32位寻址方式
15
3.数据定义伪指令 功能:用于定义变量,给变量赋初值并分配存储区。 格式:[变量名] DB/DW/DD/DF/DQ/DT 数据项[,数据项,…,数据项] 例:定义数据:
宏指令语句由指令性语句和指示性语句构成,它属于用户自定义的新指令, 其主要作用是替代源程序中具有独立功能的程序段,汇编时产生对应的目标代码, 其功能由硬件(CPU)完成。
3
4.1.1 汇编语言的基本语法
1.语句的一般格式
指令性语句的一般格式为: [标识符:] 操作符 [操作数] [;注释]
伪指令语句的一般格式为: [标识符] 操作符 [操作数] [;注释]
ARRAY DB 12H,-6,56H COUNT EQU $-ARRAY 定义中$-ARRAY表示当前字节的偏移地址减去ARRAY首地址单元的偏移地址,汇 编后COUNT的值为3。显然,如果ARRAY定义为DW,则汇编后COUNT的值为6。
18
5.过程与宏定义伪指令
(1)过程定义伪指令
过程又称子程序,是程序的一部分,它由过程定义伪指令PROC和ENDP分别定义过 程的开始和结束,由RET指令作为其返回指令,过程定义语句的格式如下:
N DW ? A DB 36H B DB 57H C DB 82H DATA ENDS CODE SEGMENT
ASSUME CS:CODE,2D4 S:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,B
MUL AL
;计算B2
MOVZX BX,A
;将A中的字节型数据扩展为字型数据
汇编语言程序设计
1
4.1 汇编语言指令
4.1.1汇编语言的基本语法 4.1.2伪指令
4.2 汇编语言程序设计方法
4.2.1 汇编语言程序设计的基本步骤及开发过程 4.2.2 汇编语言程序设计的基本方法 4.2.3 子程序设计与调用技术 4.2.4 DOS及BIOS功能调用
4.3 汇编语言程序设计举例
MOV AX,DATA
MOV DS,AX
;数据段寄存器初始
MOV AX,EDATA
MOV ES,AX
;附加段寄存器初始
...
MOV AH,4CH
INT 21H
;返回到DOS
CODE ENDS
END START
13
(1) SEGMENT和ENDS伪指令
功能:段定义语句
格式:段名 SEGMENT [定位参数 …
ADD AX,BX ;完成A+B2,结果存入AX中
MOVZX CX,C
;C中的字节型数据扩展为字型数据
Biblioteka Baidu
ADD AX,CX ;计算A+B2+C,结果存入AX中
MOV N,AX
;计算结果存入结果变量N中
MOV AH,4CH
INT 21H
CODE ENDS
END START
25
2.分支程序设计 (1)简单分支程序
① PTR操作符
功能:指定或改变变量的类型
格式:类型说明符 PTR 地址表达式
DAT1 DW 1234H
;在数据段中定义DAT1为字型变量
… MOV AL,BYTE PTR DAT1 ;指令执行后(AL)=34H
(6)数值回送操作符
数值回送操作符加在运算对象之前,用以获得该运算对象对应的某个参数值。
9
④ LENGTH操作符
功能:当数据用重复数据操作符DUP定义时,汇编程序将回送外层DUP给定的 值,对于其他情况返回值总为1。
格式:LENGTH 变量名或标号
例:N1 DB 10 DUP(2,3,5 DUP(1)),6
...
MOV CX,LENGTH N1
;指令执行后,(CX)=10
⑤ SIZE操作符
注意:AT表达式不能在代码段中使用。
14
(3) ORG 伪指令 功能:用以指定其后下一条指令或下个数据区起始单元的偏移地址。如不指定则
每段定义的第一个数据或第一条指令将从偏移地址0000H开始顺序存放。 格式:ORG 数值表达式
(4) ASSUME伪指令 功能:段寄存器说明语句,用于通知汇编程序,寻址逻辑段使用哪一个段寄存器。 格式:ASSUME 段寄存器名:段名,段寄存器名:段名
MOV BX,14H LT 30H ;经汇编后的结果为:MOV BX,0FFFFH
(4)分离运算符
分离运算符有:HIGH和LOW。HIGH截取操作数的高8位,LOW截取操作数的低 8位。
如: MOV BL, LOW 1234H MOV AX,HIGH 1234H
;BL=34H ;AX=0012H
7
(5)属性操作符
DAT1 DB 10H,25,? DAT2 DW 1234H DAT3 DD 1234H
16
例:用DUP重复定义并且可以嵌套: N1 DB 2 DUP(6,3 DUP(7)) 例:定义字符: STR1 DB ‘AB12’ STR2 DW ‘AB’
17
4.地址计数器 $ 功能:①当$用在指令中时,它表示本条指令第一个字节的偏移地址; ②当$用在数据定义伪指令中时,它表示的是当前字节的偏移地址。 例如指令JMP $+8 表示跳转至JMP指令的首地址+8的地址处。 又如在数据段中定义如下:
5
(2) 逻辑与移位运算符 逻辑运算符:AND、OR、XOR、NOT 移位运算符:SHL、SHR
逻辑与移位运算符的功能是在汇编时由汇编程序完成,逻辑与移位指令的功能则 是由CPU完成。
MOV BL,NOT 0FFH ;经汇编后的结果为:MOV BL,0 AND DX,89H AND 0F0H ;经汇编后的结果为:AND DX,80H (3)关系运算符
过程名 PROC 属性
…
;过程体
RET
;过程返回
过程名 ENDP
;过程定义结束
19
(2)宏定义伪指令
宏名 MACRO (形式参数表)
…
;宏体
ENDM
;宏定义结束
宏定义中伪指令MACRO和ENDM也必须成对出现,形式参数表是用逗号 (或空格或制表符)分隔的一个或多个形式参数,它是可选项。选用了形式参数, 则所定义的宏称为带参数的宏,当调用宏时须用对应的实际参数去取代,以实现信 息传送。 (3)条件汇编伪指令
EDATA
DB 100 DUP(?) ENDS
;定义堆栈段 ;定义数据段 ;定义附加段
12
CODE SEGMENT USE16
;定义代码段
ASSUME CS:CODE,SS: STACK1,DS:DATA,ES:EDATA
START: MOV AX,STACK1
MOV SS,AX
;堆栈段寄存器初始
26
例:已知变量X、Y均为一个字节有符号数,它们满足如下定义:
-1 , X<0
Y=
0 , X=0
1 , X>0
试编程根据X的值求出Y。
① SEG操作符
功能:回送变量名或标号所在段的段基址。
格式:SEG 变量名或标号
8
例如:MOV AX,SEG INT_T0 ;将标号INT_T0所在段的段基址赋值给寄存器AX ② OFFSET操作符 功能:回送变量名或标号所在位置的偏移地址。 格式:OFFSET 变量名或标号 将上例中SEG换成OFFSET,则将INT_T0的偏移地址赋值给寄存器AX。 ③ TYPE操作符 功能:回送变量、标号或常数的类型值。对于变量如为字节型,返回值为1,字型 则返回值为2,双字型返回值为4等等。对于标号,则回送代表该标号类型的数值: NEAR为-1,FAR为-2。对于常数,则回送0。 格式:TYPE 变量名、标号或常数
2
4.1 汇编语言指令
指令是构成程序的基本单位,按其作用与编译情况分为: 指令性语句(即符号指令)、指示性语句(即伪指令)和宏指令语句。
指令性语句是可执行语句,与机器指令相对应,它命令CPU进行某种操作, 其功能由硬件(CPU)完成。
指示性语句(伪指令语句)是说明性语句,无对应的机器指令,它仅为汇编程 序提供编译信息,为链接程序提供链接信息,其功能是由相应的软件完成。
条件汇编的主要作用是通知汇编程序,当条件满足时汇编某些指令,否则不汇编。
20
6. 源程序结束伪指令 汇编结束语句有两种格式。 格式1: END 程序的起始地址标号 例如: END START 它通知汇编程序,源程序到此结束,用START做标号的指令是程序的启动指令。
故该标号应放在第一条需要执行的指令之前。 在DOS装载程序的可执行文件(EXE文件)时,自动把标号START所在段的段基
.8086 仅接受8086/8088指令 .286/.286C 接受8086/8088及80286在非保护方式下的指令 .286P 接受8086/8088及80286的所有指令 .386/.386C /.386P/.486/.486C/.486P/.586/.586C/.586P
11
2. 逻辑段定义伪指令
MOV AH,4CH INT 21H
22
4.2 汇编语言程序设计方法
4.2.1 汇编语言程序设计的基本步骤及开发过程 1. 汇编语言程序设计的基本步骤 ① 明确任务、分析问题、确定算法。 ② 画出程序流程图。 ③ 分配内存工作单元和寄存器。
④ 编程与调试。 2.汇编语言程序的开发过程 ① 编辑汇编语言源程序。 ② 汇编源程序。 ③ 连接目标程序。
完整的段定义结构示例:
.486
STACK1 SEGMENT AT 0300H USE16 STACK DB 500 DUP(?)
STACK1 ENDS
DATA
SEGMENT AT 0200H USE16
ORG 0100H
NUM
DW ?
DATA
ENDS
EDATA
SEGMENT AT 0200H USE16
功能:SIZE=LENGTH*TYPE
格式:SIZE 变量名或标号
10
4.1.2 伪指令
伪指令的主要作用是为汇编程序和连接程序提供信息。80X86汇编语言常用的 伪指令有:处理器选择伪指令、逻辑段定义伪指令、数据定义伪指令、过程与宏定 义伪指令等。
1. 处理器选择伪指令 通知汇编程序当前源程序指令是哪一种微处理器指令。
段名 ENDS
连接参数 ‘分类名’]
SEGMENT/ENDS为一对段定义语句,任何一个逻辑段从SEGMENT语句开始, 到ENDS语句结束。
(2) AT 表达式
功能:该属性表示逻辑段在定位时,其段基址等于表达式给出的值。如省略此项 则系统自动给该段分配一个段基址。
可以看出,在上例中指定了堆栈段的段基址为0300H,数据段和附加段的段基址 为0200H。
④调试可执行文件。
23
4.2.2 汇编语言程序设计的基本方法 1.顺序程序设计
例:试编制一个程序,实现N=A+B2+C。 分析:例4-8中的变量A、B、C均为无符号字节型数据,运算结果存入字型变 量N中,编程时可分为以下几个步骤来实现:
① 利用乘法指令计算:B2 ② 利用加法指令计算:A+ B2 ③ 利用加法指令计算:A+ B2+C DATA SEGMENT
EQ(等于)、NE(不等于)、GT(大于)、LT(小于)、GE(大于等于)、LE (小于等于)。
6
功能:将两个操作数进行比较,若关系式成立,所得结果每位均为1,否则每位均 为0。要求两个操作数必须同为数字或是同一段内的两个存储器地址。
MOV AL,2AH EQ 2BH ;经汇编后的结果为:MOV AL,0
2.常量与变量
在程序执行过程中其值可以被改变的量称为变量。使用某变量前, 必须给它定义一个名字,即变量名。
在程序的执行过程中,其值始终保持不变的量即为常量。常量有 立即数、字符串常数和符号常数三种形式。
4
3.运算符 汇编语言中所使用的运算符有算术运算符、逻辑运算符、关系运算符以及汇 编语言特定的操作符等。 (1)算术运算符 算术运算符有:+(加)、-(减)、*(乘)、/(除)、MOD(模除)。 其中“模除”的概念是:做除法取其余数。算术运算符可以用于数字表达式或 地址表达式中。 NUM DB 12H,81H ... MOV AL,NUM+1 ;执行本条指令后(AL)=81H
址赋给CS,把START开始的指令所在单元的偏移量赋给IP。从而CPU自动地从 START开始的那条指令依次执行程序。
21
格式2: END END语句通知汇编程序,源程序到此结束。在模块化程序的子模块中,必须
用格式2作为源程序的最后一条语句。 程序在完成预定任务之后,必须返回DOS。返回DOS最常用的方法是使用DOS系 统4CH功能调用,即执行指令:
方式。 格式:USE16 ;使用16位寻址方式 USE32 ;使用32位寻址方式
15
3.数据定义伪指令 功能:用于定义变量,给变量赋初值并分配存储区。 格式:[变量名] DB/DW/DD/DF/DQ/DT 数据项[,数据项,…,数据项] 例:定义数据:
宏指令语句由指令性语句和指示性语句构成,它属于用户自定义的新指令, 其主要作用是替代源程序中具有独立功能的程序段,汇编时产生对应的目标代码, 其功能由硬件(CPU)完成。
3
4.1.1 汇编语言的基本语法
1.语句的一般格式
指令性语句的一般格式为: [标识符:] 操作符 [操作数] [;注释]
伪指令语句的一般格式为: [标识符] 操作符 [操作数] [;注释]
ARRAY DB 12H,-6,56H COUNT EQU $-ARRAY 定义中$-ARRAY表示当前字节的偏移地址减去ARRAY首地址单元的偏移地址,汇 编后COUNT的值为3。显然,如果ARRAY定义为DW,则汇编后COUNT的值为6。
18
5.过程与宏定义伪指令
(1)过程定义伪指令
过程又称子程序,是程序的一部分,它由过程定义伪指令PROC和ENDP分别定义过 程的开始和结束,由RET指令作为其返回指令,过程定义语句的格式如下:
N DW ? A DB 36H B DB 57H C DB 82H DATA ENDS CODE SEGMENT
ASSUME CS:CODE,2D4 S:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,B
MUL AL
;计算B2
MOVZX BX,A
;将A中的字节型数据扩展为字型数据
汇编语言程序设计
1
4.1 汇编语言指令
4.1.1汇编语言的基本语法 4.1.2伪指令
4.2 汇编语言程序设计方法
4.2.1 汇编语言程序设计的基本步骤及开发过程 4.2.2 汇编语言程序设计的基本方法 4.2.3 子程序设计与调用技术 4.2.4 DOS及BIOS功能调用
4.3 汇编语言程序设计举例
MOV AX,DATA
MOV DS,AX
;数据段寄存器初始
MOV AX,EDATA
MOV ES,AX
;附加段寄存器初始
...
MOV AH,4CH
INT 21H
;返回到DOS
CODE ENDS
END START
13
(1) SEGMENT和ENDS伪指令
功能:段定义语句
格式:段名 SEGMENT [定位参数 …
ADD AX,BX ;完成A+B2,结果存入AX中
MOVZX CX,C
;C中的字节型数据扩展为字型数据
Biblioteka Baidu
ADD AX,CX ;计算A+B2+C,结果存入AX中
MOV N,AX
;计算结果存入结果变量N中
MOV AH,4CH
INT 21H
CODE ENDS
END START
25
2.分支程序设计 (1)简单分支程序
① PTR操作符
功能:指定或改变变量的类型
格式:类型说明符 PTR 地址表达式
DAT1 DW 1234H
;在数据段中定义DAT1为字型变量
… MOV AL,BYTE PTR DAT1 ;指令执行后(AL)=34H
(6)数值回送操作符
数值回送操作符加在运算对象之前,用以获得该运算对象对应的某个参数值。
9
④ LENGTH操作符
功能:当数据用重复数据操作符DUP定义时,汇编程序将回送外层DUP给定的 值,对于其他情况返回值总为1。
格式:LENGTH 变量名或标号
例:N1 DB 10 DUP(2,3,5 DUP(1)),6
...
MOV CX,LENGTH N1
;指令执行后,(CX)=10
⑤ SIZE操作符
注意:AT表达式不能在代码段中使用。
14
(3) ORG 伪指令 功能:用以指定其后下一条指令或下个数据区起始单元的偏移地址。如不指定则
每段定义的第一个数据或第一条指令将从偏移地址0000H开始顺序存放。 格式:ORG 数值表达式
(4) ASSUME伪指令 功能:段寄存器说明语句,用于通知汇编程序,寻址逻辑段使用哪一个段寄存器。 格式:ASSUME 段寄存器名:段名,段寄存器名:段名
MOV BX,14H LT 30H ;经汇编后的结果为:MOV BX,0FFFFH
(4)分离运算符
分离运算符有:HIGH和LOW。HIGH截取操作数的高8位,LOW截取操作数的低 8位。
如: MOV BL, LOW 1234H MOV AX,HIGH 1234H
;BL=34H ;AX=0012H
7
(5)属性操作符
DAT1 DB 10H,25,? DAT2 DW 1234H DAT3 DD 1234H
16
例:用DUP重复定义并且可以嵌套: N1 DB 2 DUP(6,3 DUP(7)) 例:定义字符: STR1 DB ‘AB12’ STR2 DW ‘AB’
17
4.地址计数器 $ 功能:①当$用在指令中时,它表示本条指令第一个字节的偏移地址; ②当$用在数据定义伪指令中时,它表示的是当前字节的偏移地址。 例如指令JMP $+8 表示跳转至JMP指令的首地址+8的地址处。 又如在数据段中定义如下:
5
(2) 逻辑与移位运算符 逻辑运算符:AND、OR、XOR、NOT 移位运算符:SHL、SHR
逻辑与移位运算符的功能是在汇编时由汇编程序完成,逻辑与移位指令的功能则 是由CPU完成。
MOV BL,NOT 0FFH ;经汇编后的结果为:MOV BL,0 AND DX,89H AND 0F0H ;经汇编后的结果为:AND DX,80H (3)关系运算符
过程名 PROC 属性
…
;过程体
RET
;过程返回
过程名 ENDP
;过程定义结束
19
(2)宏定义伪指令
宏名 MACRO (形式参数表)
…
;宏体
ENDM
;宏定义结束
宏定义中伪指令MACRO和ENDM也必须成对出现,形式参数表是用逗号 (或空格或制表符)分隔的一个或多个形式参数,它是可选项。选用了形式参数, 则所定义的宏称为带参数的宏,当调用宏时须用对应的实际参数去取代,以实现信 息传送。 (3)条件汇编伪指令
EDATA
DB 100 DUP(?) ENDS
;定义堆栈段 ;定义数据段 ;定义附加段
12
CODE SEGMENT USE16
;定义代码段
ASSUME CS:CODE,SS: STACK1,DS:DATA,ES:EDATA
START: MOV AX,STACK1
MOV SS,AX
;堆栈段寄存器初始
26
例:已知变量X、Y均为一个字节有符号数,它们满足如下定义:
-1 , X<0
Y=
0 , X=0
1 , X>0
试编程根据X的值求出Y。
① SEG操作符
功能:回送变量名或标号所在段的段基址。
格式:SEG 变量名或标号
8
例如:MOV AX,SEG INT_T0 ;将标号INT_T0所在段的段基址赋值给寄存器AX ② OFFSET操作符 功能:回送变量名或标号所在位置的偏移地址。 格式:OFFSET 变量名或标号 将上例中SEG换成OFFSET,则将INT_T0的偏移地址赋值给寄存器AX。 ③ TYPE操作符 功能:回送变量、标号或常数的类型值。对于变量如为字节型,返回值为1,字型 则返回值为2,双字型返回值为4等等。对于标号,则回送代表该标号类型的数值: NEAR为-1,FAR为-2。对于常数,则回送0。 格式:TYPE 变量名、标号或常数
2
4.1 汇编语言指令
指令是构成程序的基本单位,按其作用与编译情况分为: 指令性语句(即符号指令)、指示性语句(即伪指令)和宏指令语句。
指令性语句是可执行语句,与机器指令相对应,它命令CPU进行某种操作, 其功能由硬件(CPU)完成。
指示性语句(伪指令语句)是说明性语句,无对应的机器指令,它仅为汇编程 序提供编译信息,为链接程序提供链接信息,其功能是由相应的软件完成。
条件汇编的主要作用是通知汇编程序,当条件满足时汇编某些指令,否则不汇编。
20
6. 源程序结束伪指令 汇编结束语句有两种格式。 格式1: END 程序的起始地址标号 例如: END START 它通知汇编程序,源程序到此结束,用START做标号的指令是程序的启动指令。
故该标号应放在第一条需要执行的指令之前。 在DOS装载程序的可执行文件(EXE文件)时,自动把标号START所在段的段基
.8086 仅接受8086/8088指令 .286/.286C 接受8086/8088及80286在非保护方式下的指令 .286P 接受8086/8088及80286的所有指令 .386/.386C /.386P/.486/.486C/.486P/.586/.586C/.586P
11
2. 逻辑段定义伪指令
MOV AH,4CH INT 21H
22
4.2 汇编语言程序设计方法
4.2.1 汇编语言程序设计的基本步骤及开发过程 1. 汇编语言程序设计的基本步骤 ① 明确任务、分析问题、确定算法。 ② 画出程序流程图。 ③ 分配内存工作单元和寄存器。
④ 编程与调试。 2.汇编语言程序的开发过程 ① 编辑汇编语言源程序。 ② 汇编源程序。 ③ 连接目标程序。
完整的段定义结构示例:
.486
STACK1 SEGMENT AT 0300H USE16 STACK DB 500 DUP(?)
STACK1 ENDS
DATA
SEGMENT AT 0200H USE16
ORG 0100H
NUM
DW ?
DATA
ENDS
EDATA
SEGMENT AT 0200H USE16
功能:SIZE=LENGTH*TYPE
格式:SIZE 变量名或标号
10
4.1.2 伪指令
伪指令的主要作用是为汇编程序和连接程序提供信息。80X86汇编语言常用的 伪指令有:处理器选择伪指令、逻辑段定义伪指令、数据定义伪指令、过程与宏定 义伪指令等。
1. 处理器选择伪指令 通知汇编程序当前源程序指令是哪一种微处理器指令。
段名 ENDS
连接参数 ‘分类名’]
SEGMENT/ENDS为一对段定义语句,任何一个逻辑段从SEGMENT语句开始, 到ENDS语句结束。
(2) AT 表达式
功能:该属性表示逻辑段在定位时,其段基址等于表达式给出的值。如省略此项 则系统自动给该段分配一个段基址。
可以看出,在上例中指定了堆栈段的段基址为0300H,数据段和附加段的段基址 为0200H。
④调试可执行文件。
23
4.2.2 汇编语言程序设计的基本方法 1.顺序程序设计
例:试编制一个程序,实现N=A+B2+C。 分析:例4-8中的变量A、B、C均为无符号字节型数据,运算结果存入字型变 量N中,编程时可分为以下几个步骤来实现:
① 利用乘法指令计算:B2 ② 利用加法指令计算:A+ B2 ③ 利用加法指令计算:A+ B2+C DATA SEGMENT
EQ(等于)、NE(不等于)、GT(大于)、LT(小于)、GE(大于等于)、LE (小于等于)。
6
功能:将两个操作数进行比较,若关系式成立,所得结果每位均为1,否则每位均 为0。要求两个操作数必须同为数字或是同一段内的两个存储器地址。
MOV AL,2AH EQ 2BH ;经汇编后的结果为:MOV AL,0
2.常量与变量
在程序执行过程中其值可以被改变的量称为变量。使用某变量前, 必须给它定义一个名字,即变量名。
在程序的执行过程中,其值始终保持不变的量即为常量。常量有 立即数、字符串常数和符号常数三种形式。
4
3.运算符 汇编语言中所使用的运算符有算术运算符、逻辑运算符、关系运算符以及汇 编语言特定的操作符等。 (1)算术运算符 算术运算符有:+(加)、-(减)、*(乘)、/(除)、MOD(模除)。 其中“模除”的概念是:做除法取其余数。算术运算符可以用于数字表达式或 地址表达式中。 NUM DB 12H,81H ... MOV AL,NUM+1 ;执行本条指令后(AL)=81H
址赋给CS,把START开始的指令所在单元的偏移量赋给IP。从而CPU自动地从 START开始的那条指令依次执行程序。
21
格式2: END END语句通知汇编程序,源程序到此结束。在模块化程序的子模块中,必须
用格式2作为源程序的最后一条语句。 程序在完成预定任务之后,必须返回DOS。返回DOS最常用的方法是使用DOS系 统4CH功能调用,即执行指令: