- 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)。每个十字节变量占用十个连续 的字节。 例如: