第13章是简单内存变量的定义的学习笔记,中间经过了调整偏移量的伪指令的学习,再继续学习复合内存变量的学习。
简单内存变量回顾:
DB/BYTE(字节变量)
DW/WORD(字变量)
DD/DWORD(DoubleWord,双字,四字节)
DF/FWORD(Farword,三字,六字节)
DQ/QWORD(Quadword,四字,八字节)
DT/TBYTE(Tenbytes,十字节)
1. 重复说明符DUP
对于少量的内存变量,可以使用简单内存变量的定义方式,但如果我们现在要定义一万个byte类型的内存变量呢?
这时候就可以使用重复说明符DUP了,形式如下:
count DUP (表达式,表达式……,表达式)
count是重复次数,后面括号内的内容是重复的内容,比如:
BUFFER DB 100 DUP (?) //这个是100个byte
STRING DB 120 DUP ('ABCDE'),0 //这个是120个串
DATA1 DW 50 DUP (10H,20 DUP(1,2,3), 20H) //这个包含了一个子重复说明符,重复20次1,2,3
POINTS DD 12,30 DUP (0) //第一个内存单元是12,然后跟着30个0
2. 结构类型说明符STRUC
DUP只是重复一种类型,汇编还支持扩展自己的数据类型,可以把几种不同的基础数据类型组合在一起。
复合数据类型的定义使用结构类型说明符STRUC。
1). 结构类型的定义
用STRUC和ENDS可以把一系列的数据定义语句括起来组成新的,用户定义的结构类型,一般说明格式如下:
结构名 STRUC [Alignment][, NONUNIQUE]
数据定义语句序列
结构名 ENDS
结构名是一个合法标识符,且具有唯一性,前后结构名相一致。结构内被定义的变量称为结构字段,变量名就是字段名。
一个结构中可以有任意多个字段,字段名在结构内不可重复。
Alignment是对齐方式,可选的,可以用1,2,4来指定结构中字段的字节边界,缺省值是1。
NonUnique要求结构中的字段必须用全名才能访问。
例如:
COURSE STRUC
NO DD ?
CNAME DB 'Assember'
DW 0
COURSE ENDS
结构Course有4 + 8 + 2 = 14个字节,前俩字段有名称,第三个字段没字段名,可以用偏移量来访问。
2). 结构类型变量的定义
在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。和简单数据类型变量的说明差不多。
[变量名] 结构名 <[字段值表]>
变量名是可选的,不写的话,只能用偏移量了。
结构名是定义的
字段值表用逗号分隔开各个字段,不写的话将使用定义结构体时候的缺省值,但是必须保留<>该括号。
3). 结构类型字段的引用
定义结构类型的变量后,如果要访问结构中的某个字段,可以使用.操作符
结构变量名.字段名
和高级语言的引用方式是一样的,不过还可以通过偏移量来引用,但是很不直观,比如
EXAM1 STRUC
F1 DW ?
F2 DB ?
EVEN ;偶对齐伪指令
F3 DW ?
EXAM1 ENDS
E1 EXAM1 <1234h,'A',2234h>
假如要引用E1中的F3,可以这样引用:
MOV AX, E1.F3
也可以通过偏移量
LEA SI, E1
MOV AX, [SI + 4] ;如果没有上面的偶对齐指令,就是加三了 呵呵 偶对齐 是为了更快的读取内存单元数据的
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)