汇编语言课件第4章.
合集下载
[所有分类]第4章 汇编语言程序设计ppt课件
![[所有分类]第4章 汇编语言程序设计ppt课件](https://img.taocdn.com/s3/m/53557ad5f111f18582d05acb.png)
JMP_128:MOV A,R3
RL A MOV DPTR,#JMPTAB
JMP @A+DPTR JMPTAB:AJMP ROUT00
AJMP ROUT01
┇
┇
AJMP ROUT7F
128个子程序首址
•说明:此程序要求128个转移目的地址(ROUT00 ~ROUT7FH)必须驻 留在与绝对转移指令AJMP相同的一个2KB存储区内。
第4章 汇编语言程序设计及知识
§4.1 编程的步骤、方法和技巧 §4.2 汇编语言源程序的编辑和汇编
2021/5/19
§4.1 编程的步骤、方法和技巧
§4.1.1 编程的步骤 §4.1.2 编程的方法和技巧 §4.1.3 汇编语言程序的基本结构
2021/5/19
编程的步骤
一、分析问题 二、确定算法 三、画程序流程图 四、编写程序
LOOP : CLR C SUBB A,@R1 JNC NEXT MOV A,@R1 SJMP NEXT1
NEXT: ADD A,@R1 NEXT1: INC R1
DJNZ R2,LOOP MOV MAX,A
2021/5/19
循环结构
例:在内部RAM的20H~ 2FH连续16个单元中存放单 字节无符号数。求16个无 符号数之和,并将其和存放 在31H、30H中。用R0作加 数指针,R7作循环次数计 数器。
一、顺序结构
顺序程序是最简单的程序结构,即顺序 结构。
程序按顺序一条一条地执行指令。
2021/5/19
顺序结构举例
例1 双字节乘法子程序。 (R4) (R3)×(R2)=[(R4) ·28+ (R3) ] ·(R2) =(R4) ·(R2) ·28+ (R3) ·(R2)
四章汇编语言程序设计ppt课件

指令助记符:MOV,ADD,…. 指示性(伪指令)操作符:DB,DW,SEGMENT,
ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
汇编语言第4章PPT课件

3
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT) 汇编(MASM) 链接(LINK) 调试(TD)
源文件 . ASM 目标文件 .OBJ 可执行文件.EXE 最终程序
4
3. 汇编语言源程序结构
由多个逻辑段组成,包含: 代码段:存放源程序的所有
数据段名 SEGMENT …
数据段名 ENDS
26
一、数据定义伪指令
用途:定义变量类型,给存储器赋初值,或仅给变量分配存储单 元,而不赋予特定的值。
格式: [变量名] DB 操作数;定义字节 [变量名] DW 操作数;定义字 [变量名] DD 操作数;定义双字 [变量名] DQ 操作数;定义8个字节 [变量名] DT 操作数;定义10个字节
操作数——是赋给变量的初始值,可以有一个,也可以有多个, 但不能超出数据类型范围。操作数可以是数值、字 符串、?、或者DUP。
CLC
;CF=0
LPER:MOV AL,DATA2[SI]
ADC DATA1[SI],AL
INC SI
DEC CX
JNZ LPER
MOV AH,4CH
INT 21H
;返回DOS
CODE ENDS
END START
7
二、汇编语言语句类型及格式
1. 汇编语言语句分类
指令性语句
CPU执行的语句, 能够生成目标代码
段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之
间的位移量。 类 型 字节型、字型和双字型
14
3)表达式
组成:操作数:常量、寄存器名字、存储器操作数 运算符:
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
15
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT) 汇编(MASM) 链接(LINK) 调试(TD)
源文件 . ASM 目标文件 .OBJ 可执行文件.EXE 最终程序
4
3. 汇编语言源程序结构
由多个逻辑段组成,包含: 代码段:存放源程序的所有
数据段名 SEGMENT …
数据段名 ENDS
26
一、数据定义伪指令
用途:定义变量类型,给存储器赋初值,或仅给变量分配存储单 元,而不赋予特定的值。
格式: [变量名] DB 操作数;定义字节 [变量名] DW 操作数;定义字 [变量名] DD 操作数;定义双字 [变量名] DQ 操作数;定义8个字节 [变量名] DT 操作数;定义10个字节
操作数——是赋给变量的初始值,可以有一个,也可以有多个, 但不能超出数据类型范围。操作数可以是数值、字 符串、?、或者DUP。
CLC
;CF=0
LPER:MOV AL,DATA2[SI]
ADC DATA1[SI],AL
INC SI
DEC CX
JNZ LPER
MOV AH,4CH
INT 21H
;返回DOS
CODE ENDS
END START
7
二、汇编语言语句类型及格式
1. 汇编语言语句分类
指令性语句
CPU执行的语句, 能够生成目标代码
段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之
间的位移量。 类 型 字节型、字型和双字型
14
3)表达式
组成:操作数:常量、寄存器名字、存储器操作数 运算符:
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
15
汇编语言-4课堂课件

