x86汇编指令集大全(带注释),x86汇编指令集,汇编语言指令大全 X86和X87汇编指令大全(带注释)

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-65535

3. 目的地址传送指令.

LEA加载有效地址例子:LEA DX,string将偏移地址保存到DX LDS发送目标指针并将指针内容加载到DS中例子:LDS SI,string将段地址:偏移地址保存到DS:SI LES发送目标指针,并将指针内容加载到ES中例子:LES DI,string将段地址:偏移地址保存到ES:DI LFS发送目标指针并将指针内容加载到FS中例子:LFS迪,弦乐;将段地址:偏移地址保存到FS:DI LGS发送目标指针并将指针内容加载到GS中例子:LGS迪,弦乐;将段地址:偏移地址保存到GS:DI LSS发送目标指针并将指针内容加载到SS中例子:LSS迪,弦乐;将段地址:偏移地址保存到SS:DI

4. 标志传送指令.

LAHF标志寄存器将标志发送并加载到AH中 SAHF标志寄存器传输,加载AH内容到标志寄存器 PUSHF标记堆栈 POPF标志着出口 PUSHD 32位标志被堆栈 POPD 32位标志出栈

二、算术运算指令

补充 带进位加法的ADC INC加1 AAA加法的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,1 gt;一次,移位数由寄存器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小于transfer JBE/JNA少于或等于转移 以上四个,测试无符号整数运算的结果(标记C和Z) G/jnle大于transfer JGE/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 E3 FCLEX清除异常机器码9B DB E2 FDISI浮点检查中断禁用机器代码9DBE1 FENI浮点检查中断禁用机器代码9B DB E0 等待同步CPU和FPU机器代码9B FWAIT同步CPU和FPU机器代码D9 D0 FNOP没有操作机器代码DA E9 FXCH交换ST(0)和ST(1)机器代码D9 C9 Fxst (I)交换ST(0)和st (I)机器代码D9 C1iii FSTSW ax状态字至ax机器代码9B DF E0 Tsw字ptrmem状态字至mem机器代码9b ddmm111mm FLDCW字ptr mem mem到状态字机器代码d9mm 101mm Tcw字ptrmem控制字至mem机器代码9bd9mm111mm d环境字ptr memmem到全环境机器代码D9 mm100mmm fsenvword ptrmem全环境至mem机器代码9bd9mm110mmmm Fror word ptr memmem至FPU状态机器代码ddmm100mmmm f将字ptr mem FPU状态保存到mem机器代码9B DD mm110mmm 自由ST(i)标志ST (I)不使用机器代码DD C0iii FDECSTP减少堆栈指针1-gt;0 2-gt;1机器代码D9 F6 FINCSTP增加堆栈指针0-gt;1 1-gt;2机器代码D9 F7 FSETPM浮点设置保护机器代码DB E4

2、数据传送指令

