1、NOP指令:号称最安全的指令,全名为no Operation,一条nop指令占用一个字节,什么也不做。有时编译器会使用该指令将代码对齐到偶数地址边界(类似于内存对齐)。IA-32处理器从偶数双字地址处加载代码和数据时会更快
2、变量名仅仅只是对数据段内偏移地址的引用, 类似于mov eax, [变量名称]的汇编指令中,方括号暗示了要进行寻址操作,但是许多程序(包括微软的程序)在通常情况下都不使用方括号,除了lea指令外。
3、mov指令:
指令格式: mov destination, source
运行后的效果:目的操作数的内容改变成源操作数的内容,源操作数内容不变;等价于C++中的赋值操作:destination = source
mov指令的限制:1)两个操作数的尺寸必须一致;2)两个操作数不能同时为内存操作数,需要借助通用寄存器中转:先将源操作数移入一个通用寄存器中,再将通用寄存器的内容移到目目的内存位置;3)目的操作数不能为CS,EIP和IP;4)立即数不能直接送到段寄存器上,需要借助通用寄存器中转(如:mov eax, 立即数; mov ss, eax)
4、movzx指令:零扩展传送,该指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或者32为,此指令仅适用于无符号数整数;
5、movsx指令:符号扩展传送,该指令将源操作数的内容复制到目的操作数中并将该值进行符号扩招至16位或者32位;
6、LAHF指令(load status flag into AH):该指令将EFLAGS寄存器的低字节复制到AH寄存器,被复制的内容包括:符号标志位、零标志位、奇偶标志位和进位标志位。使用该指令可以方便的将标志值保存在变量中;
7、SAHF指令(store AH into status flag):该指令复制AH的值至EFLAGS寄存器的低字节;
8、XCHG指令(exchange data):该指令交换两个操作数的内容,注意它不接受立即操作数,除此之外,XCHG指令的操作数与MOV指令的操作数遵循同样的规则;
9、直接偏移操作数:在变量名称后面加上一个偏移值(单位为字节),可以创建直接偏移操作数,这个操作数可用于访问没有显示标号的内存地址。通过在变量的偏移地址后面加上一个常数得到的表达式被称为有效地址。有效地址以方括号括起来时就表示要对方括号内的表达式进行寻址以获取该有效地址处内存的内容(LEA指令除外)。
10、INC和DEC指令:操作数自增(加1)或者自减(减1)
11、ADD/SUB指令:将同尺寸的源操作数和目的操作数相加或者相减,格式为:
ADD/SUB 目的操作数 源操作数
加减法操作数并不改变源操作数,相加/减的结果存储在目的操作数中。ADD指令会根据目的操作数的结果相应修改进位标志、零标志、符号标志、溢出标志和奇偶标志。SUB指令会根据目的操作数的结果相应修改进位标志、零标志、符号标志、溢出标志、辅助进位标志和奇偶标志等。
状态标志的简要描述:
进位标志位CF:用于表示无符号整数运算是否发生了溢出
溢出标志位OF:用于表示有符号整数运算是否发生了溢出,分为上溢和下溢
零标志位ZF:用于表示运算结果是否为0
符号标志位SF:用于表示运算结果是否为负数(负数的二进制表示中,符号位为1),如果运算结果的最高有效位被置位,那么符号标志就会置位
奇偶标志位PF:用于表示目的操作数的最低有效字节内1的个数是否为偶数
辅助进位标志位AC:在运算结果(存储于目的操作数中)的最低位有效字节的第3位向第4位的进位值
12、NEG指令(negate):该指令通过将数字转换为相应的补码而求得其相反数(正数的原码、反码和补码相同,负数的反码=除符号位外,原码按位取反,负数的补码=负数的反码+1);
13、PTR操作符:可以使用该操作符来重载操作数生命的默认尺寸,这在试图以不同于变量声明时所使用的尺寸属性来访问变量的时候很有用(简单来说,就是高级语言中的类型强转), PTR必须和汇编器的标准数据类型(如BYTE, WORD,DWORD等)联合使用;
间接寻址:在处理数组时完全直接使用直接寻址是不现实的,不大可能为数组的每一个元素都提供一个不同的标号,也不大可能使用非常多的常量偏移去寻址数组的各个元素。处理数组的唯一可行的方法是使用寄存器作为指针并操作寄存器的值,这被称为间接寻址,操作数使用简介寻址时就称为简介操作数。在保护模式下,间接操作数可以是任何用方括号括起来的任意的32位通用寄存器(EAX、EBX等),寄存器里面存放着数据的偏移。在实地址模式下,使用16位的寄存器存放变量的偏移地址,如果要使用寄存器做间接操作数的话,只能使用SI,DI,DX或者BP寄存器。通常应当尽量避免使用BP,因为BP经常用来寻址堆栈而不是数据段。
变址操作数:把常量和寄存器相加以得到一个有效地址,任何32位通用寄存器都可以作为变址寄存器,变址操作数常用形式:mov eax, [esi+4]
14、JMP指令:无条件跳转指令,通常情况下只能跳转到当前过程内的标号处
15、LOOP指令:用于重复执行一块语句,执行的次数是特定的,ECX被自动用作计数器,在每次循环之后减1。LOOP指令的执行包含两部:首先ECX减1,接着与0比较,如果ECX不等0,则跳转到目的地址(标号)处,如果ECX等于0,则不发生跳转,这时控制权将转移到紧跟在LOOP后面的指令处。LOOPD指令总是使用ECX作为循环计数器,而LOOPW总是使用CX作为循环计数器。
16、操作数类型:
直接操作数:也就是变量的名字,代表了变量的地址。
直接偏移操作数:在变量的名字后面加一个偏移量而生成新的偏移,这个新偏移可以用来访问内存数据。
间接操作数:是用方括号括起来的包含数据地址的寄存器,如[esi],程序可以根据该地址寻址并返回内存数据。
变址操作数:把常量和间接操作数结合在一起,常量和寄存器值加在一起,得到最终的结果被用来寻址,例如[arr+esi], [arr+es*8]等
17、运行时堆栈,也称为堆栈:使用两个寄存器SS和ESP,保护模式下,SS寄存器存放的就是段选择子,用户模式程序不应该对其进行修改。ESP寄存器存放的是指向堆栈内特定位置为的一个32为偏移值。我们很少需要直接操纵ESP的值,相反,ESP寄存器的值通常是由CALL、RET、PUSH和POP等指令间接修改的。ESP指向的是是最后压入(添加)到堆栈上的数据。此处的堆栈与数据结构中的数据类型堆栈(堆栈抽象数据类型)是不同的。此处的运行时堆栈在系统层上(由硬件直接实现)处理子过程调用;堆栈抽象数据类型通常用于实现于后进先出操作的算法,一般使用高级语言如C++等编写。运行时堆栈有以下几种重要的用途:1)寄存器在做多种用途的时候,堆栈可以方便地作为其临时保存区域,在寄存器使用完毕之后,可以通过堆栈恢复其原始值。2)CALL指令执行的时候,CPU使用堆栈保存当前被调用过程(即函数)的返回地址。3)调用函数的时候,可以通过压栈传递参数。4)函数内的局部变量在堆栈上创建,函数返回时,这些变量被丢弃。
运行时堆栈是一个特殊数组,是一个用于存放寄存地址和数据的临时区域,这个堆栈常用于保存返回地址、函数参数、局部变量以及函数内部使用的寄存器。
18、PUSH指令:该指令首先减少ESP 的值,然后再把一个16位或者32位的源操作数复制到堆栈上。
19、POP指令:首先将ESP所指向的堆栈元素复制到16位或者32位的目的操作数中,然后增加ESP的值。
20、PUSHFD和POPFD指令:前者在堆栈上压入32位的EFLAGS寄存器的值,POPFD指令将在堆栈顶部的值弹出并发送到EFLAGS寄存器。注意MOV指令不能复制标志寄存器的值到变量或者寄存器中,因此PUSHFD指令可能就是保存标志寄存器的最佳方式了。
21、PUSHAD和POPAD指令:PUSHAD指令在堆栈上按照如下顺序压入所有的32位通用寄存器:EAX、ECX、EDX、EBX、ESP(执行PUSHAD指令之前的值)、EBP、ESI和EDI;POPAD指令以相反顺序从堆栈中弹出这些通用寄存器。如果代码中修改了很多32位寄存器,那么可以在函数的开始和结束分别调用PUSHAD和POPAD指令保存和恢复寄存器的值。
22、CALL指令和RET指令:CALL指令先将返回地址(当前CALL指令的下一条指令的地址)压入堆栈(ESP会减4)并把被调用函数的地址复制到指令指针寄存器EIP中。当程序返回时,RET指令从堆栈中弹出返回地址(此时ESP会加4)并送到指令指针寄存器EIP中。32位模式下,CPU总是EIP所指向的内存地址处的指令,16模式下,CPU总是执行IP寄存器所指向的指令。
23AND指令:对目的操作数和源操作数进行布尔位与操作并将执行结果存放在目的操作数中,ADD指令总是会清除溢出标志和进位标志,并根据目的操作数中的值修改符号标志、零标志和奇偶标志
24、OR指令:在每对操作数的对应数据位之间进行布尔或操作并将执行结果存放于目的操作数中。OR指令总是清除溢出标志和进位标志,并根据目的操作数的值修改符号标志、零标志和奇偶标志。
25、XOR指令:该指令在目的操作数和源操作数之间执行按位异或操作,并肩执行结果存放与目的操作数中。
26、NOT指令:NOT指令对一个操作数的所有数据位取反,得到的结果称为操作数的反码,NOT指令不影响任何状态标志
27、TEST指令:TEST指令对目的操作数和源操作数进行按位与操作并设置相应的标志位,和AND指令的唯一区别在于,TEST指令不修改目的操作数。
28、CMP指令:该指令在源操作数和目的操作数执行隐含的减法操作,两个操作数都不会被修改。CMP指令对标志位的影响如下:假想减法操作完成之后,CMP指令会根据运算结果修改溢出标志位、符号标志位、零标志位、进位标志位、辅助进位标志位和奇偶标志的值。
在IA-32逻辑