┇
┇
;程序
MOV AX,4C00H ;程序结束返回DOS
INT 21H
CODE ENDS
;代码段结束
END START
优质内容
4
简化段定义框架
·MODEL SMALL ·386 ·STACK ┇ ;堆栈段 ·DATA ┇ ;数据段
·CODE ;代码段
·STARTUP
┇ ;程序
┇
·EXIT ;返回DOS
• 类型属性 • 变量的类型属性是指存取该变量中的数据所对应的字节数 • 有字节(BYTE)、字(WORD)、双字(DWORD)等
优质内容
17
变量定义时用到的操作符和表达式
• 当前位置计数器($) • 当前位置计数器($)表示当前的偏移值
【例4-4】下列指令是在数据段中定义的,画出其内存中的存储结构,并计算出符号常量LEN1和 LEN2的值。 X1 DB 1,2,3,5 LEN1 EQU $-X1 X2 DW 1234H LEN2 EQU $-X2
·CODE
;代码段
·STARTUP
MOV AX,X ;乘数X→AX
IMUL Y ;X×Y→DX:AX
MOV CX,AX ;
MOV BX,DX ;结果再存放到BX:CX中暂存
MOV AX,X ;X→AX
ADD AX,125 ;X+125→AX
CWD
;将AX转换成双字→DX:AX
SUB AX,CX ;低16位减法
MOV AX,4C00H ;程序结束返回DOS
INT 21H
CODE ENDS
;代码段结束
优质内容
6
END START
·MODEL SMALL ;选择编程模式为小模式
第4章汇编语言程序设计ppt课件

