这次总结一下汇编语言中的变量和标号
首先,变量和标号均表示存储单元,也就是某个地址,但不同的是,变量表示的存储单元用来存储数值,而标号表示的单元则是用来存储代码。由此可以推断,变量应该指向DS,标号应该指向CS。
举个例子:COUNT DB 5 ;其中DB就是变量
START: MOV AX,[1234H] ;其中START就是标号
标号的定义很简单,就不多说了,这里总结一下变量的定义:
一.变量的定义
1.定义字节变量
定义字节变量是使用DB伪指令
例:BDATA1 DB 55H
其中BDATA1指向存储数值55H的地址,并且是以1字节为存储、偏移单位为。同时,变量的定义后面可以有不止一个数据。
例:BDATA2 DB 55H,23H,53H
BDATA3 DB 12H
这时的变量名与C++中的数组名类似,它指向存储数据55H的地址,而紧接着的两字节地址分别存储着23H、53H,然后下一个字节的地址才是BDATA3所指向的。
同时,也可以用这条指令定义字符串
例如:STRING DB 'HELLO!'
2.定义字变量和双字变量
定义字变量是使用DW伪指令,定义双字变量是使用DD伪指令。
这两条指令与DB类似,只不过DW是以字(2字节)为存储、偏移单位;DD是以双字(也就是4字节)为存储、偏移单位。
3.定义没有初始值的变量
与定义普通变量类似,只是在数据的位置用‘?’代替
例:BDATA4 DB 55H,23H,65H,?,?
这样,就仅仅给变量分配存储单元,但其中并没有任何数据。
4.定义其他类型变量
使用DQ和DT分别定义8字节和10字节的变量。
5.快速定义
有时我们想在一段存储空间内填入若干个相同的数据,则可以使用循环操作符来快速定义变量
例:BUFFER DW 8 DUP (55H)
其中8是要填入的数据的个数,括号内则是要填入的数据,这条语句运行完后,从BUFFER所指向的存储空间开始再偏移7个字的空间内均存储的是0055H。
二.获取、指定变量和标号的属性
变量和标号的属性包括:
1)所在存储单元的段值
2)段内偏移值
3)类型,变量的类型有:字节(BYTE)、字(WORD)、双字(DWORD);标号的类型有:段内标号(FAR)、段间标号(NEAR)。
1.获取属性
获取属性使用的是析值伪指令,这些指令有:
SEG 变量名、标号名 ;返回段值
OFFSET 变量名、标号名 ;返回偏移值
TYPE 变量名、标号名 ;返回类型
LENGTH 变量名 ;返回利用DUP定义的变量中元素的个数
SIZE 变量名 ;返回利用DUP定义的变量所占的字节数
其中,返回的类型使用数值表示的,对应如下:
字节 1
字 2
双字 4
段内标号 -1
段间标号 -2
2.指定属性
指定属性使用的是属性操作伪指令,一共有两个:PTR和THIS
1)PTR
汇编语言中,我们要明确指出要访问的存储器操作数的类型,PTR就是用于临时性的强制指定变量或标号的类型,这与C++中变量的强制转换类似。
例:MOV WORD PTR [SI],1H ;这条语句就是以字为单位访问1H
这条语句可以用来特定访问某个变量的某一部分。
例:WORD1 DW 2255H
MOV AX,BYTE PTR WORD1
在这个程序段中,是将变量WORD1的低位,也就是55H送到AX中。
2)THIS
这条指令返回一个指定类型的存储器操作数,而不为它分配存储空间,但保留此操作数的段值和偏移值,作为下一个即将分配的单元的段值和偏移值,也就是第一个操作数的数值是无意义的,只是需要其类型、段值和偏移值。这条指令主要是用在符号定义语句(后面的知识)中,来定义一个具有类型、段值和偏移值的表示存储器操作数的符号。
例:MY_BYTE EQU THIS BYTE
MY_WORD DW ?
这段程序执行后,MY_BYTE和MY_WORD拥有相同的段值和偏移值,MY_BYTE是对MY_WORD的低字节的访问,若定义MY_WORD时用的是DB,则对两个变量的访问是一样的。