标识符和表达式是程序设计经常用到的两个概念,在用高级语言编程的时候,如果程序要对某个变化的量进行处理时,通常要对该变化的量定义一个具有某种数据类型的符号名,用该符号名也就是使用了该变化量,在汇编语言中也是这样,不同的只是说明和引用的方式。
一 标识符
在汇编语言中,标号,内存变量名,子程序名和宏名等都是标识符,一般最多由31个字母,数字以及规定的特殊字符(? @ _ $)等组成,并且不能用数字开头,通常情况下汇编语言并不区分标识符中字母的大小写。
和高级语言的变量名一样,一般要求标识符的名字比较有意义,会改善程序的可读性,并且有助于对程序的理解,但是标识符不能是汇编语言的保留字,汇编语言的保留字主要是:指令助记符,伪指令定义符,寄存器名以及一些具有特殊含义的字符串等。
二 简单内存变量的定义
在编程时,往往要根据程序的需要定义一些内存单元。在高级语言中要给存储单元一个符号名,然后通过引用该符号名来访问其所对应的存储单元,而在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。当给存储单元取符号名,则可通过该符号名来访问其对应的存储单元,当不给存储单元取符号名时,则可通过存储单元的偏移量来访问它。
在汇编语言中,常用的数据类型有字节,字和双字等。
1. 内存变量定义的一般形式
定义数据变量语句是在程序中经常使用的伪指令语句,其一般的格式为:
[变量名] 定义符 表达式1[, 表达式2] ;注释
(1) 变量名必须是一个合法的标识符 可以写,也可以不写(不写的时候只能通过内存单元的偏移量来访问)
(2) 数据定义符用于确定内存单元的数据类型 常用的定义符有 DB DW DD等
(3) 表达式是定义内存单元时的初值表达式 一个定义语句可以有多个初值表达式 各个表达式之间用,分隔开,如果某个存储单元没有初值也必须用一个问号?来表示
(4)在定义语句的后面可以书写注释内容 当然也是可选的
在定义变量时,虽然变量名是可选的,但一定要写,否则寻址很不方便(用偏移量肯定不如直接用标识符方便)
2 字节变量
定义字节变量的定义符是DB/BYTE,每个字节只占用一个字节单元。其中BYTE是MASM6.0及其以后的版本的数据类型说明符。
例如:
COUNTER DB 6
DB 'A', 'D', 0Dh, '$'
TABLE DB 1, 3, 5, 7, 9, 11
上面的定义语句经过汇编后产生的内存单元如下:
COUNTER指向第一个格子06,'A'的ASCII码是41,所以第二个内存单元是41,TABLE指向01的格子。
定义语句的第二行没有给出变量名,访问这些存储单元的时候可以用COUNTER向后偏移,或者用TABLE向前偏移。这点和高级语言不一样,高级语言要用某个标识符来说明变量,也必须用该变量名来访问某个存储单元。
用定义符DB还可以定义字符串,在定义字符串的时候,必须用单引号或双引号把所要的字符括起来,引号内的字符一次放在字节单元里。
比如:
MSG1 DB "I am a student."
汇编后产生的内存单元:
(实际上上面的格子里都应该是ASCII码,这样写只是比较直观)
3. 字变量
定义字变量的定义符为DW/WORD,每个字占用连续的两个内存空间。
比如:
Word1 DW 89H,1989H, -1
DW 0abcdH, ?, 0
内存分配如下:
4. 双字变量
定义双字变量的定义符是DD/DWORD,每个双字变量占用四个内存空间。
比如:
DW1 DD 12345678H,?
DW2 DD 0abcd1243H
5. 多字变量
六字变量:DF
八字变量:DQ
十字变量:DT
一 标识符
在汇编语言中,标号,内存变量名,子程序名和宏名等都是标识符,一般最多由31个字母,数字以及规定的特殊字符(? @ _ $)等组成,并且不能用数字开头,通常情况下汇编语言并不区分标识符中字母的大小写。
和高级语言的变量名一样,一般要求标识符的名字比较有意义,会改善程序的可读性,并且有助于对程序的理解,但是标识符不能是汇编语言的保留字,汇编语言的保留字主要是:指令助记符,伪指令定义符,寄存器名以及一些具有特殊含义的字符串等。
二 简单内存变量的定义
在编程时,往往要根据程序的需要定义一些内存单元。在高级语言中要给存储单元一个符号名,然后通过引用该符号名来访问其所对应的存储单元,而在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。当给存储单元取符号名,则可通过该符号名来访问其对应的存储单元,当不给存储单元取符号名时,则可通过存储单元的偏移量来访问它。
在汇编语言中,常用的数据类型有字节,字和双字等。
1. 内存变量定义的一般形式
定义数据变量语句是在程序中经常使用的伪指令语句,其一般的格式为:
[变量名] 定义符 表达式1[, 表达式2] ;注释
(1) 变量名必须是一个合法的标识符 可以写,也可以不写(不写的时候只能通过内存单元的偏移量来访问)
(2) 数据定义符用于确定内存单元的数据类型 常用的定义符有 DB DW DD等
(3) 表达式是定义内存单元时的初值表达式 一个定义语句可以有多个初值表达式 各个表达式之间用,分隔开,如果某个存储单元没有初值也必须用一个问号?来表示
(4)在定义语句的后面可以书写注释内容 当然也是可选的
在定义变量时,虽然变量名是可选的,但一定要写,否则寻址很不方便(用偏移量肯定不如直接用标识符方便)
2 字节变量
定义字节变量的定义符是DB/BYTE,每个字节只占用一个字节单元。其中BYTE是MASM6.0及其以后的版本的数据类型说明符。
例如:
COUNTER DB 6
DB 'A', 'D', 0Dh, '$'
TABLE DB 1, 3, 5, 7, 9, 11
上面的定义语句经过汇编后产生的内存单元如下:
… |
06 |
41 |
44 |
0D |
24 |
01 |
03 |
05 |
07 |
09 |
0B |
… |
COUNTER指向第一个格子06,'A'的ASCII码是41,所以第二个内存单元是41,TABLE指向01的格子。
定义语句的第二行没有给出变量名,访问这些存储单元的时候可以用COUNTER向后偏移,或者用TABLE向前偏移。这点和高级语言不一样,高级语言要用某个标识符来说明变量,也必须用该变量名来访问某个存储单元。
用定义符DB还可以定义字符串,在定义字符串的时候,必须用单引号或双引号把所要的字符括起来,引号内的字符一次放在字节单元里。
比如:
MSG1 DB "I am a student."
汇编后产生的内存单元:
… | 'I' | ' ' | 'a' | 'm' | ' ' | 'a' | ' ' | 's' | 't' | 'u' | 'd' | 'e' | 'n' | 't' | … |
(实际上上面的格子里都应该是ASCII码,这样写只是比较直观)
3. 字变量
定义字变量的定义符为DW/WORD,每个字占用连续的两个内存空间。
比如:
Word1 DW 89H,1989H, -1
DW 0abcdH, ?, 0
内存分配如下:
89 | 00 | 09 | 89 | FF | FF | CD | AB | -- | -- | 00 | 00 | … |
4. 双字变量
定义双字变量的定义符是DD/DWORD,每个双字变量占用四个内存空间。
比如:
DW1 DD 12345678H,?
DW2 DD 0abcd1243H
78 | 56 | 34 | 12 | -- | -- | -- | -- | 43 | 12 | CD | AB |
5. 多字变量
六字变量:DF
八字变量:DQ
十字变量:DT