DATA1
11
22
33 44
DATA2
11
00
22
00
44
33
DATA3
22
0
0
0
22
0
0
0
XX
66
55 44 33
28
数据定义伪指令的几点 说明
伪指令的性质决定所定义变量的类型;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
41H
‘A’
42H
‘B’
43H
‘C’
44H
‘D’
AH
DISN:T D2X1H
功能号OAH 字符串在内存中的存放地址
58
2. 定义字符缓冲区
用户自定义缓冲区格式:
N1 N2
存放字符个数:≤255
存放键入的字符 整个缓冲区
实际键入字符数 最大可键入字符数
0DH
59
输入字符串程序段
DAT1 DB 20,?,20 DUP(?)
┇
LEA DX,DAT1 MOV AH,0AH INT 21H
定义的变量为4字型(8字节)
定义的变量为10字节型
26
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H
以上变量在内存中的 存放形式
27
数据定义伪指令例_变量在内存中的
分布
DSEG SEGMENT DATA1 DB 1,2, 3 DUP(?) DATA2 DW 1234H
DSEG ENDS ESEG SEGMENT
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
… 78 56 34 12 00 00 00 00 00 00 …
§4.3 调整偏移量伪指令
[复习]
内存储器分段管理思想:存储空间划分为若干段, 每段内的某个存储单元地址由段起始地址与在段内 的偏移量表示。 物理地址=段起始单元+偏移量(EA) 起始地址由段寄存器提供信息获得 EA由指令地址段获得
③ 注意$和IP是有极大区别的 $ 汇编程序时汇编语言源程序进行转换时, 为所生成二进制代码分配存 储空间时,表示当前位置 IP 计算机在运行机器代码程序时表示即将取 出执行的下一条指令的存储 地址(EA)
归纳小结: 最常用的:EVEN 谨用: ORG与$
§4.4 复合内存变量的定义
1. 重复说明符DUP (1)基本格式 汇编语言提供了变量的重复说明符DUP,其说明的 一般形式如下: count DUP (表达式, 表达式, …, 表达式) 解释:count是重复次数,(表达式, 表达式, …, 表达式)是被重复的部分,“表达式”可以是存储单 元的初值,也可以是含义另一个DUP的式子。如果 在表达式的括号中有多个表达式,那么,它们之间 要用逗号‘,’分开。
1. 调开偏移量伪指令作用
汇编时指示所生成代码存储偏移量
2. 偏移调整伪指令
(1)偶对起EVEN ①偶对齐伪指令格式: EVEN ②伪指令的功能是:告诉汇编程(Assember), 本伪指令下面的内存变量从下一个偶地址单元开始 分配。 如果下一个偏移量是偶地址,那么,该伪指令不 起作用;否则,汇编程序将空出一个字节,从下一 偶地址开始为其后变量分配内存单元。
2. 结构类型的定义
(1)C++的结构类型定义 以学生基本资料为例 Struet student { long num ; char name[20] char sex ; int age ; int score[50] } ;
;
;
// 学号 // 姓名 // 性别 // 年龄 // 成绩
其实质是全部是publie的数据成员,没有函数成员 的类。 其成员的引用: Student Stu ; //定义结构变量Stu Stu· num=02351105 ; //学号 Stu· age = 19 ; //年龄 for (int i=0 ; i<50 ; i++) cin 》 Stu·score[i] ;
②例如: COURSE STRUC NO DD ? CNAME DB ‘Assember’ SCORE DW 0 COURSE ENDS
A NO
s
s
e
m
b
e
r SCORE
CNAME
(2)结构类型变量的定义 在定义某个结构类型后,程序员就可以说明该结 构类型的内存变量。它的说明形式与前面介绍的简 单数据类型的变量说明基本上相一致。其说明格式 如下: [变量名] 结构名 <[字段值表]> 解释: 变量名即为该结构类型的变量名,它可省缺。如 果省缺,则不能用符号名来访问该内存单元; 字段值表是给字段赋初值,中间用逗号‘,’分 开,其字段值的排列顺序及类型应与该结构说明 时各字段相一致; 如果结构变量中某字段用其定义时的缺省值,那 么,可用逗号来表示;如果所有字段都如此,则 可省去字段值表,但必须保留尖括号“<”、“>”。
(1)基本形式: [标号] DD 表达式 (2)存储: 双字变量的定义符为 DD/DWORD (Define Double word),每个双字变量占用二个连续的字单元 (四个 字节)。 例如: DW1 DW 12345678H, ? DW2 DW 0abcd1243H 上述定义的内存分配如下所示,双字的内容也是 按“高高低低”的原则来存储的编语言中,标识符最多由31个字母、 数字及规定的特殊字符(?、@、_、$)等组成,但它 不能用数字开头。标号、内存变量名、子程序名和 宏名等都是标识符。通常情况下,汇编语言不区分 标识符中字母的大小写。
2.规则 建议: (与高级语言一致)
字母
字母 数字 下划线 或 字母 数 字 字母
… ‘I ‘ ’ ‘ ‘ a’ ‘ m’ ‘ ‘ ‘ a’ ‘ ‘s ‘ ‘ ’ t’ u’ ‘ ‘ d’ ‘ e’ ‘ ‘t n’ ’ ‘.’ …
上面的例子也可改写为另一种等价的语句:
MSG1 DB ‘I’, ‘ ‘, ‘a’, ‘m’, ‘ ‘, ‘a’, ‘ ‘, ‘s’, ’t’, ’u’, ’d’, ’e’, ’n’, ’t’, '.'
③假设有下列变量定义,且变量 word1的偏移量为0。 word1 DW 1234h byte1 DB 56h word2 DW 0abcdh ORG 1 byte2 DB ? word3 DW ? byte3 DB ?
(4) 偏移量计数器的值 ①含义:表汇编程序对汇编语言程序进行转换时, 为生成代码分配存储空间的 当前值(偏移量) ②例如: W1 DW $, $ ORG $+3 ;从当前地址开始空3个字节 B1 DB 43h 假设:在给变量W1分配内存单元 时,当前偏移量计数器的值为2。
显然,前者要比后者方便得多,所以,在程序中 都采用前者的书写方式。
4. 字变量定义
(1)基本形式: [标号] DW 表达式 (2)存储:每个字占2个字节——高字节用高地址; 低字节用低地址 例如:
Word1 DW 89H, 1909H, -1 DW 0abcdH, ?, 0
… 89 00 09 19 FF FF CD AB --00 00 …
… 78 56 34 12 ----43 12 CD AB
6. 六字节变量定义
(1)基本形式: [标号] DF 表达式 (2)存储: 六 字 节 变 量 的 定 义 符 为 DF/FWORD (Define Farword)。每个六字节变量占用六个连续的字节。 例如:
DF1 DF 1234567890abH, 0H, -1 DF 1abcd23H 第一个六字节常量1234567890abH在内存中的分 配方式如下所示,它也是按“高高低低”的原则来 存储的。其它六字节常量的存储方式与此一致。
不区分同一字母的大小 一般最好不要超过8个字符 ABCDH是标识符,0ABCDH是16#数
§ 4.2 简单内存变量的定义
1. 含义 在内存储单元起符号名,以便通过符号名访问它, 不然就要求直接通过存储单元偏移量来访问。
2. 内存变量定义的一般形式
定义内存变量语句是程序中经常使用的伪指令语句, 其一般格式如下页所示:
(1)汇编中结构类型的定义——类似C++/C ① 结构定义基本类型 结构名 STRUC [Alignment] [, NONUNIQUE] 数据定义语句序列 结构名 ENDS 其中: 结构名:是一个合法的标识符,且具有唯一性。 结构范围:从“结构名 STRUC”开始,到“结构 名 ENDS”结束 Alignment:用1,2或4(应为2的幂值)来定义 结构中字段的字节边界(Byte boundary) NONUNIQE:要求结构中的字段必须用全名才能 访问
如果下一个地址正好能被Num整除,那么,该伪 指令不起作用; 否则,汇编程序将空出若干个字节,直到下一个 地址能被Num整除为止。
试比较下面二组变量定义,它们的对齐效果一致吗? B1 DB 12H B1 DB 12H EVEN ALIGN 2 W1 DW 4567H W1 DW 4567H
(3) 调整偏移量伪指令ORG ①调整偏移量伪指令格式: ORG 数值表达式 ②伪指令的作用是:告诉汇编程序,本伪指令下 面的内存变量从该“数值表达式”所指定的偏移量 开始分配。
由于字变量的数据是按照“高高低低”的原则存 于存储单元之中的,而字节数据是按照排列顺序存 于存储单元中的,所以,它们的存储方式有所不同 。
试比较下面两个定义的存储顺序。 B1 DB ‘AB’ W1 DW ‘AB’ 其中:41H和42H分别是’A’和’B’的ASCII码。
…
41
42
42
41
…
5. 双字变量定义
… ab 90 78 56 34 12 …
7. 八字节变量
(1)基本形式: [标号] DQ 表达式 (2) 存储 : 八字节变量的定义符为 DQ/QWORD(Define Quadword)。每个八字节变量占用八个连续的字节。 例如: DQ1 DQ 12345678H, 0H, -1234H DQ ?, 1238H, ? 第一个八字节常量12345678H在内存中的分配方 式如下所示,其存储原则与前面相同。其它八字节 常量的存储方式与此一致。
③ 例子 假设有下列变量定义,并且变量B1的偏移量是 偶数。 B1 DB 12H;为了表示方便,不妨再假设其偏 移量为:xxxx0H W1 DW 4567H 可把前面的变量定义 改变成下列形式: B1 DB 12H EVEN W1 DW 4567H
(2) 对齐伪指令ALIGN
①对齐伪指令格式: ALIGN Num 其中:Num必须是2的幂,如:2、4、8和16等。 ②伪指令的作用是:告诉汇编程序,本伪指令下 面的内存变量必须从下一个能被Num整除的地址开 始分配。
②利用偏移量访问某字节——不直观,少用 例如: 设有 EXAM1 STRUC F1 DW ? F2 DB ? EVEN ;偶对齐 F3 DW ? EXAM1 ENDS 并设有定义 E1 EXAM1 <1234H, ’A’, 8765H> ;定义 EXAM1的一个变量E1
下面二种方法都可把结构变量E1中字段F3的内容 赋给寄存器AX 方法(1)用字段名直接引用 MOV AX, E1.F3 方法(2)用字段的偏移量间接引用 LEA SI, E1 MOV AX, [SI+4] ;其中4是字段F3的偏移量
… 78 56 34 12 00 00 00 00 …
8. 十字节变量
(1)基本形式: [标号] DT 表达式 (2) 存储:定义十字节变量的定义符为 DT/TBYTE (Define Tenbytes)。每个十字节变量占用十个连续 的字节。 例如:
§4.3 调整偏移量伪指令
[复习]
内存储器分段管理思想:存储空间划分为若干段, 每段内的某个存储单元地址由段起始地址与在段内 的偏移量表示。 物理地址=段起始单元+偏移量(EA) 起始地址由段寄存器提供信息获得 EA由指令地址段获得
③ 注意$和IP是有极大区别的 $ 汇编程序时汇编语言源程序进行转换时, 为所生成二进制代码分配存 储空间时,表示当前位置 IP 计算机在运行机器代码程序时表示即将取 出执行的下一条指令的存储 地址(EA)
归纳小结: 最常用的:EVEN 谨用: ORG与$
§4.4 复合内存变量的定义
1. 重复说明符DUP (1)基本格式 汇编语言提供了变量的重复说明符DUP,其说明的 一般形式如下: count DUP (表达式, 表达式, …, 表达式) 解释:count是重复次数,(表达式, 表达式, …, 表达式)是被重复的部分,“表达式”可以是存储单 元的初值,也可以是含义另一个DUP的式子。如果 在表达式的括号中有多个表达式,那么,它们之间 要用逗号‘,’分开。
1. 调开偏移量伪指令作用
汇编时指示所生成代码存储偏移量
2. 偏移调整伪指令
(1)偶对起EVEN ①偶对齐伪指令格式: EVEN ②伪指令的功能是:告诉汇编程(Assember), 本伪指令下面的内存变量从下一个偶地址单元开始 分配。 如果下一个偏移量是偶地址,那么,该伪指令不 起作用;否则,汇编程序将空出一个字节,从下一 偶地址开始为其后变量分配内存单元。
2. 结构类型的定义
(1)C++的结构类型定义 以学生基本资料为例 Struet student { long num ; char name[20] char sex ; int age ; int score[50] } ;
;
;
// 学号 // 姓名 // 性别 // 年龄 // 成绩
其实质是全部是publie的数据成员,没有函数成员 的类。 其成员的引用: Student Stu ; //定义结构变量Stu Stu· num=02351105 ; //学号 Stu· age = 19 ; //年龄 for (int i=0 ; i<50 ; i++) cin 》 Stu·score[i] ;
②例如: COURSE STRUC NO DD ? CNAME DB ‘Assember’ SCORE DW 0 COURSE ENDS
A NO
s
s
e
m
b
e
r SCORE
CNAME
(2)结构类型变量的定义 在定义某个结构类型后,程序员就可以说明该结 构类型的内存变量。它的说明形式与前面介绍的简 单数据类型的变量说明基本上相一致。其说明格式 如下: [变量名] 结构名 <[字段值表]> 解释: 变量名即为该结构类型的变量名,它可省缺。如 果省缺,则不能用符号名来访问该内存单元; 字段值表是给字段赋初值,中间用逗号‘,’分 开,其字段值的排列顺序及类型应与该结构说明 时各字段相一致; 如果结构变量中某字段用其定义时的缺省值,那 么,可用逗号来表示;如果所有字段都如此,则 可省去字段值表,但必须保留尖括号“<”、“>”。
(1)基本形式: [标号] DD 表达式 (2)存储: 双字变量的定义符为 DD/DWORD (Define Double word),每个双字变量占用二个连续的字单元 (四个 字节)。 例如: DW1 DW 12345678H, ? DW2 DW 0abcd1243H 上述定义的内存分配如下所示,双字的内容也是 按“高高低低”的原则来存储的编语言中,标识符最多由31个字母、 数字及规定的特殊字符(?、@、_、$)等组成,但它 不能用数字开头。标号、内存变量名、子程序名和 宏名等都是标识符。通常情况下,汇编语言不区分 标识符中字母的大小写。
2.规则 建议: (与高级语言一致)
字母
字母 数字 下划线 或 字母 数 字 字母
… ‘I ‘ ’ ‘ ‘ a’ ‘ m’ ‘ ‘ ‘ a’ ‘ ‘s ‘ ‘ ’ t’ u’ ‘ ‘ d’ ‘ e’ ‘ ‘t n’ ’ ‘.’ …
上面的例子也可改写为另一种等价的语句:
MSG1 DB ‘I’, ‘ ‘, ‘a’, ‘m’, ‘ ‘, ‘a’, ‘ ‘, ‘s’, ’t’, ’u’, ’d’, ’e’, ’n’, ’t’, '.'
③假设有下列变量定义,且变量 word1的偏移量为0。 word1 DW 1234h byte1 DB 56h word2 DW 0abcdh ORG 1 byte2 DB ? word3 DW ? byte3 DB ?
(4) 偏移量计数器的值 ①含义:表汇编程序对汇编语言程序进行转换时, 为生成代码分配存储空间的 当前值(偏移量) ②例如: W1 DW $, $ ORG $+3 ;从当前地址开始空3个字节 B1 DB 43h 假设:在给变量W1分配内存单元 时,当前偏移量计数器的值为2。
显然,前者要比后者方便得多,所以,在程序中 都采用前者的书写方式。
4. 字变量定义
(1)基本形式: [标号] DW 表达式 (2)存储:每个字占2个字节——高字节用高地址; 低字节用低地址 例如:
Word1 DW 89H, 1909H, -1 DW 0abcdH, ?, 0
… 89 00 09 19 FF FF CD AB --00 00 …
… 78 56 34 12 ----43 12 CD AB
6. 六字节变量定义
(1)基本形式: [标号] DF 表达式 (2)存储: 六 字 节 变 量 的 定 义 符 为 DF/FWORD (Define Farword)。每个六字节变量占用六个连续的字节。 例如:
DF1 DF 1234567890abH, 0H, -1 DF 1abcd23H 第一个六字节常量1234567890abH在内存中的分 配方式如下所示,它也是按“高高低低”的原则来 存储的。其它六字节常量的存储方式与此一致。
不区分同一字母的大小 一般最好不要超过8个字符 ABCDH是标识符,0ABCDH是16#数
§ 4.2 简单内存变量的定义
1. 含义 在内存储单元起符号名,以便通过符号名访问它, 不然就要求直接通过存储单元偏移量来访问。
2. 内存变量定义的一般形式
定义内存变量语句是程序中经常使用的伪指令语句, 其一般格式如下页所示:
(1)汇编中结构类型的定义——类似C++/C ① 结构定义基本类型 结构名 STRUC [Alignment] [, NONUNIQUE] 数据定义语句序列 结构名 ENDS 其中: 结构名:是一个合法的标识符,且具有唯一性。 结构范围:从“结构名 STRUC”开始,到“结构 名 ENDS”结束 Alignment:用1,2或4(应为2的幂值)来定义 结构中字段的字节边界(Byte boundary) NONUNIQE:要求结构中的字段必须用全名才能 访问
如果下一个地址正好能被Num整除,那么,该伪 指令不起作用; 否则,汇编程序将空出若干个字节,直到下一个 地址能被Num整除为止。
试比较下面二组变量定义,它们的对齐效果一致吗? B1 DB 12H B1 DB 12H EVEN ALIGN 2 W1 DW 4567H W1 DW 4567H
(3) 调整偏移量伪指令ORG ①调整偏移量伪指令格式: ORG 数值表达式 ②伪指令的作用是:告诉汇编程序,本伪指令下 面的内存变量从该“数值表达式”所指定的偏移量 开始分配。
由于字变量的数据是按照“高高低低”的原则存 于存储单元之中的,而字节数据是按照排列顺序存 于存储单元中的,所以,它们的存储方式有所不同 。
试比较下面两个定义的存储顺序。 B1 DB ‘AB’ W1 DW ‘AB’ 其中:41H和42H分别是’A’和’B’的ASCII码。
…
41
42
42
41
…
5. 双字变量定义
… ab 90 78 56 34 12 …
7. 八字节变量
(1)基本形式: [标号] DQ 表达式 (2) 存储 : 八字节变量的定义符为 DQ/QWORD(Define Quadword)。每个八字节变量占用八个连续的字节。 例如: DQ1 DQ 12345678H, 0H, -1234H DQ ?, 1238H, ? 第一个八字节常量12345678H在内存中的分配方 式如下所示,其存储原则与前面相同。其它八字节 常量的存储方式与此一致。
③ 例子 假设有下列变量定义,并且变量B1的偏移量是 偶数。 B1 DB 12H;为了表示方便,不妨再假设其偏 移量为:xxxx0H W1 DW 4567H 可把前面的变量定义 改变成下列形式: B1 DB 12H EVEN W1 DW 4567H
(2) 对齐伪指令ALIGN
①对齐伪指令格式: ALIGN Num 其中:Num必须是2的幂,如:2、4、8和16等。 ②伪指令的作用是:告诉汇编程序,本伪指令下 面的内存变量必须从下一个能被Num整除的地址开 始分配。
②利用偏移量访问某字节——不直观,少用 例如: 设有 EXAM1 STRUC F1 DW ? F2 DB ? EVEN ;偶对齐 F3 DW ? EXAM1 ENDS 并设有定义 E1 EXAM1 <1234H, ’A’, 8765H> ;定义 EXAM1的一个变量E1
下面二种方法都可把结构变量E1中字段F3的内容 赋给寄存器AX 方法(1)用字段名直接引用 MOV AX, E1.F3 方法(2)用字段的偏移量间接引用 LEA SI, E1 MOV AX, [SI+4] ;其中4是字段F3的偏移量
… 78 56 34 12 00 00 00 00 …
8. 十字节变量
(1)基本形式: [标号] DT 表达式 (2) 存储:定义十字节变量的定义符为 DT/TBYTE (Define Tenbytes)。每个十字节变量占用十个连续 的字节。 例如: