汇编常用伪指令
一、数据定义指令
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指令
1.段内直接调用:主程序和子程序在同一代码段中
CALL 过程名
2.段内间接调用
CALL 寄存器操作数
CALL 内存操作数
子程序的定义过程语句
1 |
|
过程名:子程序名,以字母开头,经汇编之后,过程名就是子程序的第一条指令
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 协议 ,转载请注明出处!