数据类型与数据传送指令
数据类型、数据传送指令、间接寻址
数据类型的基本特征是以数据为的数目度量的大小,其他特征主要是为了方便程序员记忆变量中存储的数据类型,默认情况下大小写不敏感。
类型 | 描述 |
---|---|
BYTE | 8位无符号 |
SBYTE | 8位有符号 |
WORD | 16位无符号 |
SWORD | 16位有符号 |
DWORD | 32位无符号 |
SDWORD | 32位有符号 |
FWORD | 48位整数 |
QWORD | 64位整数 |
TBYTE | 80位整数 |
REAL4 | 32位短实数 |
REAL8 | 64位长实数 |
REAL10 | 80位扩展实数 |
遗留数据定义伪指令
类型 | 描述 |
---|---|
DB | 8位整数 |
DW | 16位整数 |
DD | 32位整数或实数 |
DQ | 64位整数或实数 |
DT | 定义10字节 |
数据定义语句:
[变量名] 数据定义伪指令 初始值[,初始值]...
有多个初始值的话,用逗号隔开;未初始化,用?代替初始值。
bigArr DWORD 500 DUP(?)
指令中的操作数的描述及其表述
1、操作数类型:
立即操作数(immediate)
寄存器操作数(register)
内存操作数(memory)
操作数 | 描述 |
---|---|
r8 | 8位通用寄存器: |
r16 | 16位通用寄存器: |
r32 | 32位通用寄存器: |
reg | 任意的通用寄存器 |
sreg | 16位段寄存器: |
imm | 8位、16位或32位立即数 |
imm8 | 8位立即数(字节) |
imm16 | 16位立即数(字) |
imm32 | 32位立即数(双字) |
r/m8 | 8位操作数(可以是8位通用寄存器或内存字节) |
r/m16 | 16位操作数(可以是16位通用寄存器或内存字节) |
r/m32 | 32位操作数(可以是32位通用寄存器或内存字节) |
mem | 8位、16位或32位操作数 |
2、基本命令
mov destination,source 从源操作数向目的操作数幅值数据
movzx(move with zero-extend)零扩展传送,将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或32位。只能用于无符号整数,目的操作数只能是寄存器。
movezx r32 r/m8
movezx r32 r/m16
movezx r16 r/m8
movsx(move with sign-extend)符号扩展传送,将源操作数的内容复制到目的操作数中,并将该符号零扩展至16位或32位。只能用于有符号整数,目的操作数只能是寄存器。
movesx r32 r/m8
movesx r32 r/m16
movesx r16 r/m8
LAHF:将ELFAGS寄存器的低字节复制到AH寄存器,无操作数
SAHF:将AH寄存器的值复制到ELFAGS寄存器的低字节,无操作数
XCHG:交换两个操作数的值,不接受立即数操作数
XCHG reg,reg
XCHG reg,mem
XCHG mem.reg
直接偏移操作数:在变量名称后加上一个偏移值,可以创建直接偏移操作数,来访问没有显式标号的内存地址。
arrayW WORD 100h,200h,300h
mov ax [arrayW+2];AX = 200H
3、加法和减法
INC/DEC:从操作数中加1或减1
INC reg/mem
DEC reg/mem
ADD:将尺寸相同的源操作数和目的操作数相加,结果保存在目的操作数中
ADD 目的操作数,源操作数
SUB:将尺寸相同的源操作数和目的操作数相加,结果保存在目的操作数中
SUB 目的操作数,源操作数
NEG:将数字转换成补码求相反数
NEG reg/mem
4、相关操作符和伪指令
OFFSET,返回变量相对于其所在段开始的偏移
PTR,允许重载变量的默认尺寸
TYPE,返回数组中每个元素的大小(字节)
LENGTH,返回数组内元素的数目
SIZEOF,返回数组初始化时占用的字节数
三、间接寻址
处理数组唯一可行的方法是用寄存器作为指针并操纵寄存器的值,这称为间接寻址。操作数使用间接寻址时,就称为间接操作数。
constant[reg]
[constant + reg]
arrayW WORD 100h,200h,300h
mov esi,0
mov al,[arrayW + esi]
mov al,arrayW[0]
比例因子
array DWORD 100h,200h,300h,400h
mov esi,3*BYTE array ;array[3]的偏移地址
mov eax,[esi] ;eax=400h
mov esi,3 ;下标
mov eax,array[esi*3] ;eax=400h