andyljn 2020-02-13
选来一段简单的if else语句
#include "stdio.h" int main() { int a = 5; int b = 2; if(a > b) printf("a>b\n"); else printf("a<=b\n"); return 0; }
查看反汇编代码
从汇编语言我们可以大致看出整个代码的执行过程,通过C语言的内嵌汇编我们可以自己用汇编实现if else语句
#include "stdio.h" int main() { int a = 5; int b = 2; /* if(a > b) printf("a>b\n"); else printf("a<=b\n"); */ _asm{ mov eax,a mov ebx,b cmp eax,ebx jle N } printf("a>b\n"); _asm{ jmp end } _asm{ N: } printf("a<=b\n"); _asm{ end: } return 0; }
运行
在这个例子中主要需要用到CMP,JLE,JMP这三个汇编指令
CMP是比较指令,功能:用第二个操作数去减第一个操作数,并根据所得的差设置有关标志位,为随后的条件转移指令提供条件。但并不保存该差,所以,不会改变指令中的操作数。
JLE是条件转移指令的一种,其余含有JZ、JNE等等。条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。
条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令
JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。