80x86汇编语言学习笔记(四)

时间:2022-07-11 19:45:57

这次总结一下汇编语言中的变量和标号


首先,变量和标号均表示存储单元,也就是某个地址,但不同的是,变量表示的存储单元用来存储数值,而标号表示的单元则是用来存储代码。由此可以推断,变量应该指向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,则对两个变量的访问是一样的。