汇编常用伪指令

一、数据定义指令

1.DB 字节定义指令

将数据存放到计算机内存单元,负数按照补码方式存放,单引号中字符翻译成ASCII码
Define Byte 定义字节 单字节

2.DW字定义

定义双字节数,占两个字节16bit
Define Word字定义 双字节

3.DD 双字定义

四字节数,负数按补码存放,单引号字符翻译成ASCII码
每一个数占四个字节,低位字节—->低位地址,高位字节——>高址地址

二、符号定义

1. EQU 等值伪指令

例子:
NUM EQU 33
将NUM赋值为33,其后不可更改NUM值

2. = 等号伪指令

例子
NUM=33
将NUM定义为33,以后可以修改NUM值

三、通用传送类型

1.数据传送指令

mov dst,src
功能:把源操作数赋值给目的操作数,源操作数不变
备注:不能向段寄存器中写入立即数
CS不能做目标寄存器
不能用一条指令实现一下传送:
1.存储单元之间的传送
2.立即数至段寄存器的传送(中间需要一个通用寄存器中转)
3.段寄存器之间的传送

立即数:立即数通常是指在立即寻址方式指令中给出的数。可以是8位、16位或32位,该数值紧跟在操作码之后。

2.符号扩展/零扩展传送指令

movsx 目标寄存器,源操作数
movzx 目标寄存器,源操作数
功能:把源操作数赋值给目的操作数,源操作数不变
备注:1.源操作数不变
2.源操作数字长要小于或等于目标寄存器字长
3.movsx源操作数符号位向高位扩展,再送给目标
4.movzx源操作数高位补零,再送给目标

3.有效地址传送指令

LEA 目标寄存器,源寄存器
功能:计算内存单元的有效地址(不是其中的操作数)—>目标
备注:有效地址就是偏移地址,LEA指令等效于OFFSET运算符

OFFSET 运算符返回数据标号的偏移量。这个偏移量按字节计算,表示的是该数据标号距离数据段起始地址的
距离。

4.交换传送指令

XCHG 第一操作数,第二个操作数
功能:完成两个操作数互换
备注:
1.段寄存器,立即数不能参加互换
2.2个内存操作数不能互换;源、目的类型一致

立即数:立即数通常是指在立即寻址方式指令中给出的数。可以是8位、16位或32位,该数值紧跟在操作码之后。

四、堆栈操作类指令

堆栈———计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取
栈顶:栈区的低地址
栈底:栈区的高地址
• 堆栈寄存器SS:存放堆栈段段基址
• 堆栈指针(SP):存放栈顶单元的偏移地址

堆栈指针SP的初值决定了堆栈的大小,SP始终指向栈顶的顶部,及始终指向最后压入堆栈的信息所在的单元

数据进出栈

入栈PUSH

PUSH src;
一个字进栈,系统完成两步操作:SP<——-SP-2,(SP)<—-操作数
一个双字进栈,系统完成两步操作:ESP<——ESP-4,(ESP)<—-操作数

出栈POP

POP dst;
弹出一个字,系统自动完成两步操作:操作数<——(SP),SP<—-SP+2

注意:堆栈操作指令中的操作数类型必须是字操作数,即16位操作数

五、算数运算指令

二进制算法

1.ADD:不带位加法指令

ADD 目标操作数(dst),源操作数(src)    dst<——dst+src ;代表注释
功能:将目标操作数与源操作数相加,并将结果送给目的操作数

2.ADC:带位加法指令

ADC 目标操作数(dst),源操作数(src)    dst <—- dst+src+CF
功能:将目的操作数与源操作数相加,再加上进位标志CF的内容,然后将结果送给目的操作数

3.INC:加一指令

INC 目的操作数(dst)     dst <—— dst+1
功能:将目的操作数加一,并将结果送回目的操作数。

二进制减法

1.SUB:不带借位减法指令

SUB 目的操作数(dst),源操作数(src)   dst <—— dsr-src
功能:将目的操作数减源操作数,结果送入目的操作数。

2.SBB:带错位减法指令

SBB 目标操作数(dst),源操作数(src)  dst <—- dst-src-CF
功能:将目的操作数减源操作数,然后再减进位标志CF,并将结果送回目的操作数。

3.DEC:减一指令

DEC 目的操作数(dst)    dst <—- dst-1
功能:将目的操作数减一,结果送回目的操作数。

求补指令

NEG:求补指令
NEG 目的操作数(dst)    dst <—- 0-dst
功能:用0减去目的操作数,送回原来目的操作数。(按位取反加一)

比较指令

CMP:比较指令
CMP 目的操作数(dst),源操作数(src)  dst-src
功能:将目的操作数减源操作数,但结果不送回目的操作数。

乘法指令

1.MUL:无符号乘法指令

