游戏修改常见常用汇编指令
常用汇编指令
常用汇编指令汇编语言是一种低级机器语言的抽象表示,通过使用汇编指令可以编写出与硬件相关的程序。
在计算机科学领域中,汇编指令是非常重要的,是理解计算机底层原理和实现的关键。
本文将介绍一些常用的汇编指令,以帮助读者更好地理解和应用这些指令。
一、数据传输指令1. MOV指令:MOV指令用于将数据从一个位置复制到另一个位置。
例如,MOV AX, BX将寄存器BX的内容复制到AX中。
2. LEA指令:LEA指令用于将内存地址加载到寄存器中。
例如,LEA BX, [SI+10]将[S1+10]的内存地址加载到寄存器BX中。
3. PUSH指令:PUSH指令用于将数据压入栈中。
例如,PUSH AX将AX中的数据压入栈中。
4. POP指令:POP指令用于从栈中弹出数据。
例如,POP BX将栈中的数据弹出到BX中。
二、算术运算指令1. ADD指令:ADD指令用于将两个操作数相加,并将结果存储在目标操作数中。
例如,ADD AX, BX将BX的值加到AX中。
2. SUB指令:SUB指令用于将源操作数的值从目标操作数中减去,并将结果存储在目标操作数中。
例如,SUB AX, BX从AX中减去BX的值。
3. MUL指令:MUL指令用于将源操作数与累加器中的值相乘,并将结果存储在累加器中。
例如,MUL BX将累加器的值与BX相乘。
4. DIV指令:DIV指令用于将累加器的值除以源操作数,并将商存储在累加器中,余数存储在另一个寄存器中。
例如,DIV BX将累加器的值除以BX。
三、逻辑运算指令1. AND指令:AND指令用于对两个操作数进行逻辑与运算,并将结果存储在目标操作数中。
例如,AND AX, BX将AX与BX进行逻辑与操作。
2. OR指令:OR指令用于对两个操作数进行逻辑或运算,并将结果存储在目标操作数中。
例如,OR AX, BX将AX与BX进行逻辑或操作。
3. NOT指令:NOT指令用于对操作数进行逻辑非运算,并将结果存储在目标操作数中。
汇编指令大全
byte cycle一、数据传送类指令MOV A, Rn 寄存器送累加器 1 1MOV Rn,A 累加器送寄存器 1 1MOV A ,@Ri 内部RAM单元送累加器 1 1MOV @Ri ,A 累加器送内部RAM单元 1 1MOV A ,#data 立即数送累加器 2 1MOV A ,direct 直接寻址单元送累加器 2 1MOV direct ,A 累加器送直接寻址单元 2 1MOV Rn,#data 立即数送寄存器 2 1MOV direct ,#data 立即数送直接寻址单元 3 2MOV @Ri ,#data 立即数送内部RAM单元 2 1MOV direct ,Rn 寄存器送直接寻址单元 2 2MOV Rn ,direct 直接寻址单元送寄存器 2 2MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1XCH A ,@Ri 累加器与内部RAM单元交换 1 1XCHD A ,direct 累加器与直接寻址单元交换 2 1XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1POP direct 栈顶弹出指令直接寻址单元 2 2PUSH direct 直接寻址单元压入栈顶 2 2二、算术运算类指令ADD A, Rn 累加器加寄存器 1 1ADD A,@Ri 累加器加内部RAM单元 1 1ADD A, direct 累加器加直接寻址单元 2 1ADD A, #data 累加器加立即数 2 1ADDC A, Rn 累加器加寄存器和进位标志 1 1ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1ADDC A, direct 累加器加直接寻址单元和进位标志 2 1 INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接寻址单元加1 2 1INC @Ri 内部RAM单元加1 1 1INC DPTR 数据指针加1 1 2DA A 十进制调整 1 1SUBB A, Rn 累加器减寄存器和进位标志 1 1SUBB A,@Ri 累加器减内部RAM单元和进位标志 1 1SUBB A, #data 累加器减立即数和进位标志 2 1SUBB A, direct 累加器减直接寻址单元和进位标志 2 1DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC @Ri 内部RAM单元减1 1 1DEC direct 直接寻址单元减1 2 1MUL AB 累加器乘寄存器B 1 4DIV AB 累加器除以寄存器B 1 4三、逻辑运算类指令ANL A, Rn 累加器与寄存器 1 1ANL A,@Ri 累加器与内部RAM单元 1 1ANL A, direct 累加器与直接寻址单元 2 1ANL direct, A 直接寻址单元与累加器 2 1ANL direct, #data 直接寻址单元与立即数 3 1ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。
汇编的基本常用指令
汇编的基本常用指令汇编语言是一种底层的程序设计语言,主要用于编写机器码指令。
以下是一些常用的汇编指令:1. MOV:将数据从一个位置复制到另一个位置。
2. ADD:将两个操作数相加,并将结果存储在目的操作数中。
3. SUB:将第二个操作数从第一个操作数中减去,并将结果存储在目的操作数中。
4. INC:将一个操作数的值增加1。
5. DEC:将一个操作数的值减少1。
6. CMP:比较两个操作数的值,并将结果影响到标志寄存器中。
7. JMP:无条件跳转到指定的代码位置。
8. JZ / JE:当指定的条件成立时,跳转到指定的代码位置(零标志或相等标志)。
9. JNZ / JNE:当指定的条件不成立时,跳转到指定的代码位置(非零标志或不相等标志)。
10. JL / JB:当源操作数小于目的操作数时,跳转到指定的代码位置(小于标志或借位标志)。
11. JG / JA:当源操作数大于目的操作数时,跳转到指定的代码位置(大于标志或进位标志)。
12. CALL:调用一个子程序或函数。
13. RET:返回子程序或函数的调用处。
14. NOP:空操作,用于占位或调整程序代码的位置。
15. HLT:停止运行程序,将CPU置于停机状态。
这里只列举了一些基本的汇编指令,实际上汇编语言有更多更复杂的指令,具体使用哪些指令取决于所使用的汇编语言和目标处理器的指令集架构。
继续列举一些常用的汇编指令:16. AND:将两个操作数进行按位与运算,并将结果存储在目的操作数中。
17. OR:将两个操作数进行按位或运算,并将结果存储在目的操作数中。
18. XOR:将两个操作数进行按位异或运算,并将结果存储在目的操作数中。
19. NOT:对一个操作数的每一位进行取反操作。
20. SHL / SAL:将一个操作数的每一位向左移动指定的位数。
对于无符号数,使用SHL指令;对于带符号数,使用SAL指令。
21. SHR:将一个操作数的每一位向右移动指定的位数,高位空出的位使用0填充。
30个常用汇编命令
11、BSWAP(字节交换)
写法:bswap reg32 作用:将 reg32 的第 0 与第 3 个字节,第 1 与第 2 个字节进行交换。 示例:设 EAX=12345678h 执行 bswap eax;后,eax=78563412H
12、XLAT(换码)
写法:XLAT; 作用:AL=DS:[bx+AL] 将 DS:BX 所指内存中的由 AL 指定位移处的一个字节赋值给 AL。原来它的主要用途是查表。注意可以给它提供操作
13、ADD(加法)
写法:ADD reg/mem reg/mem/imm 作用:将后面的操作数加到前面的操作数中 注意:两个操作数必须类型匹配,并且不能同时是内存操作数 ADC (带进位加法) 写法:ADC reg/mem, reg/mem/imm ; 作用:dest=dest+src+cf 当 CF=0 时 ADD 与 ADC 的作用是相同的。 示例:实现 64 位数 EDX:EAX 与 ECX:EBX 的加法: Add EAX,EBX; ADC EDX,ECX;
写法:NEG reg/mem 作用:求补就是求相反数,即:dest=0-dest;
20、CMPXCHG(比较交换)
写法:CMPXCHG reg/mem, reg;
作用:AL/AX/EAX-oprd1,如果等于 0,则 oprd1=oprd2,否则,AL/AX/EAX=oprd1; 即:比较 AL/AX/EAX 与第一个操作数,如果相等,则置 ZF=1,并复制第二个操作数给第一个操作数;否则,置 ZF=0, 并复制第一个操作数给 AL/AX/EAX。 说明:CMPXCHG 主要为实现原子操作提供支持 CMPXCHG8B(8 字节比较交换指令) 写法:CMPXCHG8B MEM64; 功能:将 EDX:EAX 中的 64 位数与内存的 64 位数进行比较,如果相等,则置 ZF=1,并存储 ECX:EBX 到 mem64 指定 的内存地址;否则,置 ZF=0,并设置 EDX:EAX 为 mem64 的 8 字节内容
汇编常用指令
汇编常用指令汇编语言是计算机底层的一种编程语言,通过编写汇编指令可以直接控制机器的硬件和内存。
在使用汇编语言编写程序时,掌握一些常用指令是非常重要的。
本文将介绍一些常用的汇编指令,帮助读者更好地理解和应用汇编语言。
一、数据传输指令数据传输指令用于在寄存器和内存之间传输数据,包括将数据从内存加载到寄存器中,以及将寄存器中的数据存储到内存中。
常用的数据传输指令包括:1. MOV:将一个操作数的值传送给另一个操作数。
例如,"MOV AX, BX"表示将BX中的值传送给AX寄存器。
2. XCHG:交换两个操作数的值。
例如,"XCHG AX, BX"表示交换AX和BX的值。
3. PUSH:将数据压入栈中。
例如,"PUSH AX"表示将AX的值压入栈中。
4. POP:从栈中弹出数据。
例如,"POP AX"表示将栈顶的值弹出并存储到AX中。
二、算术和逻辑指令算术和逻辑指令用于执行各种算术运算和逻辑操作,包括加法、减法、乘法、除法以及与、或、非等逻辑运算。
常用的算术和逻辑指令包括:1. ADD:将两个操作数相加。
例如,"ADD AX, BX"表示将BX的值加到AX中。
2. SUB:将第一个操作数减去第二个操作数。
例如,"SUB AX, BX"表示用BX的值减去AX,并将结果存储到AX中。
3. MUL:将两个操作数相乘。
例如,"MUL AX, BX"表示将AX乘以BX,并将结果存储到一组寄存器中。
4. DIV:将第一个操作数除以第二个操作数。
例如,"DIV AX, BX"表示用AX的值除以BX,并将商存储到一组寄存器中。
5. AND:对两个操作数执行逻辑与运算。
例如,"AND AX, BX"表示将AX和BX进行逻辑与操作。
6. OR:对两个操作数执行逻辑或运算。
游戏修改常见常用汇编指令
游戏修改常见常用汇编指令汇编指令有很多,X86指令、X87浮点指令、SSE指令等等,所以这里无法一一列举讲解,只说一下修改游戏时经常会遇到和使用到的指令的用法,如果碰到这里没有列举的指令,可以自己在网上查一下资料,只要了解了汇编指令的工作原理,其他指令应该也是很容易理解的。
注意网上的汇编指令资料基本上都是老的16位汇编,就是需要用段寄存器辅助寻址的,而这里所讲的全部都是现在所用的32位汇编指令,寄存器直接支持32位地址,所以在指令的细节上会有一些小小的区别,但是指令的作用都是一样的。
另外这里列举的汇编指令都是PC上用的汇编指令,如果是模拟器游戏,用CE是无法对模拟器游戏进行正确的反汇编的(反汇编的结果并不是真正意思上的主机指令),只能使用模拟器自带的反汇编功能,用过模拟器反汇编的就可以看到,游戏主机上的汇编指令和PC上的是不一样的,因为处理器和存贮单元的结构不同,访问和操作数据的规则自然也不相同。
常用汇编指令注意:在汇编指令中所有的地址值和数值都是16进制,用符号"[...]"之间的数值来表示内存地址。
内存地址处操作数据的长度用BYTE PTR [地址]、WORD PTR [地址]、DWORD PTR [地址]来区别,分别对应表示此地址处的1字节、2字节、4字节数据。
====================================== ========================================= ==X86指令X86指令通指80X86的一系列指令,指令兼容8/16/32位数据的操作。
----------------------------------------------------------------------------传送指令MOV 数据传送指令格式:MOV 目标,源说明:将源传送到目标,其中目标可以是地址,也可以是寄存器。
而源可以是地址,可以是寄存器,也可以是数值。
汇编指令大全(有注释)_IT计算机_专业资料
汇编指令大全(有注释)_IT计算机_专业资料汇编指令大全(有注释)为了方便开发者理解和使用汇编语言,本文汇编指令大全提供了对常用指令的详细注释。
汇编语言是一种低级编程语言,直接操作计算机的硬件和寄存器。
掌握汇编语言对于理解计算机底层原理和优化程序性能至关重要。
下面列举了一些常用的汇编指令,以供参考。
1. MOV指令:用于将一个数据从一个位置复制到另一个位置。
可以在寄存器和内存之间传输数据。
示例:MOV AX, 10h ; 将数据10h复制到寄存器AX中MOV [BX], AX ; 将寄存器AX中的数据复制到内存地址BX指向的位置2. ADD指令:用于将两个数据相加,并将结果存储在指定的位置。
示例:ADD AX, BX ; 将寄存器AX和BX中的数据相加,并将结果保存在AX中ADD [BX], CX ; 将内存地址BX指向的数据与寄存器CX中的数据相加,并将结果保存在内存地址BX指向的位置3. SUB指令:用于将两个数据相减,并将结果存储在指定的位置。
示例:SUB AX, BX ; 将寄存器AX的数据减去BX的数据,并将结果保存在AX中SUB [BX], CX ; 将内存地址BX指向的数据减去寄存器CX的数据,并将结果保存在内存地址BX指向的位置4. INC指令:用于将指定位置的数据加1。
示例:INC AX ; 将寄存器AX的数据加1INC [BX] ; 将内存地址BX指向的数据加15. DEC指令:用于将指定位置的数据减1。
示例:DEC AX ; 将寄存器AX的数据减1DEC [BX] ; 将内存地址BX指向的数据减16. JMP指令:用于无条件跳转到指定的代码位置。
示例:JMP label1 ; 无条件跳转到标签label1处JMP 100h ; 无条件跳转到内存地址100h处7. CMP指令:用于比较两个数据的大小,并根据比较结果设置条件码寄存器。
示例:CMP AX, BX ; 比较寄存器AX和BX的数据大小,并设置条件码寄存器CMP [BX], CX ; 比较内存地址BX指向的数据和寄存器CX的数据大小,并设置条件码寄存器8. JE指令:用于在两个数据相等时跳转到指定的代码位置。
常用汇编指令
常用汇编指令一、汇编语言简介汇编语言是一种低级语言,与计算机硬件直接相关。
在编写汇编程序时,我们使用汇编指令来告诉计算机执行特定的操作。
汇编指令是一条条的机器码,通过汇编器将其转换为可执行的机器代码。
二、汇编指令的分类汇编指令可以分为以下几类:1. 数据传输指令数据传输指令用于将数据从一个位置传输到另一个位置。
常见的数据传输指令有:•MOV:将数据从一个位置复制到另一个位置。
•XCHG:交换两个位置的数据。
•PUSH:将数据压入栈中。
•POP:将数据从栈中弹出。
2. 算术指令算术指令用于进行算术运算。
常见的算术指令有:•ADD:将两个数相加。
•SUB:将一个数减去另一个数。
•MUL:将两个数相乘。
•DIV:将一个数除以另一个数。
3. 逻辑指令逻辑指令用于进行逻辑运算。
常见的逻辑指令有:•AND:对两个数进行逻辑与运算。
•OR:对两个数进行逻辑或运算。
•XOR:对两个数进行逻辑异或运算。
•NOT:对一个数进行逻辑非运算。
4. 控制指令控制指令用于控制程序的执行流程。
常见的控制指令有:•JMP:无条件跳转到指定的地址。
•JZ:如果上一次的运算结果为零,则跳转到指定的地址。
•JC:如果上一次的运算结果产生了进位或借位,则跳转到指定的地址。
•CALL:调用一个子程序。
三、汇编指令的应用汇编指令广泛应用于嵌入式系统、驱动程序和操作系统等领域。
下面是一些常见的应用场景:1. 嵌入式系统嵌入式系统通常具有资源有限的特点,因此需要高效地使用计算资源。
汇编语言可以直接访问硬件,提供更高的执行效率和更小的代码体积,因此在嵌入式系统中广泛使用。
2. 驱动程序驱动程序是操作系统与硬件之间的桥梁,负责将操作系统的指令翻译成硬件可以理解的指令。
由于驱动程序需要直接与硬件进行交互,因此使用汇编语言编写驱动程序可以提高执行效率和精确控制硬件。
3. 操作系统操作系统是计算机系统的核心软件,需要高效地管理计算资源和提供各种服务。
汇编语言可以直接操作硬件,提供更底层的控制和更高的执行效率,因此在操作系统的内核部分经常使用汇编语言编写。
汇编常用命令总结
汇编常用命令总结汇编语言是一种底层的计算机语言,通过使用汇编命令对机器指令进行编写和控制。
在学习和使用汇编语言时,掌握常用的汇编命令非常重要。
以下是汇编常用命令的详细总结:1.MOV:将数据从一个位置复制到另一个位置。
例如,将数据从寄存器复制到内存或者将数据从内存复制到寄存器。
2.ADD:将两个数相加,并将结果保存在目标位置。
可以用于寄存器之间的相加或者将寄存器和内存中的数据相加。
3.SUB:从一个数中减去另一个数,并将结果保存在目标位置。
与ADD命令类似,可以用于寄存器之间或者寄存器和内存之间的相减。
4.CMP:比较两个数,一些条件下,设置标志位用于后续的条件分支。
例如,当两个数相等时,设置零标志位。
6.JE、JNE、JG、JL、JA等:基于条件进行转移。
例如,JE用于当ZF标志位被设置为1时,跳转到指定位置,即上一次比较的结果是相等的。
7.AND、OR、XOR:对两个数位进行逻辑运算,并将结果保存在目标位置。
AND用于逻辑与运算,OR用于逻辑或运算,XOR用于逻辑异或运算。
8.NOT:对一个数位取反。
9.PUSH:将数据压入栈顶。
用于将寄存器、内存中的数据或者立即数压入栈中。
10.POP:从栈顶弹出数据。
用于将栈中的数据弹出到寄存器或者内存中。
11.CALL:调用子程序或函数。
将当前的程序状态保存到栈上,并跳转到子程序的入口地址。
12.RET:从子程序中返回。
将存储在栈上的返回地址弹出,恢复程序的现场,并返回到调用者。
13.LOOP:循环指令。
根据计数寄存器的值,重复执行指定的循环代码。
14.MOVZX:将一个无符号字节或无符号字进行零扩展,转换为更大的数据类型。
15.MOVSX:将一个有符号字节或有符号字进行符号扩展,转换为更大的数据类型。
16.LEA:将一个偏移地址加载到寄存器中。
17.INC、DEC:递增或递减寄存器或内存中的值。
18.NOP:空操作。
用于占位或延时。
19.INT:软中断。
常用的汇编指令与技巧(收藏)
常⽤的汇编指令与技巧(收藏)1.数据传送指令:movmove r1,r2 /*r1=r2*/move r1,#4096 /*r1=4096*/2.⼤范围的地址读取指令:ldrldr r1,=0x123456789 /*r1=0x123456789*/ldr r1,=label /*获取绝对地址,即label的地址*/label: ……3.内存访问指令(当ldr后⾯没有=号时为内存读取指令)读取指令:ldrldr r1 ,[r2,#4] /*将内存地址为r2+4的数据读取到r1中,相当于C语⾔中的*操作*/ldr r1,[r2],#4 /*将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4*/ldr pc,_irq /*pc=*(_irq)将标号中的内容放⼊pc中_irq: .word do_swi存储指令:strstr r1 ,[r2,#4] /*将r1的值存⼊地址为r2+4的内存中*/str r1,[r2],#4 /*将r1的值存⼊地址为r2的内存中,再将地址加4,r2=r2+4*/4.批量内存访问指令ldm,stm格式:ldm {cond} <addresing_mode> <rn> {!} <register list> {^} stm{cond} <addresing_mode> <rn> {!} <register list> {^}格式说明:1){cond}:表⽰指令的执⾏条件,根据cpsr寄存器中的条件标志位决定是否执⾏该条指令,每条ARM指令包含4bit的条件码域,可以定义16个执⾏条件,具体如下表:2)<addresing_mode>表⽰地址变化模式,具体如下:3)<rn> 中保存内存的地址,如果后⾯加上!,指令执⾏完成后,rn的值会更新,等于下⼀个内存的地址,否则保持初始值。
汇编语言指令汇总
汇编语言指令汇总汇编语言是一种底层编程语言,用于编写计算机程序。
在汇编语言中,指令是执行特定操作的基本单元。
以下是一些常见的汇编语言指令的汇总:1.数据传输指令:-MOV:将源操作数的值复制到目的操作数。
-PUSH:将数据压入栈中。
-POP:从栈中弹出数据。
-LEA:将源操作数的有效地址加载到目的操作数中。
2.算术和逻辑指令:-ADD:将两个操作数相加,结果存储在目的操作数中。
-SUB:将第二个操作数从第一个操作数中减去,结果存储在目的操作数中。
-MUL:将两个操作数相乘,结果存储在目的操作数中。
-DIV:将第一个操作数除以第二个操作数,商存储在目的操作数中。
3.分支和循环指令:-JMP:无条件跳转到指定的地址。
-CMP:比较两个操作数的值。
-JZ/JNZ:当比较结果为零/非零时,跳转到指定的地址。
-JE/JNE:当比较结果为相等/不相等时,跳转到指定的地址。
-JG/JGE/JL/JLE:当比较结果为大于/大于等于/小于/小于等于时,跳转到指定的地址。
-LOOP:循环指令,根据计数寄存器的值重复执行指定的代码块。
4.中断指令:-INT:引发中断,将程序控制权转移到中断服务程序。
-IRET:从中断服务程序返回到调用程序。
5.位操作指令:-AND/OR/XOR:按位与/或/异或操作。
-NOT:按位取反操作。
-SHL/SHR:逻辑左移/逻辑右移操作。
6.I/O指令:-IN:从输入端口读取数据。
-OUT:向输出端口写入数据。
7.标志位操作指令:-CLC:清除进位标志位。
-STC:设置进位标志位。
-CLI:禁用中断。
-STI:启用中断。
8.字符串指令:-MOVS:将一个字符串从源地址移动到目的地址。
-CMPS:比较两个字符串的内容。
-LODS:从源地址加载一个字符或一个字符串。
-STOS:存储一个字符或一个字符串到目的地址。
9.其他指令:-NOP:空操作指令。
-HLT:停止运行指令。
以上只是一些常见的汇编语言指令,汇编语言的指令集因计算机体系结构而异。
汇编语言常用指令大全
汇编语言常用指令大全汇编语言是一种计算机编程语言,使用指令来控制计算机硬件执行特定的操作。
在本文中,我们将介绍一些常用的汇编语言指令,以帮助读者更好地理解和学习汇编语言。
一、数据传输指令1. MOV:将数据从一个位置复制到另一个位置。
例子:MOV AX, BX 将寄存器BX中的值复制到寄存器AX中。
2. PUSH:将数据压入堆栈。
例子:PUSH AX 将寄存器AX中的值压入堆栈。
3. POP:从堆栈中弹出并获取数据。
例子:POP AX 从堆栈中弹出一个值,并将其存入寄存器AX中。
二、算术指令1. ADD:将两个操作数相加。
例子:ADD AX, BX 将寄存器AX和BX中的值相加,并将结果存入寄存器AX中。
2. SUB:将一个操作数从另一个操作数中减去。
例子:SUB AX, BX 将寄存器BX中的值从寄存器AX中减去,并将结果存入寄存器AX中。
3. MUL:将两个操作数相乘。
例子:MUL AX, BX 将寄存器AX和BX中的值相乘,并将结果存入寄存器AX中。
三、逻辑指令1. AND:进行逻辑与操作。
例子:AND AX, BX 对寄存器AX和BX中的值进行逻辑与操作,并将结果存入寄存器AX中。
2. OR:进行逻辑或操作。
例子:OR AX, BX 对寄存器AX和BX中的值进行逻辑或操作,并将结果存入寄存器AX中。
3. NOT:进行逻辑非操作。
例子:NOT AX 对寄存器AX中的值进行逻辑非操作。
四、条件分支指令1. JMP:无条件跳转到指定的地址。
例子:JMP label 跳转到标记为label的地址。
2. JZ:当操作数为零时跳转到指定的地址。
例子:JZ label 如果寄存器AX中的值为零,则跳转到标记为label 的地址。
3. JC:当进位标志为1时跳转到指定的地址。
例子:JC label 如果进位标志位为1,则跳转到标记为label的地址。
五、循环指令1. LOOP:当计数器不为零时,循环执行指定的代码块。
汇编指令大全+很全的汇编指令
for Addition)
1. 调整操作如下
格式: DAA
(1) 若(AL) and 0FH>9 或 AF=1
,则(AL)<--(AL)+6,AF<--1,对低
功能: 对AL中的两个组合进制数相加的结果进行调 四位的调整.
整,调整结果仍放在AL中,进位标志放在CF中.
(2) 若(AL) and 0F0H>90H 或
6 LAHF 标志传送指令 LAHF 格式: LAHF
2. 本指令不影响状态标位,表格 长度不超过256字节.
说明: 该指令不影响FLAG的原来 内容,AH只是复制了原FLAG的低8 位内容.
功能: 取FLAG标志寄存器低8位至AH寄存器.(AH)<-
-(FLAG)7~0
7 SAHF 标志传送指令 SAHF
说明:
格式: DEC OPRD 功能: OPRD<--OPRD-1
1. OPRD 为寄存器或存储器操作 数.
2. 这条指令执行结果影响AF、 OF、PF、SF、ZF标志位,但不影 响CF标志位.
页码,4/22
星尘-易尘
302 NEG 303 CMP
304 AAS 305 DAS 306 MUL
取补指令 NEG(NEGate)
未组合的十进制加法调整指令 AAA(ASCII Adgust 说明:
for Addition)
1. 组合的十进制数和未组合的
格式: AAA
十进制数:在计算中,十进制数可
用四位二进制数编码,称为BCD
功能: 对两个组合的十进制数相加运算(存在AL中) 码.
的结果进行调整,产生一个未组合的十进制数放在
AX中.
SUB [BX+25],AX
常用汇编指令
常用汇编指令汇编语言是一种机器语言的高级表示形式,其指令集是CPU所支持的指令集。
在计算机编程中,汇编语言是一种非常重要的编程语言,它可以直接操作硬件资源,实现底层控制和优化性能。
下面将介绍一些常用的汇编指令。
1. MOV指令MOV指令用于将数据从一个位置复制到另一个位置,其语法如下:MOV destination, source其中destination表示目标操作数,source表示源操作数。
例如:MOV AX, BX这条指令将BX寄存器中的值复制到AX寄存器中。
2. ADD和SUB指令ADD和SUB指令分别用于加法和减法运算,其语法如下:ADD destination, sourceSUB destination, source其中destination表示目标操作数,source表示源操作数。
例如:ADD AX, BXSUB AX, BX这两条指令分别将BX寄存器中的值加到AX寄存器中,并从AX寄存器中减去BX寄存器中的值。
3. INC和DEC指令INC和DEC指令分别用于对一个操作数进行加1或减1运算,其语法如下:INC destinationDEC destination其中destination表示目标操作数。
例如:INC AXDEC AX这两条指令分别将AX寄存器中的值加1或减1。
4. CMP指令CMP指令用于比较两个操作数的大小,其语法如下:CMP operand1, operand2其中operand1和operand2表示要比较的两个操作数。
例如:CMP AX, BX这条指令将比较AX寄存器中的值和BX寄存器中的值,并设置标志位以表示它们之间的关系。
5. JMP指令JMP指令用于无条件跳转到另一个程序地址,其语法如下:JMP address其中address表示要跳转到的地址。
例如:JMP 1000h这条指令将跳转到程序中地址为1000h处执行。
6. JZ和JNZ指令JZ和JNZ指令分别用于根据标志位进行条件跳转,其语法如下:JZ addressJNZ address其中address表示要跳转到的地址。
汇编指令大全
汇编指令大全汇编语言是一种低级语言,它直接面向计算机硬件,使用符号指令来代替机器语言指令,能够直接控制计算机硬件。
汇编指令是汇编语言中最基本的部分,它直接对应着计算机的机器指令,是程序员编写程序时直接使用的指令集合。
在汇编指令大全中,我们将详细介绍常见的汇编指令及其功能,帮助读者更好地理解和掌握汇编语言。
1. 数据传送指令。
数据传送指令是汇编语言中最基本的指令之一,用于在寄存器和内存之间传送数据。
常见的数据传送指令包括MOV、XCHG等,它们可以将数据从一个位置传送到另一个位置,是程序中最常用的指令之一。
2. 算术运算指令。
算术运算指令用于对数据进行算术运算,包括加法、减法、乘法、除法等。
常见的算术运算指令有ADD、SUB、MUL、DIV等,它们可以对寄存器或内存中的数据进行相应的算术运算,并将结果存储到指定的位置。
3. 逻辑运算指令。
逻辑运算指令用于对数据进行逻辑运算,包括与、或、非、异或等。
常见的逻辑运算指令有AND、OR、NOT、XOR等,它们可以对数据进行相应的逻辑运算,并将结果存储到指定的位置。
4. 控制转移指令。
控制转移指令用于改变程序的执行顺序,包括无条件转移和条件转移两种。
常见的控制转移指令有JMP、JZ、JG等,它们可以根据指定的条件改变程序的执行流程,实现程序的控制流转移。
5. 程序中断指令。
程序中断指令用于在程序执行过程中产生中断,包括内部中断和外部中断两种。
常见的程序中断指令有INT、IRET等,它们可以在特定的条件下中断程序的执行,并在中断处理程序执行完毕后恢复程序的执行。
6. 栈操作指令。
栈操作指令用于对栈进行操作,包括入栈和出栈两种操作。
常见的栈操作指令有PUSH、POP等,它们可以将数据压入栈中或从栈中弹出数据,实现程序中的数据传递和保存。
以上就是汇编指令大全的简要介绍,通过学习和掌握这些指令,读者可以更好地理解汇编语言的基本原理和运行机制,从而能够编写出高效、精确的汇编程序。
基本的汇编指令
跳转命令-------------------------------------------------------------根据条件作出是否跳转的决定,通常前面会有一个判断语句,例如:CMP AX,BXJZ XX //jump zero上面两条命令意为用AX 减BX,它的值如果为0 则跳转到XX 的标号行。
常用的跳转命令有:JZ/JE 相等或为零为则跳转JNZ/JNE 不相等或不为零则跳转JL/JLE小于/小于或等于则跳转JG/JGE大于/大于或等于则跳转JMP 无条件跳转-------------------------------------------------------------比较语句-------------------------------------------------------------CMP AX,BX //AX 寄存器减去BX 寄存器的内容AND AX,BX //AX 与BX 做“与运算”OR AX,BX //AX 与BX 做“或运算”TEST AX,BX 与AND AX,BX 命令有相同效果XOR AX,AX 使AX 的内容清零,每个寄存器与自己作异或运算等于清零动作-------------------------------------------------------------子程序-------------------------------------------------------------一个子程的模样长得像这个样子CALL 15F:334422子程式是个很重要的概念,它是主程式的一个分支,用来做特定动作。
打个比方:你要上班,先你是走路到车站,然后上车,然后下车,然后走到自己的办公室。
这里如果要把上班编为一段程式的话,那么就可以把“走路”、“搭车”、“走到办公室”做为分支程式来处理。
说得再通俗一点就是:你要破解的程式不可能就是一条主程式到底,肯定会呼叫下面的子程式,由子程式来处理你发送的注册信息,然后比较,然后标记是否注册正确,这些都是靠它来完成的。
常用的汇编指令都有哪些?
常用的汇编指令都有哪些?常用的汇编指令都有哪些?LEA (Load Effective Address)有效地址送寄存器指令LDS (Load DS with pointer)指针送寄存器和DS指令LES(Load ES with pointer)指针送寄存器和ES指令LAHF(Load AH with Flags)标志位送AH指令SAHF(Store AH into Flgs)AH送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加1指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC (DECrement)减1指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned MUL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的BCD码加法十进制调整指令DAS 压缩的BCD码减法十进制调整指令AAA 非压缩的BCD码加法十进制调整指令AAS 非压缩的BCD码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left )循环左移指令P58ROR(Rotate Right)循环右移指令P58RCL(Rotate Left through Carry)带进位循环左移RCR (Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前CLD(CLear Direction flag)清除方向标志指令STD(SeT Direction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令P70LOOPZ/LOOPE 为零/相等时循环指令LOOPNZ/LOOPNE 不为零/不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置0指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置1指令NOP(No OPeretion)无操作指令HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=) 等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$ 地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令JZ OPR //结果为零转移JNZ OPR //结果不为零转移JS OPR //结果为负转移JNS OPR //结果为正转移JO OPR //溢出转移JNO OPR //不溢出转移JP OPR //结果为偶转移JNP OPR //结果为奇转移JC OPR //有进位转移JNC OPR //无进位转移汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)============================x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:1. 通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)这些32位可以被用作多种用途,但每一个都有专长 . EAX 是累加器(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是基地址(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX 是(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.ESI/EDI分别叫做源/目标索引寄存器(source/destinationindex),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI 指向目标串.EBP是基址指针(BASE POINTER), 它最经常被用作高级语言函数调用的框架指针(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:push ebp ;保存当前ebpmov ebp,esp ;EBP设为当前堆栈指针sub esp, xxx ;预留xxx字节给函数临时变量.这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作mov esp,ebp/pop ebp/ret 即可.ESP 专门用作堆栈指针.2. 段寄存器:CS(Code Segment,代码段) 指定当前执行的代码段. EIP(Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP 指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符别名而通过DS来访问/修改. 自修改代码的程序常如此做.ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.3. 标志寄存器(EFLAGS):该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.零标志Z(ZERO), 若运算结果为0则置1, 否则为0符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的XX 有如下字母: 无符号操作: 带符号操作:A = ABOVE , 表示高于G = GREATER , 表示大于B = BELOW , 表示低于L = LESS , 表示小于C = CARRY , 表示进位或借位O = OVERFLOW , 表示溢出S = SIGN , 表示负通用符号:E = EQUAL 表示等于, 等价于Z (ZERO)N = NOT 表示非, 即标志没有置位. 如JNZ 如果Z没有置位则跳转Z = ZERO , 与E同.如果仔细想一想,就会发现JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, .4. 端口端口是直接和外部设备通讯的地方。
汇编语言指令汇总
汇编语言指令汇总汇编语言是一种低级编程语言,它直接操作计算机硬件,使用指令来完成特定的任务。
下面是一些常用的汇编语言指令汇总。
1.操作数传送指令:-MOV:将数据从一个位置复制到另一个位置。
-XCHG:交换两个位置中的数据。
2.算术指令:-ADD:将两个数相加并将和存储在指定位置。
-SUB:将两个数相减并将差存储在指定位置。
-MUL:将两个数相乘并将结果存储在指定位置。
-DIV:将两个数相除并将商存储在指定位置。
-INC:将一个数增加1-DEC:将一个数减少13.逻辑指令:-AND:对两个数进行逻辑与操作并将结果存储在指定位置。
-OR:对两个数进行逻辑或操作并将结果存储在指定位置。
-XOR:对两个数进行逻辑异或操作并将结果存储在指定位置。
-NOT:对一个数进行逻辑非操作并将结果存储在指定位置。
4.控制指令:-JMP:无条件跳转到指定位置。
-JZ:如果前一条指令的结果为0,则跳转到指定位置。
-JNZ:如果前一条指令的结果不为0,则跳转到指定位置。
-JC:如果前一条指令产生进位,则跳转到指定位置。
-JNC:如果前一条指令不产生进位,则跳转到指定位置。
5.栈操作指令:-PUSH:将数据放入栈中。
-POP:将栈顶的数据弹出。
6.输入输出指令:-IN:从外部设备中读取数据。
-OUT:将数据发送到外部设备。
7.循环指令:-LOOP:根据计数寄存器的值,重复执行指定的代码块。
8.过程调用指令:-CALL:调用一个子程序。
-RET:从子程序返回。
9.字符串指令:-MOVS:将一个字节或一个字从一个位置复制到另一个位置。
-CMPS:将两个位置中的字节或字进行比较。
除了以上提到的指令外,不同的汇编语言还有其它特定的指令,用于特定的硬件操作或功能实现。
这些指令的语法与使用方法可能略有不同,具体请参考所使用的汇编语言的文档或手册。
总之,汇编语言指令是汇编语言的基础,熟练掌握和理解这些指令对于编写高效和可靠的汇编程序至关重要。
汇编指令大全
汇编指令大全汇编指令是计算机程序设计中的重要组成部分,它是一种低级语言,直接操作计算机硬件,能够对计算机进行精细的控制。
在学习汇编语言时,掌握各种指令是非常重要的,因为它们是编写高效、精确的程序的基础。
本文将对常用的汇编指令进行介绍,帮助读者更好地理解和运用汇编语言。
1. 数据传送指令。
数据传送指令用于在寄存器和内存之间传送数据,常见的指令包括MOV、XCHG等。
MOV指令用于将数据从一个位置复制到另一个位置,XCHG指令用于交换两个位置的数据。
这些指令在编写程序时经常用到,能够实现数据的传递和交换。
2. 算术运算指令。
算术运算指令用于对数据进行加减乘除等数学运算,常见的指令包括ADD、SUB、MUL、DIV等。
ADD指令用于加法运算,SUB指令用于减法运算,MUL指令用于乘法运算,DIV指令用于除法运算。
这些指令能够对数据进行各种数学运算,是编写复杂程序时不可或缺的指令。
3. 逻辑运算指令。
逻辑运算指令用于对数据进行逻辑运算,常见的指令包括AND、OR、NOT、XOR等。
AND指令用于按位与运算,OR指令用于按位或运算,NOT指令用于按位取反,XOR指令用于按位异或运算。
这些指令能够对数据进行逻辑运算,常用于程序中的逻辑判断和条件运算。
4. 跳转指令。
跳转指令用于改变程序的执行顺序,常见的指令包括JMP、JE、JNE、JG等。
JMP指令用于无条件跳转,JE指令用于相等时跳转,JNE指令用于不相等时跳转,JG指令用于大于时跳转。
这些指令能够实现程序的条件分支和循环控制,是编写复杂逻辑的关键指令。
5. 存储器访问指令。
存储器访问指令用于对存储器进行读写操作,常见的指令包括PUSH、POP、LEA等。
PUSH指令用于将数据压入堆栈,POP指令用于将数据弹出堆栈,LEA 指令用于加载有效地址。
这些指令能够对存储器进行高效的读写操作,是程序设计中不可或缺的指令。
6. 输入输出指令。
输入输出指令用于与外部设备进行数据交换,常见的指令包括IN、OUT等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运算指令
ADD 加法指令
格式:ADD 目标,源
说明:用目标数据加上源数据,然后将计算结果传送给目标,并根据运算结果设置FLAGS的各相关标志位。格式要求和MOV指令相同,目标可以是寄存器,可以是内存地址,但不可以是直接数。目标和源不可以同为地址形式。
例如:
MOV EAX,00000001 //给EAX赋值,使EAX=00000001
------------------------------------
PUSH 数据入栈指令
格式:PUSH 源数据
说明:将源数据存入内存栈,地址是ESP指向的栈底方向的空栈,数据入栈后ESP向栈顶方向移动也就是减少4个字节。
例如:
PUSH EAX //将EAX的值存入栈,地址为ESP,数据入栈后ESP=ESP-4
ADD EAX,EAX //结果EAX=0000000E
----------------------------
INC 加一指令
格式:ADD 目标
说明:将目标数据+1,然后将计算结果传送给目标,同时根据运算结果设置FLAGS的各相关标志位,目标不可以是直接数,否则指令没有意义。
例如:
X86指令
X86指令通指80X86的一系列指令,指令兼容8/16/32位数据的操作。
----------------------------------------------------------------------------
传送指令
MOV 数据传送指令
格式:MOV 目标,源
MOVZX AX,01 //其结果AX=0001
------------------------------------
XCHG 数据交换指令
格式:XCHG 目标,源
说明:将目标和源中的数据相互交换,目标和源可以是寄存器,可以是内存,但不可以同时为内存。
例如:
XCHG EAX,EBX
以上两条指令中的BYTE PTR和WORD PTR分别表示1字节和2字节,和原数据的01和2710对应。
再如:
MOV BYTE PTR [ESI+000000AC],AL
MOV WORD PTR [ESI+000000AC],BX
也是如此,源和目标的数据长度必须相同。
------------------------------------
MOV [204010AC],EAX //将EAX中的4字节数值复制到地址0x204010AC处
MOV BYTE PTR [204010AC],01
//将1字节16进制数01复制到地址0x204010AC处
MOV WORD PTR [204010AC],2710
//将2字节16进制数2710复制到地址0x204010AC处,其结果内存地址0x204010AC处变为10 27
INC AL
INC BYTE PTR [20401000]
-----------------------------
SUB 减法指令
格式:SUB 目标,源
说明:结果目标=目标-源,并设置FLAGS相关标志位。
DEC 减一指令
格式:DEC 目标
说明:结果目标=目标-1,并设置FLAGS相关标志位。
另外这里列举的汇编指令都是PC上用的汇编指令,如果是模拟器游戏,用CE是无法对模拟器游戏进行正确的反汇编的(反汇编的结果并不是真正意思上的主机指令),只能使用模拟器自带的反汇编功能,用过模拟器反汇编的就可以看到,游戏主机上的汇编指令和PC上的是不一样的,因为处理器和存贮单元的结构不同,访问和操作数据的规则自然也不相同。
逻辑运算指令
AND 逻辑与指令
格式:AND 目标,源
说明:结果目标=目标与源,并设置FLAGS相关标志位。
OR 逻辑或指令
格式:OR 目标,源
说明:结果目标=目标或源,并设置FLAGS相关标志位。
XOR 异或指令
格式:XOR 目标,源
说明:结果目标=目标异或源,并设置FLAGS相关标志位。
可以用如下几条指令来说明LEA和MOV的区别:
MOV EAX,00400000 //将数值00400000传送到EAX,即EAX=00400000
MOV ESI,20401000 //将数值20401000传送到ESI,即ESI=20401000
MOV [ESI+000000AC],EAX //将EAX的值传送到内存地址0x204010AC处
汇编指令有很多,X86指令、X87浮点指令、SSE指令等等,所以这里无法一一列举讲解,只说一下修改游戏时经常会遇到和使用到的指令的用法,如果碰到这里没有列举的指令,可以自己在网上查一下资料,只要了解了汇编指令的工作原理,其他指令应该也是很容易理解的。注意网上的汇编指令资料基本上都是老的16位汇编,就是需要用段寄存器辅助寻址的,而这里所讲的全部都是现在所用的32位汇编指令,寄存器直接支持32位地址,所以在指令的细节上会有一些小小的区别,但是指令的作用都是一样的。
NOT 结果和源同位的的值正好相反,源位上是1,结果则为0,源位上是0,则结果为1。
其真值表如下:
AND OR XOR NOT
源 0011 0011 0011 0101
目标 0101 0101 0101
结果 0001 0111 0110 1010
AND指令通常用来屏蔽掉数据中的某些位,比如:
PUSH 01 //将数值01存入栈,地址为ESP,数据入栈后ESP=ESP-4
------------------------------------
POP 数据出栈指令
格式:POP (目标)
说明:将内存栈中的数据移除,操作过程为先将本来指向栈底空栈的ESP向栈底方向移动4个字节,使ESP指向最后一次入栈的数据,然后将此数据从栈中移除,使此处变为空栈。(用目标来接受出栈的数据)
NOT 逻辑非指令
格式:NOT 源
说明:结果=源非,源不能是直接数,否则指令无意义,指令不影响FLAGS标志位。
注意以上逻辑指令处理的都是数值二进制位的逻辑关系
AND 目标和源同位上都是1,那么结果为1,否则结果为0
OR 目标和源同位上都是0,那么结果为0,否则结果为1
XOR 目标和源同位上的值相等则结果为0,不相等则结果为1
说明:将源传送到目标,其中目标可以是地址,也可以是寄存器。而源可以是地址,可以是寄存器,也可以是数值。注意:目标不可以是数值,源和目标不可以同时为地址,另外源和目标的数据长度必须相同。
例如:
MOV EAX,EBX //将寄存器EBX中的数值传送到EAX
MOV CX,DX //将寄存器DX中的数值传送到CX
MUL 乘法指令
格式:MUL 目标,源
说明:结果目标=目标*源,并设置FLAGS相关标志位,注意目标和源都不能是直接数。
DIV 除法指令
格式:DIV 源
说明:结果EAX=EAX/源,EDX=余数,源不能是直接数,指令不影响FLAGS标志位。
----------------------------------------------------------------------------
常用汇编指令
注意:在汇编指令中所有的地址值和数值都是16进制,用符号"[...]"之间的数值来表示内存地址。内存地址处操作数据的长度用BYTE PTR [地址]、WORD PTR [地址]、DWORD PTR [地址]来区别,分别对应表示此地址处的1字节、2字节、4字节数据。
=================================================================================
MOV EAX,204010AC
AND EAX,0000FFFF
则其结果EAX=000010AC
OR指令通常则用来补充数据中的某些位,比如:
MOV EAX,20401000
OR AL,AC
则其结果EAX=204010AC
而XOR指令则用来清空某一寄存器,比如:
XOR EAX,EAX
ADD EAX,00000002 //EAX+00000002,结果EAX=00000003
MOV [20401000],00000004 //将数值00000004存到内存地址20401000处
ADD EAX,[20401000] //EAX+内存地址20401000处的数值,结果EAX=00000007
MOV AL,01 //将数值01传送到AL
MOV BX,0001 //将数值0001传送到BX
MOV EAX,[204010AC] //将内存地址0x204010AC处开始的4字节数值传送到EAX
MOV ECX,[ESI+000000AC] //将ESI中的数值加上0xAC,再将结果当做地址,然后将此结果地址处的数值复制到ECX
MOVSX 符号填充指令
格式:MOVSX 目标,源
说明:MOVSX和MOV指令相似,也是将源传送给目标,只是源的数据长度要小于目标,不足位用源的符号来填位),40是正数(+64)
MOV BL,80 //将数值80传送到BL(8位),80是负数(-128)
因为目标=源,所以异或的结果是数据的每一位都相同,而相同的结果是每一位都变为0。
------------------------------------
条件指令
CMP 比较指令