FLDZ将0.0载入ST(0)机器代码D9 EE FLD1将1.0加载到ST(0)机器代码D9 E8中 FLDPI将π加载到ST(0)机器代码D9 EB中 fld L2将ln10/ln2载入ST(0)机器代码D9 E9 FLDL2E将1/ln2加载到ST(0)机器代码D9 EA中 FLLG 2将ln2/ln10载入ST(0)机器代码D9 EC FLDln2将ln2加载到ST(0)机器代码D9 ED中 flreal4ptrmem加载mem的单精度浮点机器码d9mm000mmmm FLREAL 8 PTR mem MEM中加载的双精度浮点机器码DD mm000mmm mm 由flreal10ptrmem加载到mem的十字节浮点机器码DB mm101mmm Filword ptrmem加载mem的双字节整数机器码DF mm000mmm Fildword ptrmem加载mem的四字节整数机器码DB mm000mmm Filqword ptrmem加载到mem的八字节整数机器码DF mm101mmm Ftbyte ptrmem加载到mem的10字节BCD机器码dfmm100mmmm中 FST real4 ptr mem将单精度浮点数存储到mem机器代码d9mm010mmmm中 fsreal8ptrmem将双精度浮点数存储到mem机器代码ddmm010mmmm中 第一个字ptr mem保存两字节整数到mem机器码dfmm010mmmm Fisdword ptrmem将四字节整数保存到mem机器码dbmm010mmmm fsreal4ptrmem将单精度浮点数存储到mem中,并弹出机器代码d9mm011mmmm Tpreal 8ptrmem将双精度浮点数保存到mem,并弹出机器码ddmm011mmmm Tpreal10ptrmem将10字节浮点数保存到mem,并弹出机器码dbmm111mm FISTP word ptr mem将两个字节的整数保存到mem,并弹出机器码dfmm011mmmm FISTP dword ptr mem将四字节整数保存到mem并弹出机器代码dbmm011mmmm FISTP qword ptr mem保存8字节整数到mem并弹出机器码dfmm111mm STP的Ftbyte ptrmem将十个字节的BCD计数保存到mem,并将机器代码dfmm110mmmm堆栈 FCMOVB ST(0),ST(I)lt;变速器机器代码DA C0iii FCMOVBE ST(0),ST(I)lt;#61;转移机器代码DA D0iii FCMOVE ST(0),ST(I)# 61;变速器机器代码DA C1iii FCMOVNB ST(0),ST(I)gt;#61;转移机器代码DB C0iii FCMOVNBE ST(0),ST(I)gt;转移机器代码DB D0iii FCMOVNE ST(0),ST(i)!#61;转移机器代码DB C1iii 当fcmovnu ST (0)和ST (I)正常时,发送机器代码DB D1iii 当fcovu ST (0),ST (I)出现故障时,发送机器代码DA D1iii

3、比较指令

Mfcost (0)-ST (1)机器代码D8 D1 Mi fcost (0),ST (I) ST (0)-ST (1)机器代码DB F0iii M FCoIP ST (0)、ST (I) ST (0)-ST (1)和堆垛机代码DF F0iii MC real 4 ptr mem ST(0)-真实内存机器码d8mm010mmmm MC real 8 ptr mem ST(0)—真实内存机器代码dcmm010mmmm FICOM word ptr mem ST(0)-整数mem机器码DE mm010mmm FICOM dword ptr mem ST(0)-整数mem机器码damm010mmmm ficmp word ptr mem ST(0)-整数mem和堆栈机器代码DE mm011mmm ficmp dword ptrmemst(0)—整数内存与堆栈机器代码damm011mmmm FTST街ST (0)-0机器代码D9 E4 Com ST (I) ST (0)-ST (I)机器代码DD E0iii Comp ST (I) ST (0)-ST (I)和pop机器代码DD E1iii Comppst (0)-ST (1)和双堆叠机器代码DA E9 Fxst (0)规格型号机器代码D9 E5

4、运算指令

FADD将目标操作数(紧跟在指令后面的变量或堆栈缓冲区)加到源操作数(紧跟在目标操作数后面的变量或堆栈缓冲区)# xff0c并将结果存储在目标操作数中 DpST (i),ST此指令是将ST buffer #xff0c加到目标操作数;并弹出ST缓冲区# xff0c并且目标操作数必须是堆栈寄存器# xff0c不管最后的目的操作数是什么# xff0c被弹出一次后# xff0c目标操作数将成为前一个堆栈缓冲区 Add fifiadd就是把ST加到源操作数#xff0c上;然后存储在ST缓冲区# xff0c源操作数必须是字整数或短整数形式的变量 子减少 FSUBP 减数分裂和减数分裂互换 FSUBRP FISUB FISUBR 乘法运算 FMULP 菲穆尔 FDIV分部 FDIVP FDIVR FDIVRP FIDIV FIDIVR FCHS改变了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和b MOV,B把B的值给了a Ret返回到主程序 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=EB 75=74 75=90 75=EB jnz-nop 75-90(相应的机器代码修改) jnz - jmp 75-EB(相应的机器代码修改) jnz - jz 75-74(正常)0F 85-0F 84(在特殊情况下,有时会修改相应的机器代码)

4.两种不同情况的不同修改方法

1.修改为jmp Je(jne,jz,jnz)=jmp对应的机器码EB(错误消息找到的第一个跳转)jmp用于绝对无条件跳转,从而跳过后面的错误消息xxxxx

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: