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指令集