2.2 变量
变量
- 变量:在程序运行期间可以被改变的数据。
- 程序中以变量名的形式来访问变量。
- 变量名就是存放数据的存储单元地址。
变量的定义与预置
- 给变量在内存中分配一定的存储单元。也就是给这个存储单元赋与一个符号名,即变量名,同时还要将这些存储单元预置初值。
定义变量使用数据定义伪指令
- DB: Define Byte
- DW: Define Word
- DD: Define Double Word
- DQ、DT
定义变量的格式
VAR_DATA SEGMENT
DATA1 DB 12H
DATA2 DB 20H,30H
DATA3 DW 5678H
VAR_DATA ENDS
当变量被定义后,就具有了以下三个属性:
-
段属性(SEG)
- 它表示变量存放在哪一个逻辑段中。
- 上例中,变量DATA1、DATA2和DATA3三个变量都存放在VAR_DATA逻辑段中。
- 它表示变量存放在哪一个逻辑段中。
-
偏移量属性(OFFSET)
- 表示变量所在位置与段起始点之间的字节数。
- 上例中,变量DATA1的偏移量为0,DATA2为1,DATA3为3。
- 表示变量所在位置与段起始点之间的字节数。
-
类型属性(DB、DW等)
- 表示变量占用存储单元的字节数
- DB伪指令定义的变量为1字节
- DW定义的变量为字(2字节)
- DD定义的为双字(4字节
- DQ定义的为4字(8字节
- DT定义的为5字(10字节)
- 表示变量占用存储单元的字节数
-
段属性和偏移量属性就构造了变量的逻辑地址
定义变量并赋初值的格式
1、赋数值
DATA1 DB 32,30H ;一次定义两个单元
;DATA1 的内容为32(换成16进制,也就是20H)
;DATA1+1单元内容为30H
2、赋值? :表示可以预置任意内容
DA_BYTE DB ?,?,? ;表示让汇编程序分配三个字节存储单元。这些存储单元的内容的值为任意
3、赋值:字符串(DB DW DD)
注意:DW和DD伪指令给变量赋值不能用两个以上字符构成的符串赋初值,否则将出错;而DB则可以。
对于DB伪指令:
- 字符串用引号括起来,长度不超过255个字符。
- 字符串的每个字符分配一个字节单元,从左到右将各字符的ASCII码以地址递增的顺序依次存放。
举例: STRING1 DB ‘ABCDEF’
对于DW伪指令:
- 可以给最多两个字符组成的字符串分配两个字节存储单元。
- 注意:两个字符的存放顺序是前一个字符放在高地址,后一字符放低地址单元。
举例: STRING2 DW ‘AB’,‘CD’,‘EF’
对于DD伪指令
- 只能给最多2个字符组成的字符串分配4个字节单元。
- 两个字符存放在较低地址的两个字节单元中,存放顺序与DW伪指令相同。
- 而较高地址的两个字节单元存0
举例: STRING3 DD ‘AB’,‘CD’
4、赋值:DUP表达式
- DUP称为重复数据操作符。
格式 例:
DATA_A DB 10H DUP(?) ;10H 分配16个字节单元
DATA_B DB 20H DUP('AB') ;分配20H*2=40H个字节,重复最多40H个,其要重复的内容为字符串‘AB'。
嵌套使用,即表达式2又可以是一个带DUP的表达式。
DATA_C DB 10H DUP(4 DUP(2),7) ;重复10H个数字序列 “2,2,2,2,7”,共占用10H*5=50H个字节
变量使用
引用场景
- 在指令语句中引用
- 在伪指令语句中引用
在指令语句中引用
例 在指令语句中直接引用变量名就是对其存储单元的内容进行存取
DA1 DB 0FEH ;DA1存放了0FEH
DA2 DW 52ACH ;DA2存放了52ACH
......
MOV AL, DAl ;将DA1中存放的0FEH传送到AL中
MOV BX, DA2 ;将DA2中存放的52ACH传送到X中