汇编 sub减法指令 比较指令CMP JZ条件跳转指令
二、SUB指令 减法指令SUB (SUBtract) 格式: SUB A,B //A=A-B; 功能: 两个操作数的相减,即从A中减去B,其结果放在A中.
二、CMP 和JZ 指令 比较指令CMP 格式: CMP A,B // A-B; 功能: 两个操作数的相减,即从A中减去B,其结果会影响标志位, 对标志位的影响与SUB指令相同。本条指令主要是用于配合条件转移指令使用。如JZ ZF=0时,跳转 条件转移指令 JE/JZ 格式: JE/JZ标号 //等于跳转 功能: ZF=1,转到指定地址执行 说明: 1. 指令JE与JZ等价,它们是根据标志位ZF进行转移的指令 2. JE,JZ均为一条指令的两种助记符表示方法 printf("begin\n"); int a=3; if (a!=3) { printf("do code\n"); } printf("end");
条件跳转指令
二、 不等于转移指令 JNE/JNZ (等于JE/JZ) 1、 JNE/JNZ功能 条件转移指令JNE/JNZ //不等于转移 格式: JNE/JNZ 标号 功能: ZF=0,转至标号地址处执行 2、代码测试 printf("begin\n"); int a=4; //if (a==3) //ZF=0 //{ // printf("未跳转ZF==1\n"); //} //printf("ZF==0跳转\n"); __asm { mov eax,3 sub eax,a //3-4 jz end; //ZF=1 } printf("未跳转\n"); end: printf("跳转\n"); printf("end\n"); getchar(); 00401004 |. 68 F4204000 PUSH JNE_JNZ.004020F4 ; /format = "begin\n" 00401009 |. FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf 0040100F |. 83C4 04 ADD ESP,4 00401012 |. C745 FC 04000>MOV DWORD PTR SS:[EBP-4],4 ; a=4 00401019 |. B8 03000000 MOV EAX,3 ; eax=3 0040101E |. 2B45 FC SUB EAX,DWORD PTR SS:[EBP-4] ; 3-4 cmp eax,[ebp-4] 00401021 |. 74 0E JE SHORT JNE_JNZ.00401031 00401023 |. 68 FC204000 PUSH JNE_JNZ.004020FC ; /format = "未跳转" 00401028 |. FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf 0040102E |. 83C4 04 ADD ESP,4 00401031 |> 68 04214000 PUSH JNE_JNZ.00402104 ; /format = "跳转" 00401036 |. FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf 0040103C |. 83C4 04 ADD ESP,4 0040103F |. 68 0C214000 PUSH JNE_JNZ.0040210C ; /format = "end\n" 00401044 |. FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf 0040104A |. 83C4 04 ADD ESP,4 0040104D |. FF15 9C204000 CALL DWORD PTR DS:[<&MSVCR90.getchar>] ; MSVCR90.getchar
一、GOTO与JMP 无条件跳转指令 格式: JMP A 1. 其中A为转移的目的地址。程序转移到目的地址所指向的指令继续往下执行。 // JZ/JE JNZ/JNE 都需要一个条件,条件成立才跳转,而jmp不需要。 2. 本组指令对标志位无影响. 3、代码测试 //goto jmp printf("begin\n"); goto end; printf("do this"); end: printf("end\n"); getchar(); 二、优化后的指令 /0d 禁用优化 /01 最小化大小 /02 最大化速度 /0x 完全优化
一、指令格式 条件转移指令 JL/JNGE 格式: JL/JNGE 标号地址 功能: 小于/不大于等于时转移 标号地址 JNGE 有符号 不大于等于 则跳转 //Jump if Not Greater or Equal JL 有符号 小于 则跳转 //Jump if Less SF=1; 符号标志位为1 则跳转到标号地址执行 二、代码测试 printf("begin\n"); //>= int a=0xA; int b=0x20; //if (a>=b) //jl //{ // printf("do this"); //} __asm { mov ebx,b sub a,ebx jnge end mov ebx,ebx jl end } //< end: printf("end\n");
一、指令格式 条件转移指令 JLE/JNG 格式: JLE/JNG 标号地址 功能: 小于等于/不大于 时转到标号地址 JNG 有符号 不大于 则跳转 //Jump if Not Greater JLE 有符号 小于等于 则跳转 //Jump if Less or Equal SF=1,ZF=1,OF=1 //其中一个或者多个为1 则跳转 二、代码测试 { printf("begin\n"); int a=3; int b=5; if (a>b) //JLE/JNG 小于等于/不大于时转移 { printf("do this"); } //JNG 不大于 printf("end;\n"); return 0; }
一、指令格式 JG/JNLE 标号地址 //不<= //大于 > // ZF=0 && SF=0 && OF=0 JGE/JNL 标号地址 //不< //大于等于 >= JG : Jump if Greater // > 跳 JNLE:Jump if Not Less or Equal //不<= 跳 JGE :Jump if Greater or Equal // >= 跳 JNL: Jump if Not Less //不< 跳 二、代码测试 printf("begin\n"); int a=4; //if (a<=3) //if (!(a>3)) // //{ // printf("小于等于"); //}//大于时跳转//不小于等于跳转 __asm { cmp a,3 JNLE end //JG end } printf("do this\n"); printf("小于等于"); end: printf("end"); return 0;
PWS 寄存器
CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。 ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0。 SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。 OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0 PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0 AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0 另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。 TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。 IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。 DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。 OD里能查看到 除IF标志外的 8个标志位
总结
无符号 条件转移指令