数据类型与数据传送指令

数据类型与数据传送指令

数据类型、数据传送指令、间接寻址

一、数据类型

数据类型的基本特征是以数据为的数目度量的大小,其他特征主要是为了方便程序员记忆变量中存储的数据类型,默认情况下大小写不敏感。

类型 描述
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

你可能感兴趣的:(反汇编)