2.2 变量


变量

  • 变量:在程序运行期间可以被改变的数据。
  • 程序中以变量名的形式来访问变量。
  • 变量名就是存放数据的存储单元地址

变量的定义与预置

  • 给变量在内存中分配一定的存储单元。也就是给这个存储单元赋与一个符号名,即变量名,同时还要将这些存储单元预置初值

定义变量使用数据定义伪指令

  • DB: Define Byte
  • DW: Define Word
  • DD: Define Double Word
  • DQDT

定义变量的格式

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中