汇编语言学习笔记

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(Carry Flag, 溢出标志位):用于表示无符号整数运算是否发生了溢出

        溢出标志位OF(Overflow Flags, 进位/借位标志位):用于表示有符号整数运算是否发生了溢出,分为上溢和下溢

        零标志位ZF:用于表示运算结果是否为0

        符号标志位SF:用于表示运算结果是否为负数(负数的二进制表示中,符号位为1),如果运算结果的最高有效位被置位,那么符号标志就会置位

        奇偶标志位PF:用于表示目的操作数的最低有效字节内1的个数是否为偶数

        辅助进位标志位AC:在运算结果(存储于目的操作数中)的最低位有效字节的第3位向第4位的进位值

虽然说OF与有符号数运算有关,但是无符号数进行运算时,OF也会被改变,只是此时OF无意义。同理有符号数进行运算时,CF也会发生相应的变化,但此时CF也没有意义。根本原因在于CPU执行运行时,不知道操作数的类型,它只是按照一定的规则进行计算,然后设置和使用标志位。

12、NEG指令(negate):该指令通过将数字转换为相应的补码而求得其相反数(正

你可能感兴趣的:(逆向工程,汇编)