汇编语言程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1000 1001 1101 1000
MOV AX,BX
汇编:机器只能识别机器指令,所以需要将符号指令
翻译成机器指令,翻译的过程称作汇编。
汇编程序:完成汇编任务的程序。
2
4.2 汇编语言源程序格式
汇编语言源程序结构采用分段式结构。 一个汇编语言源程序由若干段组成,一般有数据段、代码段、
扩展段和堆栈段四种类型,源程序可以根据实际需要确定段 的数目。
格式1:变量名 助记符 操作数,操作数… ;注释 格式2:变量名 助记符 n DUP(操作数,操作数..) ;注释
15
例4.4、4.6、4.7
X1 BUF
X1 DB 08H BUF DW 01H,02H,03H,04H SUM DW ? N DB 3 DUP(01H,02H)
08H
01H 00H
01H
02H 02H 00H
03H 03H 00H
04H 04H 00H
存储器
16
例4.8
BUF1 DB ‘HELLO’ BUF1 SA_BUF DW BUF1
LA_BUF DD BUF1
表达式为地址时, SA_BUF 只能用DD、DW 定义,意为将段地 LA_BUF 址、偏移地址存于 该变量位置。
’H’ ‘E’ ‘L’ ‘L’ ‘O’
SUB2 PROC
; 名为SUB2的NEAR过程开始

RET
; 返回
SUB2 ENDP
; SUB2结束
……
; 可能定义的其它过程
COD1 ENDS
; 代码段结束
26
五、程序结束伪指令
段名 SEGMENT [ 定位类型 ] [组合类型 ] [‘分类名’] ……
段名 ENDS
ENDS必须与SEGMENT成对出现,且段名必须一致。 三个参数为了对该段的类型和属性做说明,一般可以省略。
20
段分配语句ASSUME
ASSUME 伪指令仅用在代码段首行,用来建立 段 与 段寄存 器之间的对应关系。并不把段基地址装入段寄存器。
ESEG SEGMENT
DSCASUTASSAESMTURGATM2:DSEDBMEBCGO?SMV3:CEDASNUXETP,G(0,D3HSSSE) :GSSEG,DS:DSEG,ES:ESEG
ESEG EMNDOSV DS, AX
;将DSEG段的段基址装入DS
SSEG SEMGOMVEANXT,SETSAECGK
★ 宏指令语句
宏指令语句是以宏名定义的一段指令序列,在汇编时,凡 是出现宏指令语句的地方全部用其对应指令序列的目标代 码代替
4
2. 汇编语言语句的格式
指令语句的格式为:
[标号:] 助记符号 [操作数] [;注释]
伪指令பைடு நூலகம்句的格式为:
[名称] 定义符号 [参数][,…参数][;注释]
★ 标号和名称 :代表该语句的存储器地址。
第4章 汇编语言程序设计
4.1 汇编语言概述 4.2 汇编语言源程序格式 4.3 汇编语言程序设计 4.4 DOS功能调用
1
4.1 汇编语言概述
机器指令:用二进制编码的指令 如:1000 1001 1101 1000
机器语言编写程序烦 琐,难记忆,易出错。
符号指令:由助记符、符号组成,与机器指令一一对应
或标号的属性,包括段属性、偏移地址属性、类型属性等。
PTR:类型设置运算符
格式:类型/距离 PTR 变量或标号
功能:将PTR左边的类型属性赋给右边的变量或标号
常与BYTE、WORD、NEAR、FAR等连用
THISE:g:定义类N型1 运算D符B 15H,36H
格式:变量M/O标V号 EAQXU,WTHOIRS D类型PT/R距离N1
NEAR标号可以在段内被引用,它所代表的地址指针为两个字节; FAR标号可以跨段引用,它所代表的地址指针为四个字节。
寄存器
表达式
6
表达式:由常数、变量、操作符和运算符组成。在汇编过程 中(而不是程序执行过程中)即可产生确定的值。运算的结 果作为语句中的操作数使用。
有三种运算符: 算术运算符:+、-、*、/、MOD 逻辑运算符: AND、OR、XOR、NOT 关系运算符:EQ、NE、GT、 LT、 GE 、LE
4.2.1 汇编语言的语句格式 4.2.2 伪指令 4.2.3 汇编语言源程序的结构
3
1. 汇编语言的语句分类
汇编语言有三种基本语句:
★ 指令语句
指令语句是指在汇编时产生目标代码对应着机器某种操 作的语句,每条指令语句都对应着CPU的一条机器指令。
★ 伪指令语句
伪指令语句不产生任何目标代码,它是一种指示性语句, 只是指示汇编程序如何进行汇编,只有在汇编和连接时 才起作用。
DD
返回值 1 2 4
DQ 8
标 NEAR -1[FFH] 号 FAR -2[FEH]
11

