汇编语言 变量
文章目录
一、变量的概念
变量实质上是主存单元的数据,因而可以改变 变量需要事先定义 (Define) 才能使用,并具有属性,方便应用
- 随程序运行会发生变化的数据
- 保存在可读可写的主存空间
- 变量的实质是主存单元的数据,因而可以改变
- 变量需要事先定义才能使用
- 变量具有属性方便应用
- 变量表达主存数据,即存储器操作数
二、变量的定义
变量定义伪指令是最常使用的汇编语言说明性语句,它的汇编语言格式为:
变量名 变量定义伪指令 参数,参数…(初值表)
变量定义之后 :
- ►分配了存储空间
- ►赋予了初值(也可以没有初值)
- ►创建了变量名 (可以获知变量的地址和类型)
(1)变量名
变量名即汇编语句名字部分,是用户自定义的标识符,表示初值表首个数据的逻辑地址。汇编语言使用这个符号表示地址,故有时被称为符号地址。变量名可以省略,在这种情况下,汇编程序将直接为初值表分配空间,没有符号地址
设置变量名是为了方便存取它指示的存储单元
- 变量名是用户标识符,表示首元素逻辑地址
(2)变量定义伪指令
伪指令助记符:byte、word、dword…,表示变量类型
助记符 | 变量类型 | 变量定义功能 |
---|---|---|
BYTE | 字节 | 分配1个或多个字节单元;每个数据是字节量,也可以是字符串常量,字节量表示8位无符号数或有符号数、字符的 ASCII 码值 |
WORD | 字 | 分配1个或多个字单元;每个数据是字量、16 位数据,字量表示 16 无符号数或有符号数、 16 位段选择器、 16 位偏移地址 |
DWORD | 双字 | 分配1个或多个双字单元 ;每个数据是双字量 32 位数据,双字量表示 32 位无符号数或有符号数、32 位段基地址、32 位偏移地址 |
FWORD | 3个字 | 分配1个或多个6字节单元,6字节变常表示含 16 位段选择器和 32 位偏移地址的 48 位指针地址 |
QWORD | 4个字 | 分配一个或多个8字节字单元,8字节量表示 64 位数据 |
TBYTE | 10个字 | 分配一个或多个十字节字单元,表示 BCD 码、 10字节数据(用于浮点运算) |
1.助记符:BYTE
变量类型:字节
-
8位变量定义,使用byte伪指令
►每个数据是一个字节量,占用一个存储单元 -
字符(串)变量定义也使用byte伪指令
►每个字符是一个8位ASCII码 -
变量定义的参数不区别有无符号
►可以是无符号数,也可以是有符号数 -
分配一个或多个字节单元每个数据是8位字节量:
8位无符号整数:0~255
8位补码表示的有符号整数:-128~+127
一个字符(ASCII码值)
压缩BCD码:0~99
非压缩BCD码:0~9 -
BYTE伪指令定义的每个数据都是8位、1个字节
msg byte 'Hello',13,10,0 const1 byte 100,64h,'d' const6 byte 4*4,34h+34
2.助记符:WORD
变量类型:字
-
16位变量定义,使用word伪指令
►每个数据是一个字量,占用2个存储单元 -
变量定义的参数不区别有无符号
►可以是无符号数,也可以是有符号数 -
分配一个或多个字单元每个数据是16位、字量
16位无符号整数:0~65535
16位补码表示的有符号整数:-32768~+32767
16位段地址
16位偏移地址
-
WORD伪指令定义的每个数据都是16位、2个字节
wvar1 word 0,-32768,65535 wvar2 word ? minint = 10 wvar3 word 5 dup(minint)
3.助记符:DWORD
变量类型:双字
-
32位变量定义,使用dword伪指令
►每个数据是一个双字量,占用4个存储单元 -
变量定义的参数不区别有无符号
►可以是无符号数,也可以是有符号数 -
分配一个或多个双字单元每个数据是32位双字量
32位无符号整数:0~232-1
32位补码表示的有符号整数:-231 ~ +231-1
32位逻辑地址(含16位段地址和16位偏移地址)dvar1 dword 0,80000000h,0ffffffffh dvar2 dword ? array dword 5 dup(0)
(3)初值表
初值表是用逗号分隔的一个或多个参数,表示变量初值
-
变量定义的初值表
-
变量定义是申请存储空间
- 同时还可以进行存储单元初始化
- 即用初值表赋予变量初值
-
初值表可以有一个或多个参数,多个参数用逗号分隔
- 各种形式的常量
- 使用“?”表示初值不确定,即未赋初值
- 使用复制操作符DUP表示多个同样数值
-
复制操作符格式:
重复次数 DUP (重复参数)
-
复制操作符举例
word 5 dup(10,?)
-
-
三、多字节数据的存储顺序
(1)字节编址的主存储器
-
最小的存储单位:二进制位(比特位bit)
-
最常用的存储单位:字节(Byte)
-
8个二进制位是一个字节
- 一个存储单元保存一个字节量数据
- 一个存储单元对应一个存储器地址
(2)数据的存储顺序
- 变量保存于字节编址的主存储器中
- 每个存储单元保存一个8位、字节量数据
- 多个字节数据顺序逐个存放在主存相邻单元
(3)小端存储和大端存储
-
小端方式(Little Endian)
- 高字节数据保存在高地址存储单元
- 低字节数据保存在低地址存储单元
-
大端方式(Big Endian)
- 高字节数据保存在低地址存储单元
- 低字节数据保存在高地址存储单元
四、变量的定位
(1)变量(代码)的存储位置
- 变量定义的数据按照定义的先后顺序一个接着一个分配存储空间
- 指令代码也由汇编程序按照语句的书写顺序逐个单元安排存储空间
(2)定位伪指令
定位伪指令可以控制存放的存储器地址
-
ORG伪指令控制存放的偏移地址
org 参数 ;从“参数”指定的位置存放
-
ALIGN伪指令控制数据对齐地址边界
align N ;按对齐N字节地址边界的位置存放
(3)多字节数据对齐地址边界获得更高的性能
地址A对齐N字节边界A mod N=0(能够被N整除的地址)
- 2字节、16位数据是被2整除的地址(偶地址)
- 4字节、32位数据是被4整除的地址(模4地址)
- 8字节、64位数据是被8整除的地址(模8地址)
五、变量属性
(1)变量的地址属性
变量的地址属性指所在存储单元的逻辑地址,含有段基地址和偏移地址
-
地址操作符
通过地址操作符获得变量的地址属性值
- [ ]括起的表达式作为存储器地址指针
- $ 返回当前偏移地址
- OFFSET 变量名 返回变量名所在段的偏移地址
- SEG 变量名 返回段基地址(实地址存储模型)
-
变量地址属性程序
-
数据段使用变量名,代表其偏移地址
00000020 5678 wvar word 5678h =00000016 arr_size = $-array ;计算出当前到ARRAY变量所占存储空间 =0000000B arr_len = arr_size/2 ;(除以类型值)计算出变量个数 00000022 9ABCDEF0 dvar dword 9abcdef0h
-
代码段使用变量名,代表其首个数据(变量值)
00000000 A0 00000000 R mov al, bvar ;bvar等同于[bvar]
-
变量名加减常量,指向首个数据的前后单元
00000005 8A 25 00000001 R mov ah, bvar+1
-
变量名[n] = 变量名+n,常量n表示n个存储单元
指向首个数据的前后单元0000000B 66|8B 1D 00000022 R mov bx, wvar[2]
-
(2)变量的类型属性
变量的类型属性表示变量定义的数据单位
-
类型操作符
通过类型操作符获得变量的类型属性值
- 类型名 PTR 变量名 将变量名按照指定的类型使用
mov eax, dword ptr array;以双字类型访问
- TYPE 变量名 返回占用字节空间的字量数值
mov ebx, type bvar ;获得字节变量类型值 mov ecx, type wvar ;获得字变量类型值 mov edx, type dvar ;获得双字变量类型值
- LENGTHOF 变量名 返回整个变量的数据项数
mov esi, lengthof array ;获得变量的数据个数(项数)
- SIZEOF 变量名 返回整个变量占用的字节数
mov edi, sizeof array ;获得变量所占的存储空间个数
- 类型名 PTR 变量名 将变量名按照指定的类型使用