
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
变量
变量(Variable)代表存放在某些存储单元的数据,这些数据在程序运行期间可以随时被修改.变量是通过变量名在程序中引用,变量名实际上是存储区中一个数据区的名字,以变量名数据的方式供程序员使用,作为指令或伪.指令的操作数,大大方便了程序设计者.
由于变量是在逻辑段中定义.这就决定了变量和标号一样具有段属性、偏移属性和类型属性,前两个和标号的属性相同,而类型属性是指出数据区的数据项的存取单位是字节(BYTE),字(WORD)或数字(DWORD)等.可见变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令
.3 1 变量的定义
变量通常也有三种定义法
.3 1 1 用伪指令DB,DW,DD等来定义
格式:[变量名] 定义数据伪指令〈表达式〉
其中变量名可有可无,若没有名字则该变量为无名变量.表达式可以是常数、保留符号"?"、ASCII码字符串(只能用DB定义)、地址表达式(不能用DB定义)、预置数据表格和用DUP定义的重复值.变量名可在任一逻辑段中定义,其后边不紧跟冒号而是加一空格
.例如:A DB 100;A为一个字节,值为100.
B DB 100,2 3;B值为100,B+1的值为6.
C DB ’ABC’;C的值为41H,C+1的值为42H,C+2的值为43H.D DB ?;
D是一个字节,预留一个字节,可以置入任何内容.
E DB 23 DUP(0);定义23个0,每一个0占一个字节.
F DB 3 DUP(1,2 DUP(0));定义9个数,顺序为:1,0,0,1,0,0,1,0,0.
G DW ’AB’,’CD’;G的值为4142H,G+2的值为4344H.
H DW 2 3;H为一个字,存放顺序为06,00H
I DW ? 预留一个字,占两个字节单元,
3 1 2 用伪指令LABEL定义变量
格式:
变量名 LABEL BYTE/WORD/DWORD
例如:
BUF LABEL BYTE
DB 21
它等价于 BUF DB 21
3 1 3 用伪指令EQU定义变量
格式:变量名 EQU THIS BYTE/WORD/DWORD
THIS是定义任意类型算符,它同LABEL一样用于建立变量或标号类型属性,而其段属性为语句所在段的段地址,偏移属性为所在位置的下一个能分配到的可用偏移地址.例如:
STACK SEGMENT
DW 100 DUP(?
TOP EQU THIS WORD(或TOP LABEL WORD)
STACK END
变量TOP被定义为字类型,它的偏移量应为STACK段定义100个字后的下一个字的偏移量,它恰就是堆栈指针SP的初值,因此经常用这种方法为SP赋初值.
3 1 4 双重定义变量名利用隐含方式和显示方式的双重方式,可以对同一位置定义为双重变量.
格式
〈变量名〉 EQU THIS〈类型〉
〈变量名〉 DB/DW/DD…
例如:
AB EQU THIS BYTE
(或AB LABEL BYTE)
AW DW 50 DUP(0)AW定义为字变量,在AW前使用了THIS BYTE,定义了一个字节类型变量,访问同一个位置,用AB按字节访问,用AW则按字访问.
3 2 变量的访问
3 2 1 变量名作为存储单元的直接地址
变量名用直接寻址时,变量的类型必须与指令的要求相符合.
例如:AB已定义字节变量,AW定义为字变量,用变量名作直接寻址形式如下:
MOV AH,AB
MOV AX,AW
3 2 2 用合成运算符PTR临时改变变量类型
接上例用
MOV CX,WORD PTR AB
MOV CL,BYTE PTR AW
则可临时把AB变为字类型,AW变为字节类型,但段和偏移属性不变.
3 2 3 变量名作为相对寻址中的偏移量
例如:
MOV AX,AB〔SI〕
MOV AX,AW[BX][SI]
在这里AB,AW分别表示它们的偏移量而不是它们所表示的数据,常用于数组或表格操作中,AB[SI]就表示AB数组中第SI个元素.
3 2 4 属性分离符
其中SEG和OFFSET用法和标号相同,分别表示取变量所在段的段地址和变量的偏移地址.而TYPE运算符,将回送该变量类型所表示的字节数.
例如:设AB为字节变量,AW为字变量,则:
MOV AH,TYPE AB即MOV AH,1
MOV AX,TYPE AW即MOV AX,2
3 2 5 取变量数据项个数运算符LENGTH对于变量定义时使用DUP的情况,汇编程序将回送DUP前的重复次数,即分配给该变量的单元数,若表达式有多个DUP,则取第一个DUP项,其它情况则回送1.
例如:ARRAY DW 50 DUP(0)则
MOV CX,LENGTH ARRAY即MOV CX,50
ARRAY1,DW1,2,3 则
MOV CX,LENGTH ARRAY1
即MOV CX,1
可见LENGTH表示数组元素个数,而不管其类型.
3 2 6 取变量数据项长度算符SIZE
SIZE算符,汇编程序将回送分配给该变量的字节数,即
SIZE=LENGTH TYPE
例如:
ARRAY DW 50 DUP(0) 则
SIZE ARRAY=50 2=100
要注意:对字符串变量求其长度,使用SIZE不能达到目的.
例如:
ST DB ’ABCDEFG’ 则
SIZE ST值为1而不是7,欲求字符串长可用COUNT EQU $-ST,则COUNT值为7,其中$为定义ST一串字符后下一个可用的偏移地址.
3 2 7 变量名仅对应数据区第一个数据项
例如:
WORD DW 20 DUP(?)
MOV AX,WORD;第一个元素送AX,
MOV AX,WORD+38;第20个元素送AX.
其它符号
除标号和变量外,符号还可表示常量、段名、过程名、寄存器名和指令助记符等.
(1)符号常数常数也常以符号形式出现,使之更具有通用性且便于修改.例:
COUNT EQU 100 则COUNT就表示常数100.
(2)符号表示指令助记符.例:
MOV EQU MOV则MOVE就表示指令MOV
(3)符号表示寄存器,例:COUNT EQU CX则COUNT就代表寄存器CX.
(4)符号作为段名,例:
DATA SEGMENT
- - - -- - - - - - - - - - -
DATA ENDS
DATA 是段名,引用DATA表示段地址.
(5)符号作为过程名,例:SUBR PROC NEAR/FAR
- - - -- - - - - - - - - - -
SUB ENDP
SUB为过程名,它同样具有段、偏移量和距离类型三个属性
.(6)符号作为宏指令名
宏定义格式宏指令名 MACRO [形式参数]
- - - -- - - - - - - - - - -
ENDM
宏调用格式:
宏指令名 [实参数]
每当引用宏指令名则汇编程序对宏调用作宏展开,就是用宏定义体取代源程序中的宏指令并用实参数取代宏定义中的形式参数