汇编语言程序设计-D10
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指示性语句又称伪指令,它没有对应的机器 指令,不由CPU执行,而是在汇编程序汇编时 识别,用于说明CPU的类型、段结构、源程序 起止信息和段内存的安排等。 MASM的伪指令可分为变量定义语句、符号 定义语句、段定义语句、段分配语句、过程定 义语句、群定义语句、结构定义语句、记录定 义语句等。
8
–变量定义语句 ※
程序中凡数据或代码的长度不大于64KB时为近程, 否则为远程。
23
• 简化段定义 DOSSEG • MODEL SMALL • STACK DB 200H • DATA BCDBUF DB 12H • CODE START: MOV AX,DATA MOV DS,AX … END
START
24
•过程定义伪指令(PROC/ENDP)
6
SECOND DW 1122H DATA ENDS
变量名:存放数据存储单元的符号地址
–标号:
给指令语句所在地址取的名字 ◎ 段属性(SEG) ◎ 偏移地址属性(OFFSET) ◎ 距离属性(Distance) 例: (隐含为NEAR)
LOOP:MOV AX,0000
…
JMP LOOP
7
三、 伪指令(指示语言)
ASSUME CS:CODE …SS:STACK2 START: …
MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET TOP … CODE ENDS END START
4. CS的装入 :由起始标号确定CS和IP
21
例:DATA SEGMENT BCDBUF DB 22H DATA ENDS EXTRA SEGMENT BUFF DB 20 DUP(00H) EXTRA ENDS STACK SEGMENT STACK SBUFF DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX CODE ENDS 22 END START
在程序设计中,常把具有一定功能的程序段设计成 一个子程序,又称为过程。 过程定义伪指令的格式如下: 过程名 PROC(NEAR/FAR)
•••
RET
•••
过程名
ENDP
25
1. LABEL 伪指令: 用于给已定义的变量起一个别名。
LABEL 伪指令格式如下:
名称 LABEL 类型/距离
2. (1)定位伪指令 定位伪指令的格式是:ORG 表达式
功能:说明源程序中定义的段由哪个段寄存器去寻址。段 寄存器可以是CS,SS,DS,ES,FS或GS。
3. 段寄存器的装入
ASSUME语句只建立当段和段寄存器之间的联系,但 ASSUME语句不能将各段的段基值装入各个段寄存器, 段基址的装入是用程序的办法。
19
◎DS、ES、FS和GS的装入
DS、ES、FS和GS不能用立即数寻址方式直接装入 ,段基值需先送入通用寄存器,再传送给段寄存器。 例:MOV AX,DATA
17
•组合类型:
•NONE:(隐含)与同名段不连接,独立存在。
•STACK:表明该段为堆栈段,不可缺省。 例:MCODE SEGMENT AT 2050H 则该段的首地址为20500H。 •字长选择: •USE16:段字长为16位,最大段长为64KB
•AT 表达式:表示本段可定义在表达式指示的节边界上。
;(AL)=33H ;(AX)=1025
12
例:MOV AL,A1[3] MOV AX,A2[1]
◎格式二
格式 2 用于定义重复变量,其格式为:
DB
DW
DD
变 量 名
DF
DQ n DUP(表达式)
DT
例:TAB1 DB TAB3 DB 10 DUP(0) 4 DUP(1,2 DUP(50H)) TAB2 DW 2 DUP(?)
2
–指示语句(pseude instruction statements)
指示词句又称伪指令,它不要求CPU执行某种操 作,汇编时也不产生对应的机器代码,而仅仅告诉 汇编程序,对它后面的指令语句和操作数应该如何 产生机器目标代码。
伪指令的格式为: [名字] 伪指令定义符号 [操作数] [;注释]
区别:伪指令名字后无冒号
DS , AX
(2)当前位置计数器
在汇编程序时,用 $ 表示当前的偏移地址值。
DATA SEGMENT
ST DB „ABCDEFGH‟ COUNT EQU $-ST DATA ENDS
26
四 、程序设计概述
与高级语言程序设计类似,在用汇编语言进行程序设计时,同样 应按以下步骤进行。
1.分析问题,建立数学模型
2.确定算法
•USE32:段字长为32位,最大段长为4GB
•分类名:用单引号括起,分类名相同的逻辑段存放在连 续存储空间。
18
2. 段分配语句(ASSUME)
段分配语句用来完成段的分配,说明当前哪些逻辑 段被分别定义为代码段、数据段、堆栈段和附加段。
格式:ASSUME 段寄存器:段名,[段寄存器:段名 ┄ ]
(2)程序流程图和程序如下:
30
(X+Y)*8-X = 2
开始
预置段寄存器 DX X DX (DX)-X DX左移3次 (X+Y)*8
DX X+Y
DX右移得 ((X+Y)*8-X)/2 RESULT DX 结束
31
DATA
SEGMENT
VARX
VARY RESUL DATA SACK1
DW 0006H
;堆栈段
SEGMENT ASSUME CS:CODE,DS:DATA
ASSUME SS:STACK1,ES:EXTRA
28
START:
MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX
• • ••• •
;DD装入段基址
;ES装入段基址 (核心程序段) ;系统功能调用 ;返回操作系统
MOV AH,4CH
INT CODE ENDS END START 21H
29
(一)、 顺序结构程序
例1 编制程序,求下列公式中的Z值,并将结果存放 到RESULT单元中。
Z
设X,Y的值分别存放在VARX,VARY单元中, 运算结果不超过16位。 解:(1)存储单元 RESULT 用来存放结果,VARX 和 VARY 放 X、 Y的值。寄存器 DX 放中间运算结果,左移 1 位相当于乘 2,右 移 1 位相当于除 2,所以可以用左移 3 位得到乘以 8 的结果。
3
二、 MASM 汇编语言数据、 表达式和运算符
–常数
常数是没有任何属性的纯数值。
常数分为两种类型:数值型常数和字符 串型常数。
4
◎数值型常数
1.二进制数:以字母B结尾,如01011101B
2.八进制数:以字母Q或O结尾,如723Q,211Q。 3.十进制数:以字母D(或省略)结尾,如1995D,3508。 4.十六进制数:以字母H结尾,如3A40H,8BH。 ◎字符型常数 用单引号括起来的字符串。如‘ABCD’,‘$123456’等。 每个字符在机内以ASCII码存放,例如‘A’,再内存为 41H。
DW 0007H DW ENDS SEGMENT PARA STACK ?
DW 100H DUP(?)
SACK1 COSEG ENDS SEGMENT ASSUME CS:COSEG ASSUME DS:DATA
ASSUME SS:STACK1
32
START:
MOV AX , DATA
MOV
MOV ADD MOV SAL
3.编制程序流程图
4.编制程序
5.调试程序
27
一个源程序的基本格式如下: DATA DATA SEGMENT ENDS
• • • •
;存放数据项的数据段
EXTRA
EXTRA
SEGEMNT
•
;存放数据项的附加段 ENDS
STACK1
STACK1 CODE
SEGMENT PARA STACK
• • • ENDS •
MOV DS,AX ◎SS及SP的装入: –在段定义伪指令中,选用 “STACK”参数项,在 ASSUME语句中,把堆栈段分配给SS,则SS和SP自 动装入。 –如未使用“STACK”参数项,则用程序实现SS和SP的 装入
20
例: STACK2 SEGMENT
DW 40 DUP(?) TOP LABEL WORD STACK2 ENDS CODE SEGMENT
变量定义语句用来定义字节、字或双字变量,变 量定义语句有两种不同的格式。 ◎格式一
[变量名] DB / DW / DD / DF / DQ / DT 表达式
功能:为变量分配 1 个字节/字/双字/长字/四
字/十字节的存储单元,并赋值。
具体形式:
9
(1)用数值表达式定义变量。例如:
K1 K2 K3 DB DW DD 5AH 2354H 2A00 4455H ;将5AH赋给字节变量K1 ;将2354H赋给字变量K2 ;将2A00 4455H赋给双字变量K3
ACOS EQU 1250H
COUNT EQU 100 BUF EQU ACOS+1000H
MOV CL,COUNT
例2:
ONE =100 COUNT =100 A=ONE S=COUNT+100 A=A+100
15
–段定义指令 ※
在汇编程序设计中,需要将存储器分成若干段, 80486CPU访问存储器时,凭籍段寄存器对各个段 进行访问。通常用段定义语句(SEGMENT/ENDS )来定义各种类型的逻辑段。
(二)简化段定义伪指令
1. 段次序语句(DOSSEG)
格式:DOSSEG 功能:各段在内存的顺序按DOS段次序预定排列。
2. 内存模式语句(.MODEL)
格式:MODEL 模式类型[.高级语言] 功能:指定数据和代码允许使用的长度。 说明:[高级语言]是可选项,可用C、BASIC、FORTRAN、
5
–变量
变量用来定义存放在存储器单元中的数据。 其三重属性为: ◎ 段属性(SEG) ◎ 偏移地址属性(OFFSET) ◎ 类型属性(TYPE) 例:DATA
变量名 SEGMENT FIRST DB 5AH
对变量的操作:
LEA AX,FIRST MOV AX,SECOND MOV AX,FIRST[DI]
第4章 汇编语言程序设计
主要内容
1 MASM宏汇编语言结构 2 MASM汇编语言数据、表达式和运算符 3 伪指令 4 程序设计 5 DOS功能调用 6 实用程序设计举例
1
一、MASM 汇编语句结构
MASM 有两种基本语句,它们是指令语句 和指示语句(又称伪指令) 指令语句(Instruction statements) 指令语句又称可执行语句,它要求 CPU执行某种操作。 指令语句的格式为: [符号:] 指令助记符 [操作数] [ ;注释] 一条指令一条语句可分为4个字段,其中方 . 括号中的字段为可选项。
13
–符号定义语句
◎等值语句(EQU) 格式:符号 EQU 表达式
功能:将表达式的值赋给EQU左边的符号。表 达式可以是常数、变量、标号、数值或地址表达式。
Leabharlann Baidu
◎等号语句
格式:符号 = 表达式 等号语句(=)与EQU语句有同样的功能,区别 在于等号语句定义的符号允许重新定义,使用更加方 便灵活。
14
例1:
ABOV BLOW CLER DB ? DW ? DD ? ;定义变量ABOV为不确定值的字节变量 ;定义变量BLOW为不确定值的字变量 ;定义变量BLOW为不确定值的双字变量
(4)用数组表达式定义变量。例如:
A1 DB 00H,11H,22H,33H
A2
DW
3456H,1025,25*25,1000/3,10A0H
(一)完整段定义伪指令 1. 段定义语句
16
格式:
段名 SEGMENT[定位类型] ,[组合类型],[字长选 择],[类别]
(段体) •••
段名 ENDS
–段名:自己选定,前后一致
–定位类型:
– PAGE:段的首地址后两位为00H,页边界开始 – PARA:(隐含)段的首地址后1位为0H,节边界 –DWORD:4的倍数 –WORD: 偶地址 BYTE:任一字节
K1
K2
5AH
54H 23H
K3
55H
44H 00H 2AH
10
(2)用字符串定义变量。例如:
ONE
TWO
DB
DW
“HOW ARE YOU”
„OK‟
;将“HOW ARE YOU”
字符串赋给变量ONE。 ;将‘OK‟字符串赋给变 量TWO
ONE
„H‟
„O‟ „W‟
…
TWO „O‟ „K‟
11
(3)存放结果时,用(?)定义不确定值的变量
8
–变量定义语句 ※
程序中凡数据或代码的长度不大于64KB时为近程, 否则为远程。
23
• 简化段定义 DOSSEG • MODEL SMALL • STACK DB 200H • DATA BCDBUF DB 12H • CODE START: MOV AX,DATA MOV DS,AX … END
START
24
•过程定义伪指令(PROC/ENDP)
6
SECOND DW 1122H DATA ENDS
变量名:存放数据存储单元的符号地址
–标号:
给指令语句所在地址取的名字 ◎ 段属性(SEG) ◎ 偏移地址属性(OFFSET) ◎ 距离属性(Distance) 例: (隐含为NEAR)
LOOP:MOV AX,0000
…
JMP LOOP
7
三、 伪指令(指示语言)
ASSUME CS:CODE …SS:STACK2 START: …
MOV AX,STACK2 MOV SS,AX MOV SP,OFFSET TOP … CODE ENDS END START
4. CS的装入 :由起始标号确定CS和IP
21
例:DATA SEGMENT BCDBUF DB 22H DATA ENDS EXTRA SEGMENT BUFF DB 20 DUP(00H) EXTRA ENDS STACK SEGMENT STACK SBUFF DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX CODE ENDS 22 END START
在程序设计中,常把具有一定功能的程序段设计成 一个子程序,又称为过程。 过程定义伪指令的格式如下: 过程名 PROC(NEAR/FAR)
•••
RET
•••
过程名
ENDP
25
1. LABEL 伪指令: 用于给已定义的变量起一个别名。
LABEL 伪指令格式如下:
名称 LABEL 类型/距离
2. (1)定位伪指令 定位伪指令的格式是:ORG 表达式
功能:说明源程序中定义的段由哪个段寄存器去寻址。段 寄存器可以是CS,SS,DS,ES,FS或GS。
3. 段寄存器的装入
ASSUME语句只建立当段和段寄存器之间的联系,但 ASSUME语句不能将各段的段基值装入各个段寄存器, 段基址的装入是用程序的办法。
19
◎DS、ES、FS和GS的装入
DS、ES、FS和GS不能用立即数寻址方式直接装入 ,段基值需先送入通用寄存器,再传送给段寄存器。 例:MOV AX,DATA
17
•组合类型:
•NONE:(隐含)与同名段不连接,独立存在。
•STACK:表明该段为堆栈段,不可缺省。 例:MCODE SEGMENT AT 2050H 则该段的首地址为20500H。 •字长选择: •USE16:段字长为16位,最大段长为64KB
•AT 表达式:表示本段可定义在表达式指示的节边界上。
;(AL)=33H ;(AX)=1025
12
例:MOV AL,A1[3] MOV AX,A2[1]
◎格式二
格式 2 用于定义重复变量,其格式为:
DB
DW
DD
变 量 名
DF
DQ n DUP(表达式)
DT
例:TAB1 DB TAB3 DB 10 DUP(0) 4 DUP(1,2 DUP(50H)) TAB2 DW 2 DUP(?)
2
–指示语句(pseude instruction statements)
指示词句又称伪指令,它不要求CPU执行某种操 作,汇编时也不产生对应的机器代码,而仅仅告诉 汇编程序,对它后面的指令语句和操作数应该如何 产生机器目标代码。
伪指令的格式为: [名字] 伪指令定义符号 [操作数] [;注释]
区别:伪指令名字后无冒号
DS , AX
(2)当前位置计数器
在汇编程序时,用 $ 表示当前的偏移地址值。
DATA SEGMENT
ST DB „ABCDEFGH‟ COUNT EQU $-ST DATA ENDS
26
四 、程序设计概述
与高级语言程序设计类似,在用汇编语言进行程序设计时,同样 应按以下步骤进行。
1.分析问题,建立数学模型
2.确定算法
•USE32:段字长为32位,最大段长为4GB
•分类名:用单引号括起,分类名相同的逻辑段存放在连 续存储空间。
18
2. 段分配语句(ASSUME)
段分配语句用来完成段的分配,说明当前哪些逻辑 段被分别定义为代码段、数据段、堆栈段和附加段。
格式:ASSUME 段寄存器:段名,[段寄存器:段名 ┄ ]
(2)程序流程图和程序如下:
30
(X+Y)*8-X = 2
开始
预置段寄存器 DX X DX (DX)-X DX左移3次 (X+Y)*8
DX X+Y
DX右移得 ((X+Y)*8-X)/2 RESULT DX 结束
31
DATA
SEGMENT
VARX
VARY RESUL DATA SACK1
DW 0006H
;堆栈段
SEGMENT ASSUME CS:CODE,DS:DATA
ASSUME SS:STACK1,ES:EXTRA
28
START:
MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX
• • ••• •
;DD装入段基址
;ES装入段基址 (核心程序段) ;系统功能调用 ;返回操作系统
MOV AH,4CH
INT CODE ENDS END START 21H
29
(一)、 顺序结构程序
例1 编制程序,求下列公式中的Z值,并将结果存放 到RESULT单元中。
Z
设X,Y的值分别存放在VARX,VARY单元中, 运算结果不超过16位。 解:(1)存储单元 RESULT 用来存放结果,VARX 和 VARY 放 X、 Y的值。寄存器 DX 放中间运算结果,左移 1 位相当于乘 2,右 移 1 位相当于除 2,所以可以用左移 3 位得到乘以 8 的结果。
3
二、 MASM 汇编语言数据、 表达式和运算符
–常数
常数是没有任何属性的纯数值。
常数分为两种类型:数值型常数和字符 串型常数。
4
◎数值型常数
1.二进制数:以字母B结尾,如01011101B
2.八进制数:以字母Q或O结尾,如723Q,211Q。 3.十进制数:以字母D(或省略)结尾,如1995D,3508。 4.十六进制数:以字母H结尾,如3A40H,8BH。 ◎字符型常数 用单引号括起来的字符串。如‘ABCD’,‘$123456’等。 每个字符在机内以ASCII码存放,例如‘A’,再内存为 41H。
DW 0007H DW ENDS SEGMENT PARA STACK ?
DW 100H DUP(?)
SACK1 COSEG ENDS SEGMENT ASSUME CS:COSEG ASSUME DS:DATA
ASSUME SS:STACK1
32
START:
MOV AX , DATA
MOV
MOV ADD MOV SAL
3.编制程序流程图
4.编制程序
5.调试程序
27
一个源程序的基本格式如下: DATA DATA SEGMENT ENDS
• • • •
;存放数据项的数据段
EXTRA
EXTRA
SEGEMNT
•
;存放数据项的附加段 ENDS
STACK1
STACK1 CODE
SEGMENT PARA STACK
• • • ENDS •
MOV DS,AX ◎SS及SP的装入: –在段定义伪指令中,选用 “STACK”参数项,在 ASSUME语句中,把堆栈段分配给SS,则SS和SP自 动装入。 –如未使用“STACK”参数项,则用程序实现SS和SP的 装入
20
例: STACK2 SEGMENT
DW 40 DUP(?) TOP LABEL WORD STACK2 ENDS CODE SEGMENT
变量定义语句用来定义字节、字或双字变量,变 量定义语句有两种不同的格式。 ◎格式一
[变量名] DB / DW / DD / DF / DQ / DT 表达式
功能:为变量分配 1 个字节/字/双字/长字/四
字/十字节的存储单元,并赋值。
具体形式:
9
(1)用数值表达式定义变量。例如:
K1 K2 K3 DB DW DD 5AH 2354H 2A00 4455H ;将5AH赋给字节变量K1 ;将2354H赋给字变量K2 ;将2A00 4455H赋给双字变量K3
ACOS EQU 1250H
COUNT EQU 100 BUF EQU ACOS+1000H
MOV CL,COUNT
例2:
ONE =100 COUNT =100 A=ONE S=COUNT+100 A=A+100
15
–段定义指令 ※
在汇编程序设计中,需要将存储器分成若干段, 80486CPU访问存储器时,凭籍段寄存器对各个段 进行访问。通常用段定义语句(SEGMENT/ENDS )来定义各种类型的逻辑段。
(二)简化段定义伪指令
1. 段次序语句(DOSSEG)
格式:DOSSEG 功能:各段在内存的顺序按DOS段次序预定排列。
2. 内存模式语句(.MODEL)
格式:MODEL 模式类型[.高级语言] 功能:指定数据和代码允许使用的长度。 说明:[高级语言]是可选项,可用C、BASIC、FORTRAN、
5
–变量
变量用来定义存放在存储器单元中的数据。 其三重属性为: ◎ 段属性(SEG) ◎ 偏移地址属性(OFFSET) ◎ 类型属性(TYPE) 例:DATA
变量名 SEGMENT FIRST DB 5AH
对变量的操作:
LEA AX,FIRST MOV AX,SECOND MOV AX,FIRST[DI]
第4章 汇编语言程序设计
主要内容
1 MASM宏汇编语言结构 2 MASM汇编语言数据、表达式和运算符 3 伪指令 4 程序设计 5 DOS功能调用 6 实用程序设计举例
1
一、MASM 汇编语句结构
MASM 有两种基本语句,它们是指令语句 和指示语句(又称伪指令) 指令语句(Instruction statements) 指令语句又称可执行语句,它要求 CPU执行某种操作。 指令语句的格式为: [符号:] 指令助记符 [操作数] [ ;注释] 一条指令一条语句可分为4个字段,其中方 . 括号中的字段为可选项。
13
–符号定义语句
◎等值语句(EQU) 格式:符号 EQU 表达式
功能:将表达式的值赋给EQU左边的符号。表 达式可以是常数、变量、标号、数值或地址表达式。
Leabharlann Baidu
◎等号语句
格式:符号 = 表达式 等号语句(=)与EQU语句有同样的功能,区别 在于等号语句定义的符号允许重新定义,使用更加方 便灵活。
14
例1:
ABOV BLOW CLER DB ? DW ? DD ? ;定义变量ABOV为不确定值的字节变量 ;定义变量BLOW为不确定值的字变量 ;定义变量BLOW为不确定值的双字变量
(4)用数组表达式定义变量。例如:
A1 DB 00H,11H,22H,33H
A2
DW
3456H,1025,25*25,1000/3,10A0H
(一)完整段定义伪指令 1. 段定义语句
16
格式:
段名 SEGMENT[定位类型] ,[组合类型],[字长选 择],[类别]
(段体) •••
段名 ENDS
–段名:自己选定,前后一致
–定位类型:
– PAGE:段的首地址后两位为00H,页边界开始 – PARA:(隐含)段的首地址后1位为0H,节边界 –DWORD:4的倍数 –WORD: 偶地址 BYTE:任一字节
K1
K2
5AH
54H 23H
K3
55H
44H 00H 2AH
10
(2)用字符串定义变量。例如:
ONE
TWO
DB
DW
“HOW ARE YOU”
„OK‟
;将“HOW ARE YOU”
字符串赋给变量ONE。 ;将‘OK‟字符串赋给变 量TWO
ONE
„H‟
„O‟ „W‟
…
TWO „O‟ „K‟
11
(3)存放结果时,用(?)定义不确定值的变量