可以做免费推广的网站,wordpress 短信认证,网站首页的快照更新慢,电商包括哪些平台内容更新是由低向高递增的
内容如下#xff1a; xor rax, rax #xor rax,rax是对rax的清零运算操作
条件跳转(一般配合cmp使用)
下表展示了基于零标志位、进位标志位、溢出标志位、奇偶标志位和符号标志位的跳转。 此表为1) 相等性的比较
无符号数比较 基于无符号数比较的…内容更新是由低向高递增的
内容如下 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 rightSAR是算术右移指令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:[esp0x2c] Cmp eax,dword ptr ss:[ebp-0x30] ptr – pointer 既指针得缩写。 汇编里面 ptr 是规定的字(既保留字)是用来临时指定类型的。 可以理解为ptr是临时的类型转换相当于C语言里的强制类型转换
汇编语言CSDSSS还有一个ES定义如下 CSCode Segment代码段寄存器 DSData Segment数据段寄存器 SSStack Segment堆栈段寄存器 ESExtra Segment附加段寄存器。 当一个程序要执行时就要决定程序代码、数据和堆栈各要用到内存的哪些位置通过设定段寄存器 CSDSSS 来指向这些起始位置。通常是将DS固定而根据需要修改CS。 一、寄存器位置不同 1、CS代码段寄存器 2、DS数据段寄存器 3、SS堆栈段寄存器。 二、存放位置不同 1、代码段寄存器CS存放当前正在运行的程序代码所在段的段基值。 2、数据段寄存器DS存放数据段的段基值。 3、堆栈段寄存器SS存放堆栈段的段基值。 三、段地址不同 1、cs代码段地址联合ip作为cpu指向当前正在执行的那条指令所使用不能随意修改它。 2、ss堆栈度段地址问联合sp定义一个答堆栈一旦你确定了堆栈地址ss也不能随便改变了。 3、ds数据段地址定义一个数据段。 ################################################################################################################# byte8位无符号整数b表字节 sbyte8位有符号整数s表有符号 word16位无符号整数 sword16位有符号整数 dword32位无符号整数d表双字 sdword32位有符号整数sd表有符号双字 qword64位整数q表四字 tbyte80位(10字节)整数t表10字节 伪指令 DB8位整数 DW16位整数 DD32位整数或实数 DQ64位整数或实数 DT定义80位(10字节)整数 ################################################################################################################# 入栈和出栈的汇编指令 push、pop 地址从高到低 PUSHPush onto the stack进栈 POPPop 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。同样的关系也存在于EAXEBXECXEDX寄存器
乘除指令默认利用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奇偶标志