来分析一下c语言if语句
直接上代码
#include<stdio.h>
int main()
{
int j = 5;
int k = 6;
if (j > k)
{
printf("j>k");
}
return 0;
}
下面是对应的汇编代码,汇编代码是从vs2013上面复制的
00AC307E mov dword ptr [ebp-8],5
00AC3085 mov dword ptr [ebp-14h],6
00AC308C mov eax,dword ptr [ebp-8]
00AC308F cmp eax,dword ptr [ebp-14h]
00AC3092 jle 00AC30AB
00AC3094 mov esi,esp
00AC3096 push 0AC7878h
00AC309B call dword ptr ds:[00ACB030h]
00AC30A1 add esp,4
00AC30A4 cmp esi,esp
00AC30A6 call 00AC1163
00AC30AB xor eax,eax
先来分析一下变量j和变量k:
由于变量j和变量k是局部变量所以编译器是不给它们分配地址的
而是把它们的值存到临时申请栈空间里.栈嘛 函数调用完了就会释放掉的
看 5 和 6 一看 就知道是变量j 和变量 k的值 所以我们知道:
00AC307E mov dword ptr [ebp-8],5 //ebp-8就是存放变量j的值
00AC3085 mov dword ptr [ebp-14h],6 //ebp-14h存放变量k的值
00AC308C mov eax,dword ptr [ebp-8] //把变量j放入eax中
00AC308F cmp eax,dword ptr [ebp-14h] //比较变量j和变量k的大小
00AC3092 jle 00AC30AB //如果j小于等于k则不执行方括号内的代码
如果这条代码的条件成立则跳到xor eax,eax 这条代码执行
否则
就执行方括号里面的代码
这段汇编函数关系不大 所以跳过
00AC3094 mov esi,esp
00AC3096 push 0AC7878h
00AC309B call dword ptr ds:[00ACB030h]
00AC30A1 add esp,4
00AC30A4 cmp esi,esp
00AC30A6 call 00AC1163
网友评论