内容更新是由低向高递增的
内容如下:
 xor rax, rax #xor rax,rax是对rax的清零运算操作
条件跳转(一般配合cmp使用)
下表展示了基于零标志位、进位标志位、溢出标志位、奇偶标志位和符号标志位的跳转。
 
 
 此表为1) 相等性的比较
- 无符号数比较
 基于无符号数比较的跳转如下表所示。操作数的名称反映了表达式里操作数的顺序(比如 leftOp < rightOp)。下表里的跳转仅在比较无符号数值时才有意义。有符号操作数使用不同的跳转指令。
  
- 有符号数比较
 下表列岀了基于有符号数比较的跳转。下面的指令序列展示了两个有符号数值的比较:
  
一、运算结果标志位
1、进位标志CF(Carry Flag)
 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
2、奇偶标志PF(Parity Flag)
 奇偶标志PF用于反映运算结果里“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
 利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程里,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
 (1)、在字操作时,发生低字节向高字节进位或借位时;
 (2)、在字节操作时,发生低4位向高4位进位或借位时。
 对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统里,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能令之发生改变。
 1、追踪标志TF(Trap Flag)
 当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步停断请求。这类方式主要用于程序的调试。
 指令系统里没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、停断允许标志IF(Interrupt-enable Flag)
3、方向标志DF(Direction Flag)
 方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
 在串处理指令李控制信息的方向
 标志位操作指令
 标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。
 1、进位CF操作指令
 清进位指令CLC(Clear Carry Flag):CF←0
 置进位指令STC(Set Carry Flag):CF←1
 进位取反指令CMC(Complement Carry Flag):CF←not CF
2、方向位DF操作指令
 清方向位指令CLD(Clear Direction Flag):DF←0
 置方向位指令STD(Set Direction Flag):DF←1
3、停断允许位IF操作指令
 清停断允许位指令CLI(Clear Interrupt Flag):IF←0
 其功能是不允许可屏蔽的外部停断来停断其后程序段的执行。
 置停断允许位指令STI(Set Interrupt Flag):IF←1
 其功能是恢复可屏蔽的外部停断的停断响应功能,通常是与CLI成对使用的。
4、取标志位操作指令
 LAHF(Load AH from Flags):AH←Flags的低8位
 SAHF(Store AH in Flags):Flags的低8位←AH
5、标志位堆栈操作指令
 PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;
 POPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;
######################################################################
 ######################################################################
 pushad: 将所有的32位通用寄存器压入堆栈
 pusha:将所有的16位通用寄存器压入堆栈
 pushfd:然后将32位标志寄存器EFLAGS压入堆栈
 pushf::将的16位标志寄存器EFLAGS压入堆栈
 popad:将所有的32位通用寄存器取出堆栈
 popa:将所有的16位通用寄存器取出堆栈
 popfd:将32位标志寄存器EFLAGS取出堆栈
 popf:将16位标志寄存器EFLAGS取出堆栈
 ######################################################################
 ######################################################################
 cpuid:获取CPU信息
 ######################################################################
 ######################################################################
 SBB(带借位减法)指令从目的操作数里减去源操作数和进位标志位的值。
 下面的示例代码用 32 位操作数实现 64 位减法,EDX:EAX 的值为 0000 0007 0000 0001h,从该值里减去 2。低 32 位先执行减法,并设置进位标志位,然后高 32 位再进行包括进位标志位的减法:
 
 SHL是逻辑左移指令,SHR是逻辑右移指令
 SAL是算术左移指令(shift arithmetic right),SAR是算术右移指令(shift arithmetic right)
 ######################################################################
 ######################################################################
 leave指令将EBP寄存器的内容复制到ESP寄存器里
 以释放分配给该过程的所有堆栈空间。然后,它从堆栈恢复EBP寄存器的旧值。
 在16位汇编下相当于:
 mov sp,bp
 pop bp