MUL src    (AX) <—-(src)*(AL)
功能:将源操作数与默认目的操作数(AX或AL)相乘,结果保存在AX或DX中。

2.IMUL:带符号乘法指令

IMUL src
功能:将源操作数与默认操作数(AL或AX)相乘,结果保存在AX或者DX中。
备注:运算结果只影响状态标志CF,OF。

除法指令

1.DIV:无符号数除法指令

DIV src     (AL)<—- (AX)*(src) 商  (AH) <— 余数
功能:将两个无符号数做除法运算,商和余数分别保存在AL与AH中。

2.IDIV:带符号数除法指令

IDIV src
功能:将两个带符号数做除法运算,商和余数分别放在指定位置。
备注:当被除数除位不够时,需要进行扩展。

字节扩展指令

CBW
功能:把AL中带符号数扩展为16位字长(符号位扩展到AH中)。
CWD
功能:将AX中的符号位扩展到DX中。

六、转移类指令

无条件转移

1.根据位移

jmp +偏移量:并没有给出目的地址的地址,而是给出了目的地址相对此时IP的偏移量

2.地址在指令

jmp far ptr:段间转移
包含目的地的地址,高位地址为段地址,低位地址为偏移地址

3.地址在寄存器(BX,SI,DI,SP)

jmp reg:即将IP修改为reg的内容

4.地址在内存

jmp word ptr 内存单元地址(段内地址)
功能:从内存单元地址开始存放一个字,是转移的目的偏移地址。
jmp dword ptr 内存单元地址(段间地址)
功能:从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

条件转移指令

JCXZ DEST:条件为cx寄存
器中的值是否为0,如果为0就对IP进行修改,+偏移量
DEST为destination目的地
条件转移指令

循环指令

loop:cx—,判断cx是否为0,如果不为0,就对IP进行修改,如果为0,则执行下一条指令

七、调用类指令

子程序调用与返回指令
CALL 调用地址
RET 返回点
子程序:能完成一定功能的相对独立的程序段
调用:调用子程序,即无条件转到子程序的第一条指令
返回:返回断点,即返回到CALL的后继指令
CALL调用

段内调用CALL指令

1.段内直接调用:主程序和子程序在同一代码段中

CALL 过程名

2.段内间接调用

CALL 寄存器操作数
CALL 内存操作数

子程序的定义过程语句

1
2
3
4
过程名   PROC  属性
子程序实体
RET
过程名 ENDP

过程名:子程序名,以字母开头,经汇编之后,过程名就是子程序的第一条指令
PROC/ENDP:是子程序的定界语句
属性: NEAR(或缺省)代表近过程,即该子程序和调用它的那条指令在同一个代码段。
FAR代表远过程,即该子程序和调用它的那条指令不在同一个代码段。
RET:RET子程序返回指令
段调用

八、逻辑运算类指令

1.NOT:取反

NOT 目的操作数(dst)
功能:实现操作数的按位取反运算,把取反的结果送给目标操作数
说明:NOT用于使所有位取反

2.AND:与指令

AND 目的操作数(dst),源操作数(src)
功能:实现两个操作数的按位与运算,将两个操作数与之后的结果送给目标操作数
说明:AND通常用于使某些位置0,其他位不变的情况

3.OR或运算

OR 目的操作数(dst),源操作数(src)
功能:实现操作数的按位或运算,把或的结果送给目标操作数
说明:OR通常用于将某些位置1

4.XOR异或运算

XOR 目的操作数(dst),源操作数(src)
功能:实现操作数的按位异或运算,把异或的结果送给目标操作数
说明:XOR通常用于将某些位取反,某些位保持不变

5.TEST:测试

TEST 目的操作数(dst),源操作数(src)
功能:实现两个操作数的按位与运算,结果不保存,只影响标志位

九、位移指令

开环移位指令

算数左移

SAL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位

算数移

SAR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用原来操作数的最高位来补充最高位

逻辑左移

SHL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用0来补充最低位

逻辑右移

SHR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用0来补充最高位

闭环移位指令

含进位的循环左移

RCL 操作数,移位次数
说明:操作数向左移位,最高位被挤入进位位中,用原来的进位位来补充最低位

含进位的循环右移

RCR 操作数,移位次数
说明:操作数向右移位,最低位被挤入进位位中,用原来进位位来补充最高位

不含进位的循环左移

ROL 操作数,移位次数
说明:操作数向左移位,最高位被挤入操作数的最低位,同时最高位进入进位位,用操作数的次高位补充最高位

不含进位的循环右移

ROR 操作数,移位次数
说明:操作数向右移位,最低位被挤入操作数的最高位,同时最低位进入进位位,用操作数的次低位补充最低位。


本文作者: Alone
本文链接: https://blog.nosecurity.cn/posts/11120.html
版权声明: 本博客所有文章除特别声明外,均为原创,采用 CC BY-SA 4.0 协议 ,转载请注明出处!