汇编语言基础
定义数据
汇编器识别一组基本的内部数据类型,按照数据大小(字节,字,双字等等)、是否有符号、是整数还是实数来描述其类型。
数据定义语句
数据定义语句在内存中为变量留出存储空间,并赋予一个可选的名字。数据定义语句根据内部数据类型定义变量
下面举一个简单的例子:
count DWORD 12345
**名字:**分配给变量的可选名字必须遵守标识符规范
**伪指令:**数据定义语句中的伪指令可以是基本的内部数据类型
初始值: 数据定义中至少要有一个初始值
定义BYTE和SBYTE数据
BYTE(定义字节)和SBYTE(定义有符号字节)为一个或多个无符号或有符号数值分配内存空间。每个初始值在存储时,都必须是8位的。
问号初始值使得变量未初始化,这意味着在运行时分配数值到该变量
DB伪指令也可以定义有符号或无符号的8位变量
多初始值
list BYTE 10,20,30,40
字节数组:
list BYTE 10,20,30,40。
BYTE 50,60,70,80
BYTE 81,82,83,84
注意:
在单个数据定义中,其初始值可以使用不同的基数。
定义字符串
定义一个字符串,要用单引号或者双引号将其括起来。最常见的的字符串类型是用一个空字节(值为0)作为结束标记,称为以空字节结束的字符串
greeting BYTE "hello,world",0
每个字符占一个字节的存储空间
DUP操作符
DUP操作符使用一个整数表达式作为计数器,为多个数据项分配存储空间。在为字符串或数组分配存储空间时,这个操作符非常有用,它可以使用初始化或非初始化数据
BYTE 20 DUP(0) ; 20个字节,值都为0
BYTE 20 DUP(?) ; 20个字节,非初始化
定义WORD和SWORD数据
WORD(定义字)和SWORD(定义有符号字)伪指令为一个或多个16位整数分配存储空间
word1 WORD 65535 最大无符号数
word2 SWORD -32768 最小有符号数
word3 WORD ? 未初始化,无符号数
也可以使用传统的DW伪指令
16位字数组
通过列举元素或使用DUP操作符来创建字数组。
myList WORD 1,2,3,4,5
array WORD 5 DUP(?) : 5个数值,未初始化
定义DWORD和SDWORD数据
DQORD(定义双字)和SWORD(定义有符号双字)伪指令为一个或多个32位整数分配空间
vall DWORD 12345678h ; 无符号
val2 SDWORD -12324353
val3 DWORD 20 DUP(?) 无符号数组
32位双字数组
myList DWORD 1,2,3,4,5
定义压缩BCD数据(TBYTE)
MASM使用TBYTE伪指令来定义压缩BCD变量。常量初始值必须是十六进制的。
小端顺序
符号常量
通过为整数表达式或文本指定标识符来创建符号常量(也称为符号定义)
注意:符号不预留存储空间。只在汇编器扫描程序是使用,并且在运行时不会改变
等号伪指令
COUNT = 500
MOV EAX,COUNT 等价于 MOV EAX,500
这块的话和C语言中的 #define 联系一下
当前地址计数器:最重要的符号之一被称为当前地址计数器,表示为$
selfPtr DWORD $ 这条语句声明了一个变量selfPtr 并将其初始化为该变量的偏移量
键盘定义 程序通常定义符号来识别常用的数字键盘代码。比如,27是Esc建的ASCII码
Esc_key = 27
mov al,Esc_key
_
计算数字和字符串的大小
字节
list BYTE 10,20,30,40
ListSize = ($ - list)
注意:当要计算元素数量的数组中包含的不是字节时,就应该用数组总的大小(按字节计)除以单个元素的大小。
List WORD 1000h,2000h,3000h.4000h
ListSize = ($ - List) / 2
List DWORD 10000000h,20000000h,30000000h.40000000h
ListSize = ($ - List) / 4