在32位汇编下相当于:
 mov esp,ebp;//将ebp指向(ebp内部应当保存一个地址,所谓指向即这个地址对应的空间)的值赋给esp
 pop ebp
 #################################################################################################################
 Lea eax,dword ptr ss:[esp+0x2c]
 Cmp eax,dword ptr ss:[ebp-0x30]
 ptr – pointer (既指针)得缩写。
 汇编里面 ptr 是规定的字(既保留字),是用来临时指定类型的。
 (可以理解为,ptr是临时的类型转换,相当于C语言里的强制类型转换)
汇编语言CS,DS,SS还有一个ES定义如下:
 CS(Code Segment):代码段寄存器;
 DS(Data Segment):数据段寄存器;
 SS(Stack Segment):堆栈段寄存器;
 ES(Extra Segment):附加段寄存器。
 当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。
 一、寄存器位置不同:
 1、CS:代码段寄存器;
 2、DS:数据段寄存器;
 3、SS:堆栈段寄存器。
 二、存放位置不同:
 1、代码段寄存器CS:存放当前正在运行的程序代码所在段的段基值。
 2、数据段寄存器DS:存放数据段的段基值。
 3、堆栈段寄存器SS:存放堆栈段的段基值。
 三、段地址不同:
 1、cs代码段地址,联合ip作为cpu指向当前正在执行的那条指令所使用,不能随意修改它。
 2、ss堆栈度段地址问联合sp定义一个答堆栈,一旦你确定了堆栈地址,ss也不能随便改变了。
 3、ds数据段地址定义一个数据段。
 #################################################################################################################
 byte:8位无符号整数,b表字节
 sbyte:8位有符号整数,s表有符号
 word:16位无符号整数
 sword:16位有符号整数
 dword:32位无符号整数,d表双字
 sdword:32位有符号整数,sd表有符号双字
 qword:64位整数,q表四字
 tbyte:80位(10字节)整数,t表10字节
 伪指令
 DB:8位整数
 DW:16位整数
 DD:32位整数或实数
 DQ:64位整数或实数
 DT:定义80位(10字节)整数
 #################################################################################################################
 入栈和出栈的汇编指令 push、pop 地址从高到低
 PUSH(Push onto the stack)进栈
 POP(Pop from the stack)出栈 有push就就要有pop
 PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2;操作数是 32 位的,则 ESP 减 4;操作数是 64 位的,则 ESP 减 8。
 POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数里,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4,如果操作数是 64 位的,ESP 加 8。
标志寄存器传送指令
 PUSHF(push the flags) 标志进栈
 POPF(pop the flags) 标志出栈
call:过程调用,调用一个过程(即函数或者子程序)
 ret:过程返回,返回指令,RET(从过程返回)指令将处理器转到该过程被调用的程序点上。call指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令寄存器。当过程准备返回时,它的ret指令从堆栈把返回地址弹回到指令寄存器。
 #################################################################################################################
 算术指令:
 mul(multiply) 乘法指令,两个数值相乘
 div 除法指令
 divr 除法指令
 imul eax,ebx,5 imul指令有3个操作数,第1个为目的操作数,第2个和第3个为进行乘法的源操作数
 add:两个数值相加 add ax,8 将寄存器AX里的数值加上8
 sub(subtraction):从一个数值减去另一个数值 sub ax,18将寄存器AX里的数值减去18 
 subr:减法指令
 xor:异或
 OR :在两个操作数的对应位之间进行(按位)逻辑或(OR)操作,并将结果存放在目标操作数里:OR destination, source
 and是按位“与”操作,在两个操作数的对应位之间进行(按位)逻辑与(and)操作,并将结果存放在目标操作数里:AND destination,source。当且仅当两操作数对应位都为“1”时结果的相应位为“1”,否则结果相应位为“0”。例:1101B AND 0100B = 0100B
 inc(increase)指令表示寄存器或者内存操作数加1
 dec(decrease)指令表示寄存器或者内存操作数减1
 neg(negate反面,对立面,非)指令通过把操作数转换为其二进制补码,将操作数的符号取反
