文章目录
常量与变量
没有人可以定义你,除了你自己!
1.常量
常量(Constant)是程序中使用的一个确定数值
,在汇编阶段
就可以确定,直接编码于指令代码中,不是保存在存储器中可变的变量,因为是编码在指令中的量,和指令一起存储了,所以不用单独开辟主存空间,所以也就没法动态改变它了,这也正是高级语言常量无法修改的原因。
进制 | 数字组成 | 举例 |
---|---|---|
10进制 | 由0-9组成,以D或d(默认可以省略) | 100,100d,100D |
16进制 | 由0-9,A-F组成,以H或h结尾;以A-F开头时,前面要加0,以免与寄存器混淆 | 64h,64H |
2进制 | 由0,1组成,以B或b结尾 | 01110010B,01110010b |
1.1字符和字符串
- 用
单引号或双引号
括起来的字符,其数值是每个字符对应的ASCII码值。例如:‘d’ = 64H;“Hello,Assembly!” - 在支持汉字的系统中,也可括起汉字,每个汉字是
两个字节
。 - 如果字符串中有单引号本身,可以用双引号,反之亦然。
1.2符号常量
- MASM提供的符号定义伪指令有“等价EQU” 和 “等号=”,用来定义常量符号名。
符号名 EQU 数值表达式
符号名 EQU <字符串>
符号名 = 数值表达式
-
通俗的说,在用于数值等价时,EQU用于判断两个量的数值是否相同,“=”表示判断两个量是否是同一个量
-
EQU用于数值等价时不能重复定义符号名,但
“=”允许有重复赋值。
COUNT = 100
COUNT = COUNT + 64H
- 举例:
1.var1是字符串变量
-Personal Computer
var1 byte Personal Computer
2.var2是字符串(常量)
-Personal Computer
var2 equ Personal Computer
1.3数值表达式
数值表达式是指用运算符(MASM中统称为操作符, Operator)连接各种常量所构成的算式。
汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也属于常量。
由于表达式是在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就确定。
主要应用算术运算符:
+、- 、*、/ 、和MOD(取余数)
运用与圆括号表达运算的先后顺序
2.变量
-
随程序运行会发生变化的数据
-
保存在可读可写的主存空间
变量实质上是
主存单元
的数据(即存储器操作数),因而可以改变;变量需要先定义
才能使用;变量具有属性方便使用。
2.1变量定义
- 变量名,自定义,用于表示初值表首个数据的逻辑地址(有时也被称为符号地址)
- 变量名可以省略,这时汇编程序将直接为初值表分配空间,没有符号地址
- 设置变量名是为了便于存取他指示的存储单元
“?”表示初值不确定,即未赋初值
- 如果多个存储单元初值相同,可以用
复制操作符DUP
进行说明
重复次数 DUP (重复参数)
举例:
byte 2 dup(2, 3, dup(4))
2,3,4,4,2,3,4,4
2.2变量定义伪指令
助记符 | byte | word | dword | qword |
---|---|---|---|---|
变量类型 | 字节 | 字 | 双字 | 4字 |
变量定义功能 | 每个数据是字节量,也可以是字符串常量,字节量为8位 | 每个数据是字量,为16位 | 每个数据是双字量,为32位 | 每个数据是4字量,为64位 |
数据范围 | 无符号整数0255;补码表示的有符号整数-128+127 | 16位无符号整数065535;16位补码表示的有符号整数-32768+32768 | 32位无符号整数02^32-1;32位补码表示的有符号整数-2^31+2^31-1 |
byte、word、dword分别对应C语言中的char、short、long类型
2.3多字节数据的存储顺序
2.3.1字节变量顺序存储
2.3.2多字节数据(字、双字)小端存储
wvar6 word 3139h,3832h
bvar6 dword 38323139h
2.3.3根据地址读出数据
2.4变量定位
变量定义的存储空间是按照书写的先后顺序一个接一个分配的。但是,定位伪指令可以控制其存放的偏移地址.
2.4.1 ORG伪指令
ORG伪指令将参数表达的偏移地址
作为当前偏移地址
,从参数指定位置存放:
ORG 参数
2.4.2 ALIGN伪指令
对于字节位存储单元的主存储器来说,多字节数据不仅存在按小端或大端方式存放的问题,还有是否对齐地址边界
的问题。
地址最低位的二进制表示的后两位是“00”,则对齐。例如:
40041
2
H ,2的二进制表示为“0010”,后两位是“10”,故没有对齐
IA-32处理器允许不对齐边界存放数据,不过这样处理器需要更多的读写操作,其性能不如访问对齐地址边界的数据,尤其是在有频繁的存储器数据操作时。故为了更好的性能,需进行地址边界对齐,ALIGN伪指令便是用于此目的(顺序执行的指令之间不能使用)
,格式为:
ALIGN N
其中,N是对齐的地址边界值,取2的乘方(2,4,8…)。
EVEN伪指令用于实现对齐偶地址,与“ALIGN 2”语句的功能一样。
2.5变量属性
2.5.1地址操作符
2.5.2类型操作符
2.5.3总结速记
- 计算某个字符串的
长度
:sizeof或 length - 计算某个数组的
元素个数
:length - 获得某个
变量
的首元地址
:offset - 获得
当前地址
:***$*** - 改变某个变量的
访问类型
:PTR
2.5.4补【补充问题】-offset与$有何区别?
offset: 返回变量名所在的偏移地址,只能用在变量名面前,只能出现在某条指令中
***$***: 返回当前偏移地址,可在数据段中,也可在代码段出现
2.5.5【补充问题】-type 后面加寄存器?
type edx
结果 : 4
因为edx是32位的寄存器,32位是4个字节,故返回4
位(bit)是计算机内部储存的最小单位,一个字节(byte,习惯上用B表示),1B=8bit