x86汇编指令集大全(带注释),x86汇编指令集
• 经验
x86汇编指令集大全(带注释),x86汇编指令集,汇编语言指令大全 X86和X87汇编指令大全(带注释)汇编的指令集太多了,不用就忘了,所以把I处理器的官方指令集写在博客上,有需要的可以参考一下: 目录 1.数据传输指令1通用数据传输指令2输入/输出端口传输指令3目的地址传输指令4标志传输指令2算术运算指令3、逻辑运算指令4、字符串指令5、程序转移指令6、伪指令7、处理器控制指令# xff1a标记指令浮点运算指令集1、控制指令2、数据传输指令3、比较指令4、运算指令其他1机械代码,又称机器码2.所有你需要熟练掌握的汇编知识(只有这么多)3常见修改(机器代码)4两种不同情况下不同的修改方法一、数据传输指令它们在存储器和寄存器、寄存器和输入输出端口之间传输数据1. 通用数据传送指令.MOV传输字或字节MOVSX是传输前的符号扩展MOVZX在传输前零扩展将该单词推入堆栈从堆栈中弹出该单词普莎依次将AX,CX,DX,BX,SP,BP,Si,Di推入栈中一个POPA di,si,BP,sp,bx,dx,CX和ax依次出栈PUSHAD将EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI依次推入堆栈POPAD依次将EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX弹出堆栈BSWAP交换32位寄存器中字节的顺序XCHG交换字或字节(至少有一个操作数是寄存器,段寄存器不能作为操作数)CMPXCHG比较和交换操作数(第二个操作数必须是累加器AL/AX/EAX)先交换XADD,再累加(结果在第一个操作数中)XLAT字节查找转换-bx指向一个256字节表的起点,AL是表的索引值(0-255,即0-FFH);a1是查找表结果(【BX # 43;AL]-gt;铝)2. 输入输出端口传送指令.I/o端口输入(语法:在累加器中,{端口号│DX})OUT I/O端口输出(语法:OUT {端口号│DX},累加器)当输入输出端口由立即模式指定时,其范围为0-255;当寄存器DX指定时,其范围为0-655353. 目的地址传送指令.LEA加载有效地址例子:LEA DX,string将偏移地址保存到DXLDS发送目标指针并将指针内容加载到DS中例子:LDS SI,string将段地址:偏移地址保存到DS:SILES发送目标指针,并将指针内容加载到ES中例子:LES DI,string将段地址:偏移地址保存到ES:DILFS发送目标指针并将指针内容加载到FS中例子:LFS迪,弦乐;将段地址:偏移地址保存到FS:DILGS发送目标指针并将指针内容加载到GS中例子:LGS迪,弦乐;将段地址:偏移地址保存到GS:DILSS发送目标指针并将指针内容加载到SS中例子:LSS迪,弦乐;将段地址:偏移地址保存到SS:DI4. 标志传送指令.LAHF标志寄存器将标志发送并加载到AH中SAHF标志寄存器传输,加载AH内容到标志寄存器PUSHF标记堆栈POPF标志着出口PUSHD 32位标志被堆栈POPD 32位标志出栈二、算术运算指令补充带进位加法的ADCINC加1AAA加法的ASCII码调整DAA加法的小数调整减法SBB乐队借用减法十二月负一NEG求反(从0中减去)CMP比较(两个操作数相减,只修改标志位,不返回结果)AAS减法的ASCII码调整DAS减法的小数调整MUL无符号乘法结果送回AH和AL(字节操作),或者DX和AX(字操作),IMUL整数乘法结果送回AH和AL(字节操作),或者DX和AX(字操作)AAM乘法的ASCII码调整无符号除法结果回送:商回送AL,余数回送AH,(字节运算);Or商返回AX,余数返回DX,(字运算)IDIV整数除法结果回送:商回送AL,余数回送AH,(字节运算);Or商返回AX,余数返回DX,(字运算)AAD司ASCII码调整CBW字节被转换成单词(AL中字节的符号扩展为AH)CWD字被转换成双字(AX中单词的符号扩展为DX)CWDE字被转换成双字(AX中的符号一词引申为EAX)CDQ二字扩展(把这个词在EAX的象征延伸到EDX)三、逻辑运算指令和操作还是操作异或运算不是否定测试(两个操作数是和,只有标志位被修改,而r萨尔算术向左移动(#61;SHL)SHR逻辑向右移动算术移位到SAR的右边(#61;SHR)ROL循环向左移动ROR循环向右移动l通过进位循环向左移动通过进位循环,r向右移动以上八条移位指令的移位次数可以达到255次移位一次,可以直接用操作码,比如SHL AX,1gt;一次,移位数由寄存器CL给出例如,MOV,04 SHL AX,CL四、串指令源字符串寄存器:源字符串索引ES:DI目标字符串寄存器:目标字符串索引CX重复计数器AL/AX扫描值D 0表示SI和DI要在重复操作中自动增加;1表示自动减量Z标志用于控制扫描或比较操作的结束Mov字符串传输(MOVSB传输字符MOVSW传输字MOVSD传输双字)CMPS字符串比较(CMPSB比较字符CMPSW比较词)SCAS字符串扫描将AL或AX的内容与目标字符串进行比较,比较结果反映在标志位中LODS装好绳子将源字符串中的元素(字或字节)逐个加载到AL或AX中(LODSB转人物LODSW传递单词LODSD传输双字)STOS拯救琴弦这是LODS的逆过程当代表CX/ECXlt;gt;在0处重复REPE/REPZ当ZF # 61;1或比较结果相等,且CX/ECXlt;gt;在0处重复REPNE/REPNZ当ZF # 61;0或比较结果不相等,且CX/ECXlt;gt;在0处重复REPC当CF # 61和1cx/ecxlt;gt;在0处重复CF#61时的REPNC和0cx/ecxlt;gt;在0处重复五、程序转移指令1.无条件转移指令(长转移)JMP无条件转移指令调用过程调用RET/RETF程序返回2.条件分支指令(短分支,-128到# 43;27)(当且仅当(SF XOR OF)# 61;1,OP1ltOP2)JA/JNBE不小于等于时转移JAE/JNB大于或等于转移JB/JNAE小于transferJBE/JNA少于或等于转移以上四个,测试无符号整数运算的结果(标记C和Z)G/jnle大于transferJGE/JNL大于或等于转移JL/JNGE不到转让JLE/JNG少于或等于转移以上四个,测试有符号整数运算的结果(标记S,O,Z)JE/JZ等于转移当JNE/JNZ不相等时转移有进位时JC转移没有进位时转移JNO不溢出时转移当JNP/JPO的平价是奇数时转移jn符号位是# 34;0#34;时间转移JO溢出转移当日元/JPE平价为偶数时转移JS标志位是# 34;1#34;时间转移3.循环控制指令(短传输)当CX不为零时循环LOOPE/LOOPZ CX不为零,标志Z # 611小时周期Loopne/loopncx不为零,标志Z # 61在0处循环jczcx为零时转移当JECXZ·ECX为零时转移4.中断程序INT中断指令进入溢出中断IRET中断返回5.处理器控制指令HLT处理器暂停,直到出现中断或复位信号等待当芯片引线测试为高电平时,CPU进入等待状态ESC至外部处理器锁上巴士NOP空操作STC设置进位标志CLC清零进位标志位CMC进位标志倒置设置标准方向标志CLD清除方向旗设置STI中断使能位CLI中断使能位被清除六、伪指令DW定义字(2字节)PROC定义了过程ENDP进程结束段定义了一个段假设建立段寄存器寻址端点线段端点结束程序结束七、处理机控制指令#xff1a;标志处理指令CLC进位位置0指令CMC进位位否定指令STC进位位置为1的指令CLD方向标志设置说明标准方向标记位置1说明CLI中断标志设置指令STI中断标志设置指令NOP无操作HLT关闭等等等等ESC代码更改锁浮点运算指令集1、控制指令(当带9B的控制指令前缀F改为FN时,不检查浮点,用9B去除机器码)FINIT初始化浮点单元机器码9B DB E3FCLEX清除异常机器码9B DB E2FDISI浮点检查中断禁用机器代码9DBE1FENI浮点检查中断禁用机器代码9B DB E0等待同步CPU和FPU机器代码9BFWAIT同步CPU和FPU机器代码D9 D0FNOP没有操作机器代码DA E9FXCH交换ST(0)和ST(1)机器代码D9 C9Fxst (I)交换ST(0)和st (I)机器代码D9 C1iiiFSTSW ax状态字至ax机器代码9B DF E0Tsw字ptrmem状态字至mem机器代码9b ddmm111mmFLDCW字ptr mem mem到状态字机器代码d9mm 101mmTcw字ptrmem控制字至mem机器代码9bd9mm111mmd环境字ptr memmem到全环境机器代码D9 mm100mmmfsenvword ptrmem全环境至mem机器代码9bd9mm110mmmmFror word ptr memmem至FPU状态机器代码ddmm100mmmmf将字ptr mem FPU状态保存到mem机器代码9B DD mm110mmm自由ST(i)标志ST (I)不使用机器代码DD C0iiiFDECSTP减少堆栈指针1-gt;0 2-gt;1机器代码D9 F6FINCSTP增加堆栈指针0-gt;1 1-gt;2机器代码D9 F7FSETPM浮点设置保护机器代码DB E42、数据传送指令FLDZ将0.0载入ST(0)机器代码D9 EEFLD1将1.0加载到ST(0)机器代码D9 E8中FLDPI将π加载到ST(0)机器代码D9 EB中fld L2将ln10/ln2载入ST(0)机器代码D9 E9FLDL2E将1/ln2加载到ST(0)机器代码D9 EA中FLLG 2将ln2/ln10载入ST(0)机器代码D9 ECFLDln2将ln2加载到ST(0)机器代码D9 ED中flreal4ptrmem加载mem的单精度浮点机器码d9mm000mmmmFLREAL 8 PTR mem MEM中加载的双精度浮点机器码DD mm000mmm mm由flreal10ptrmem加载到mem的十字节浮点机器码DB mm101mmmFilword ptrmem加载mem的双字节整数机器码DF mm000mmmFildword ptrmem加载mem的四字节整数机器码DB mm000mmmFilqword ptrmem加载到mem的八字节整数机器码DF mm101mmmFtbyte ptrmem加载到mem的10字节BCD机器码dfmm100mmmm中FST real4 ptr mem将单精度浮点数存储到mem机器代码d9mm010mmmm中fsreal8ptrmem将双精度浮点数存储到mem机器代码ddmm010mmmm中第一个字ptr mem保存两字节整数到mem机器码dfmm010mmmmFisdword ptrmem将四字节整数保存到mem机器码dbmm010mmmmfsreal4ptrmem将单精度浮点数存储到mem中,并弹出机器代码d9mm011mmmmTpreal 8ptrmem将双精度浮点数保存到mem,并弹出机器码ddmm011mmmmTpreal10ptrmem将10字节浮点数保存到mem,并弹出机器码dbmm111mmFISTP word ptr mem将两个字节的整数保存到mem,并弹出机器码dfmm011mmmmFISTP dword ptr mem将四字节整数保存到mem并弹出机器代码dbmm011mmmmFISTP qword ptr mem保存8字节整数到mem并弹出机器码dfmm111mmSTP的Ftbyte ptrmem将十个字节的BCD计数保存到mem,并将机器代码dfmm110mmmm堆栈FCMOVB ST(0),ST(I)lt;变速器机器代码DA C0iiiFCMOVBE ST(0),ST(I)lt;#61;转移机器代码DA D0iiiFCMOVE ST(0),ST(I)# 61;变速器机器代码DA C1iiiFCMOVNB ST(0),ST(I)gt;#61;转移机器代码DB C0iiiFCMOVNBE ST(0),ST(I)gt;转移机器代码DB D0iiiFCMOVNE ST(0),ST(i)!#61;转移机器代码DB C1iii当fcmovnu ST (0)和ST (I)正常时,发送机器代码DB D1iii当fcovu ST (0),ST (I)出现故障时,发送机器代码DA D1iii3、比较指令Mfcost (0)-ST (1)机器代码D8 D1Mi fcost (0),ST (I) ST (0)-ST (1)机器代码DB F0iiiM FCoIP ST (0)、ST (I) ST (0)-ST (1)和堆垛机代码DF F0iiiMC real 4 ptr mem ST(0)-真实内存机器码d8mm010mmmmMC real 8 ptr mem ST(0)—真实内存机器代码dcmm010mmmmFICOM word ptr mem ST(0)-整数mem机器码DE mm010mmmFICOM dword ptr mem ST(0)-整数mem机器码damm010mmmmficmp word ptr mem ST(0)-整数mem和堆栈机器代码DE mm011mmmficmp dword ptrmemst(0)—整数内存与堆栈机器代码damm011mmmmFTST街ST (0)-0机器代码D9 E4Com ST (I) ST (0)-ST (I)机器代码DD E0iiiComp ST (I) ST (0)-ST (I)和pop机器代码DD E1iiiComppst (0)-ST (1)和双堆叠机器代码DA E9Fxst (0)规格型号机器代码D9 E54、运算指令FADD将目标操作数(紧跟在指令后面的变量或堆栈缓冲区)加到源操作数(紧跟在目标操作数后面的变量或堆栈缓冲区)# xff0c并将结果存储在目标操作数中DpST (i),ST此指令是将ST buffer #xff0c加到目标操作数;并弹出ST缓冲区# xff0c并且目标操作数必须是堆栈寄存器# xff0c不管最后的目的操作数是什么# xff0c被弹出一次后# xff0c目标操作数将成为前一个堆栈缓冲区Add fifiadd就是把ST加到源操作数#xff0c上;然后存储在ST缓冲区# xff0c源操作数必须是字整数或短整数形式的变量子减少FSUBP减数分裂和减数分裂互换FSUBRPFISUBFISUBR乘法运算FMULP菲穆尔FDIV分部FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS改变了ST的正负值FABS拿出ST #xff0c的价值;取它的绝对值然后存回来FSQRT从#xff0c中取出ST的值;开根号然后存回去FSCALE指令是计算ST * 2 ST (1)的值# xff0c结果存储在ST中,ST(1)的值不变ST(1)必须是-32768和32768 (-215和215)之间的整数# xff0c如果计算结果超出了这个范围,则不能确定# xff0c如果不是整数ST(1),则取整为零后再计算所以为了保险起见# xff0c最好将块整数装入ST(1)FRNDINT这条指令是将ST的值四舍五入到整数# xff0cFPU提供了四种舍入方法# xff0c它由FPU控制字中的两个RC位决定RC舍入控制00四舍五入01舍入到负无穷大10轮到正无穷大十一比零其它1.机械码,又称机器码.Ultraedit打开,您将在编辑exe文件时看到许多数字由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,f组成这些数字这是机器代码修改程序时,必须通过修改机器码来修改exe文件2.需要熟练掌握的全部汇编知识(只有这么多)不太好理解,但是可以先背下来,做一个熟悉的面孔,然后慢慢理解比较a和bMOV,B把B的值给了aRet返回到主程序Nop没有功能,英文“no operation”的缩写,意思是“什么都不做”(机器码90)***机器码的意思见上面(说明:当ultraedit打开edit exe文件时,你看到的是90,相当于汇编语句nop)调用子程序或者如果jejz相等,则跳转(机器代码74或0F84)如果jne或jnz不相等,则跳转(机器代码75或0F85)Jmp无条件跳转(机器代码EB)如果jb小于,则跳转如果ja大于,则跳转如果j大于,就跳如果ge大于或等于,则跳转如果jl小于,则跳转如果jle小于或等于,则跳转从堆栈中弹出推送堆栈3.常见修改(机器码)74=75 74=90 74=EB75=74 75=90 75=EBjnz-nop75-90(相应的机器代码修改)jnz - jmp75-EB(相应的机器代码修改)jnz - jz75-74(正常)0F 85-0F 84(在特殊情况下,有时会修改相应的机器代码)4.两种不同情况的不同修改方法1.修改为jmpJe(jne,jz,jnz)=jmp对应的机器码EB(错误消息找到的第一个跳转)jmp用于绝对无条件跳转,从而跳过后面的错误消息xxxxx