cmp(compare):比较指令,进行比较两个操作数的大小,cmp执行从目的操作数里减去源操作数的隐含减法操作,并且不修改任何操作数:CMP destination,source
 标志位
 当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。
 如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如右表所示:
 
 如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如右表所示:
 
 mov(move):传送(分配)数值 mov ax,18 将18送入寄存器AX
 mov ax ,bx 将寄存器BX数据送入寄存器AX
 当指令有多个操作数,第一个操作数为目的操作数,第2个操作数为源操作数
 movzx指令(进行全零并传送)将源操作数复制到目的操作数,并把目的操作数0扩展到16位或者32位。这条指令只用于无符号正数
 movsx指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号0扩展到16位或者32位。这条指令只用于有符号正数
loop:循环指令,正式成为按照ECX计数器循环,将程序块重复特定次数。ECX自动成为计数器,每循环一次计数值减1
xchg(交换数据,exchange)指令交换两个操作数内容
lea(Load effective address)取有效地址,也就是取偏移地址。
nop 空指令
 ############################################################################################################################################
 需要注意的是32位是由栈来传参的,64位前六个参数由寄存器RDI、RSI、RDX、RCX、R8、R9依次传参,超过第六个的参数由栈来传参
 8位通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL
 16位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP
 32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
32位 16位 8位(高) 8位(低)
 EAX AX AH AL
 EBX BX BH BL
 ECX CX CH CL
 EDX DX DH DL
其他通用寄存器只能利用32或者16位名称为访问:
 32位 16位
 ESI SI
 EDI DI
 EBP BP
 ESP SP
寄存器
 EAX:累加(Accumulator)寄存器,常用于函数返回值
 EBX:基址(Base)寄存器,以它为基址访问内存
 ECX:计数器(Counter)寄存器,常用作字符串和循环操作里的计数器
 EDX:数据(Data)寄存器,常用于乘除法和I/O指针
 ESI:源变址寄存器
 EDI:目的变址寄存器
 ESP:堆栈(Stack)指针(Pointer)寄存器,指向堆栈顶部
 EBP:基址(Base)指针(Pointer)寄存器,指向当前堆栈底部
 EIP:指令寄存器,指向下一条指令的地址
基本程序执行寄存器
 寄存器为直接位于CPU内的高速存储位置
 8个通用寄存器,6个段寄存器,一个处理器状态寄存器(EFLAGS),和一个指令指针寄存器(EIP)。(指令寄存器:Instruction pointer register)
 通用寄存器:主要用于算术运算和数据传输。EAX寄存器的低16位在利用过程可用AX表示,AX寄存器的高8位被称为AH,低8位被称为AL。同样的关系也存在于EAX,EBX,ECX,EDX寄存器
乘除指令默认利用EAX。它常常被称为扩展累加器(extended accumulator)寄存器
 CPU默认利用ECX为循环计数器(circulate)
ESP用于寻址堆栈(一类系统内存结构)数据。它极少用于一般算术运算和数据传输,通常被称为扩展堆栈指针(extended stack pointer)寄存器
ESI和EDI用于高速存储器传输指令,有时也被称为扩展源地址寄存器(extended source index)和扩展目的地址寄存器(extended destination index)
高级语言通过EBP来引用堆栈里的函数参数和局部变量。除了高级编程,它不用于一般算术运算和数据传输。它常常被称为扩展帧指针(extended frame pointer)寄存器
EBP和ESP作为指针的寄存器,常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量,EBP指向栈低,ESP指向栈顶。
指令指针:指令指针(EIP)寄存器里包含下一条将要执行指令的地址。某些机器指令能控制EIP,令程序分支转向到一个新位置。
EFLAGS寄存器:EFLAGS(或者Flags)寄存器包含了独立的二进制位,用于控制CPU的操作,或者是反应一些CPU操作的结果。有些指令可以测试和控制这些单独的处理器标志位。
 32位标志寄存器 EFLAGS
 用于标识当前的一些状态
 CF:进位标志
 OF:溢出标志
 SF:符号标志
 ZF:零标志
 AC:辅助进位标志
 PF:奇偶标志