來(lái)分析一下c語(yǔ)言if語(yǔ)句
直接上代碼
#include<stdio.h>
int main()
{
int j = 5;
int k = 6;
if (j > k)
{
printf("j>k");
}
return 0;
}
下面是對(duì)應(yīng)的匯編代碼忌警,匯編代碼是從vs2013上面復(fù)制的
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
先來(lái)分析一下變量j和變量k:
由于變量j和變量k是局部變量所以編譯器是不給它們分配地址的
而是把它們的值存到臨時(shí)申請(qǐng)椗彝粒空間里.棧嘛 函數(shù)調(diào)用完了就會(huì)釋放掉的
看 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則不執(zhí)行方括號(hào)內(nèi)的代碼
如果這條代碼的條件成立則跳到xor eax,eax 這條代碼執(zhí)行
否則
就執(zhí)行方括號(hào)里面的代碼
這段匯編函數(shù)關(guān)系不大 所以跳過(guò)
00AC3094 mov esi,esp
00AC3096 push 0AC7878h
00AC309B call dword ptr ds:[00ACB030h]
00AC30A1 add esp,4
00AC30A4 cmp esi,esp
00AC30A6 call 00AC1163