l
x86通用(或常用)指令:
n
数据传送:
u
mov:复制数据
u
movsx:符号填充,用源的符号位填充高位
u
movzx:零填充,用0填充高位
u
xchg:交换两个操作数的值,操作数类型需要相同
u
lea(load efficient address):取有效地址,把一个内存变量的有效地址送给指定的寄存器
u
push:操作数进栈
u
pusha:AX、CX、DX、BX、SP、BP、SI和DI等压栈
u
pushad:EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈
u
pop:弹出栈,结果存放在操作数中
u
popa:DI、SI、BP、SP、BX、DX、CX和AX等弹出栈
u
popad:EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈
n
标志位操作:
u
CF(进位):
l
CLC:CF清零
l
STC:CF置1
l
CMC:CF取反
u
DF(方向位):
l
CLD:DF清零
l
STD:DF置1
u
IF(中断允许位):
l
CLI:IF清零
l
STI:IF置1
u
取标志位:
l
LAHF:flags低8位存入ah
l
SAHF:ah的值存入flags低8位
u
标志位堆栈:
l
pushf/pushfd:32/64 flags进栈
l
popf/popfd:32/64 flags出栈
n
算术运算:
u
加法
l
add:加法
l
adc:带进位加法(源操作数的值和CF的值一起加到目的操作数)
l
inc:自增
l
xadd:交换后做加法
u
减法
l
sub:减法
l
sbb:带借位减法(将源操作数的值和CF的值一起从目的操作数中减去)
l
dec:自减
l
nec:求相反数
u
乘法
l
mul:无符号乘法
l
imul:有符号乘法
u
除法
l
div:无符号除法
l
idiv:有符号除法
u
类型转换
l
cbw:字节转字
l
cwd:字转双字
l
cwde:字转扩展双字
l
cdq:字转四字
n
逻辑运算:
u
and:并
u
or:或
u
not:非
u
xor:异或
n
移位操作:
u
算术移位
l
sal:低位向高位移,空出补零
l
sar:高位向低位移,空出补最高位的值
u
逻辑移位
l
shl:左移,补零
l
shr:右移,补零
u
双精度移位
l
shld:左移,第二个操作数高位补齐
l
shrd:右移,第二个操作数低位补齐
u
循环移位
l
rol:左移,移出的循环补上,同时进入CF
l
ror:右移,移出的循环补上,同时进入CF
u
带进位的循环移位
l
rcl:将CF加入移位的中间,移出的循环补上
l
rcr:将CF加入移位的中间,移出的循环补上
n
位操作:
u
位扫描
l
bsf:正向扫描,返回第一个1的位置
l
bsf:逆向扫描,返回第一个1的位置
u
位检测指令(对指定位的操作)
l
bt:传给CF
l
btc:传给CF,取反
l
btr:传给CF,清零
l
bts:传给CF,置1
u
检测位指令
l
test:和and指令过程一样,也设置相应标志位,就是不会保留结果
n
比较运算:
u
cmp:第二个操作数减去第一个操作数,设置相应标志位,不保留结果
u
cmpxchg:比较后根据结果(ZF是否为1)判定是否交换
n
循环指令:
u
loop:cx为计数器
u
loopw:cx为计数器
u
loopd:ecx为计数器
u
loopz/loope:ZF为1,且cx不为零
u
loopzw/loopew:ZF为1,且cx不为零
u
loopzd/looped:ZF为1,且ecx不为零
u
loopnz/loopne:ZF为0,且cx不为零
u
loopnzw/loopnew:ZF为0,且cx不为零
u
loopnzd/loopned:ZF为0,且ecx不为零
u
jcxz:cx为零时跳转
u
jecxz:ecx为零时跳转
n
转移:
u
jmp:无条件转移
u
条件转移:与ZF,CF,SF,PF相关,可以看到再查
n
条件设置:
u
setxx:xx是测试条件,与ZF,CF,SF,PF相关,可以看到再查
n
字符串操作:
u
取字符串
l
lods:按照地址表达式DS:SI决定读取一个字节,字,或者双字,一般放在ax,eax中
l
lodsb/lodsw:类似
l
lodsd:类似
u
置字符串:
l
stos:把ax后者eax中的值放入ES:DI所指向内存单元
l
stosb/stosw:类似
l
stosd:类似
u
传送字符串:
l
movs:把DS:SI所指向的字节,字或者双字送给ES:DI指向的内存单元
l
movsb/movsw:类似
l
movsd:类似
u
输入字符串:
l
ins:从指定端口(DX指定)接受一个字符串(CX决定字符个数),存入DS:SI指向的存储单元
l
insb/insw:类似
l
insd:类似
u
输出字符串:
l
outs:将DS:SI指向的存储单元中的一个字符串(CX决定字符个数)存入指定端口(DX指定)
l
outsb/outsw:类似
l
outsd:类似
u
比较字符串:
l
cmps:将两个DS:SI和ES:DI所指向的字节,字或者双字相减,设置相应标志位
l
cmpsb/cmpsw:类似
l
cmpsd:类似
u
扫描字符串:
l
scas:将ES:DI所指向的字节,字或者双字与al,ax或者eax相减,设置相应标志位
l
scasb/scaw:类似
l
scads:类似
u
重复字符串操作:
l
rep
lods等:如果cx为零,退出,否则继续执行rep后面的语句
u
条件重复字符串操作
l
repz/repe:如果cx非零且ZF=1,重复,否则退出
l
repnz/repne:如果cx非零且ZF=0,重复,否则退出
n
ASCII-BCD码运算调整:
u
加法调整:AAA
l
调整规则:若AL的低四位大于9,或标志位AF=1,则,AH=AH+1,AL=AL+6,并置AF和CF为1,否则,只置AF和CF为0;清除AL的高四位
u
减法调整:AAS
l
调整规则:若AL的低四位大于9,或标志位CF=1,则,AH=AH-1,AL=AL-6,并置AF和CF为1,否则,只置AF和CF为0;清除AL的高四位
u
乘法调整:AAM
l
调整规则:AH←AL/10(商),AL←AL(余数)
u
除法调整:AAD
l
ALßAH*10+AL,
AHß0
u
十进制调整
l
加:DAA,具体运用时查找
l
减:DAS,具体运用时查找
n
处理器指令:
u
NOP:控制指令,延迟下一条指令的执行
u
WAIT:让CPU出于等待状态,直到协处理器完成,用重启信号唤醒CPU为止
u
HLT:让CPU出于暂停工作状态
u
LOCK:前缀型指令,后面跟一个指令,起到独占总线的作用
l
MMX指令集:
n
数据转移指令:
u
movd:32bit数据的转移
u
movq:64位数据的转移
n
算术指令:
u
padd[b,w,d]:无符号数加
u
padds[b,w]:饱和模式的有符号数加
u
paddu[b,w]:饱和模式的无符号数加
u
psub[b,w,d]:无符号数减
u
psubs[b,w]:饱和模式的有符号数减
u
psubus[b,w,d]:饱和模式的无符号数减
u
pmulhw:WORD类型的有符号数相乘后取高16位
u
pmullw:WORD类型的有符号数相乘后取低16为
u
pmaddwd:WORD类型的向量点乘运算
n
移位指令:
u
psll[w,d,q]:逻辑左移
u
psrl[w,d,q]:逻辑右移
u
psra[w,d,q]:算术右移
n
逻辑指令:
u
pand:位与
u
pandn:目的操作数取反,与源操作数位与
u
por:位或
u
pxor:异或
n
比较指令
n
数据打包/拆包指令
n
MMX状态清楚指令
l
SSE指令集
l
SSE2指令集
l
SSE3指令集
l
SSE4指令集