CSEG SEGMENT
BUFF
DW 10DUP(1234H),10H,00H
COUN DD 12345678H
CSEG ENDS
则:SEG BUFF = CSEG OFFSET BUFF = 0 TYPE BUFF = 2(字) LENGTH BUFF = 10 SIZE BUFF = 10*2 = 20
例:数组ARRAY定义如下: ARRAY DB 1,2,3,4,5,6,7,8
TRY DB 20
汇编时,计算表达式形成的指令为:
指令为:
MOV AX,150
MOV AX,30*5
MOV CX,8
MOV CX,(TRY-ARRAY)
8
二、逻辑运算符
逻辑运算符在两个操作数之间按位进行二进制布尔运算,结 果产生确定的数值。AND、 OR、 NOT、 XOR
为起始偏移量连续存放,除非遇到另一个ORG语句。 此语句本身并不占内存。
23
四、过程定义伪指令
PROC FAR 、ENDP —— 远过程定义伪指令 PROC NEAR、ENDP —— 近过程定义伪指令
过程名 PROC FAR(NEAR) 〈过程指令集合〉 RET
过程名 ENDP
注:过程定义必须在代码段内 PROC FAR 为定义远过程 PROC NEAR 为定义近过程
4 过程定义伪指令PROC….ENDP 5 源程序结束伪指令END
14
一、数据定义伪指令DB、DW、DD等
用于定义变量、分配存储单元并预置初值。
DB —— 变量为字节数据类型(8位) DW—— 变量为字数据类型(16位) DD —— 变量为双字数据类型(32位) DQ —— 变量为4字数据类型(64位) DT —— 变量为10字节数据类型(80位)
代码段名 SEGMENT ASSUME CS:段名,DS:段名,…
〈代码段内定义,指令集合〉 代码段名 ENDS
例:ASSUME DS:DATA,SS:STACK,CS:CODE
21
DSEG SEGMENT
DATA1 DB 02H BUF1 DW 01H,02H,03H DSEG ENDS
例4.9
功能:该变量或标号的段地址和偏移地址与下一个存储单元 的地址相同,并具有THIS后的属性
Eg4.2:DATA1 EQU THIS WORD
DATA2 DB 12H,34H,56H,78H
13
4.2.2 伪指令
伪指令是给汇编程序的控制命令,在汇编过程中由汇编程序 进行处理。
翻译成目标程序后,这些伪指令就不存在了。MASM伪指令 一共有60种,只需学习常用的一些 1 符号定义伪指令EQU、= 2 数据定义伪指令DB、DW、DD 3 段定义伪指令SEGMENT、ENDS、ASSUME
SEG COUN = CSEG ;段基址 OFFSET COUN = 24 ;偏移量 TYPE COUN = 4(;双类字型) LENGTH COUN = 1;DUP次数 SIZE COUN = 4 ;字节数
12
五、合成运算符(修改属性运算符)
可以在程序运行过程中,通过“修改属性运算符”来修改变量
逻辑运算符只能对常数进行运算,运算结果也是常数。 例: AND BL, 46H AND 0FH
; 汇编后得到 “ AND BL, 06H ” 的目标码
9
三、关系运算符
在两个无符号操作数之间进行大小关系比较 EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE
(小于或等于)、GE(大于或等于)
汇编语言中标识符的命名规则为: ①标识符的第一个字符必须是字母、特殊符号(?、@、下划线) ②从第二个字符开始可以是字母、数字、特殊符号(?、@、下 划线) ; ③标识符不能是保留字(例如MOV、STACK)。
5
★ 操作数
常量: B、D、H字符区分不同进制。字符常量用‘’。十六进制
数如果以字母开头,则必须在该数前面加0,如0F5H。 变量:指存放在某些存储单元中的值。具有如下三种属性: 段属性:指变量所在段的段基址。 偏移量属性:指变量单元地址与段的起始地址之间的地址偏移量。 类型属性:是指变量所占存储单元的字节数。类型有字节 (BYTE) 、字(WORD)、双字(DWORD)等。 标号:三种属性:段属性、偏移量属性、类型属性(NEAR和 FAR。
注:如果在过程定义中没有写明是NEAR过程或FAR过程,则 汇编器将这个过程默认为NEAR过程。
25

COD1 SEGMENT
ASSUME CS: COD1, ……
……
; 代码段中的其它语句(主程序)
SUB1 PROC FAR; 名为SUB1的FAR过程开始
… RET SUB1 ENDP
; 返回 ; SUB1结束
SEG
取变量或标号所在段的段基址,结果为16位值
OFFSET取变量或标号的段内偏移量,结果为16位值
TYPE 取变量或标号的类型
LENGTH 取变量重复次数 or 1 只和有无DUP有关
SIZE 取分配给变量的字节个数 SIZE=LENGTH*TYPE
类型
变 DB 量 DW
有两种操作符: 分析操作符:SEG、OFFSET、TYPE、SIZE、LENGTH 合成操作符:PTR(类型设置)、THIS(定义类型)
7
一、算术运算符 +、-、*、/、MOD
数值表达式中可使用所有算术运算符 地址表达式仅使用‘+、-’算术运算符 /除法,取商。MOD除法取余数。
STK DBMO10V0EDSU,P(A?X) SSEG ENMDOSV AX, SSEG
MOV SS, AX
;将ESEG段的段基址装入ES ;将SSEG段的段基址装入SS

CSEG ENDS
END START 22
ORG 定位伪指令
功能:当前指令的起始偏移地址。 语句格式:ORG 表达式或常量 ORG语句之后段内所有的数据或代码均以表达式或常量的值
若关系满足则返回全1,否则返回全0。(0FFH\0FFFFH\0) 两个操作数必须为 数据 或是同一段内的两个存储单元的地址 例:
MOV AX, 0A2H NE 02H ; 汇编后得到 “ MOV AX, 0FFFFH ” 的目标码
10
四、分析运算符(数值返回运算符)
对单个操作数进行属性分解,分别返回不同属性的值
BUF1的偏移地址
BUF1的偏移地址
BUF1的段基址
存储器 17
二、符号定义伪指令EQU、=
格式:符号名 EQU 表达式 功能:用于给变量、标号、常数、指令、表达式等定义一
个符号名,程序中用到左边的变量标号时可用右边的常数 或表达式代替 特点 :一经定义不能重新定义
例: COUNT EQU 100 DATA EQU COUNT+2(注:count必须提前定义) C1 EQU ADD
24
过程名实质上是过程入口的符号地址,也有三种属性:段属 性 、 偏 移 量 属 性 和 类 型 。 过 程 的 类 型 属 性 可 以 是 NEAR 或 FAR。
过程和其它程序可定义在同一个段中,也可定义在不同的段 中。对过程的调用要使用CALL语句,如: CALL PROC_NAME1
18
等号伪指令 = 用于定义符号常量 PP = 89FAH PP = PP+1 ; PP = 89FBH
等号语句与EQU语句的相同点在于:定义符号而非变量,故 用EQU、= 定义的符号不占用存储器单元
区别在于:等号伪指令可以在同一源程序中重复定义符号而 无需解除
19
三、段定义语句
源程序分段编写,一个程序由若干逻辑段构成。 段定义语句 SEGMENT / ENDS 用于对 DS、ES、SS、CS 段的定义 语句格式:
相关文档
最新文档