[分享]從C語言到匯編,從匯編到C語言

電腦雜談  發布時間:2020-01-29 05:05:09  來源:網絡整理

匯編語言和c語言哪個難_c語言嵌入匯編_c語言對應匯編語句

帖子:145

-->

需要老大鑒定下貼子質量,呵

帖子:672

-->

@@:

inc eax

cmp dword pr [eax],12345678h

jne @B

這叫什么循環

帖子:202

-->

VC++的反匯編

帖子:103

-->

[QUOTE=fixfix;627937]@@:

inc eax

cmp dword pr [eax],12345678h

jne @B

這叫什么循環[/QUOTE]

這是一個空循環,在一些程序中拿來進行簡單的“延時”;

unsigned i = 0;

while( i++ != 0x12345678 );// 空循環

帖子:28

-->

學習,謝謝?。。。。。。。。。。。。。?!1

帖子:672

-->

c語言嵌入匯編_c語言對應匯編語句_匯編語言和c語言哪個難

我不贊同你的 延時 說法

我用來搜索特征碼的

就叫他做 調試后的極端循環吧

你寫的 while(i<0x12345678)

也不是我寫的代碼while寫法

.while (dword ptr [eax]!=12345678h)

inc eax

.endw

帖子:103

-->

為了知識的完整性c語言對應匯編語句,這里補充一下C語言里的分支語句

二、分支語句

1、if-else 語句

為了觀察其匯編語句,下面是一個簡單的if判斷結構:

if(a>0 && a<10)

{

printf("a>0");

}

else if( a>10 && a<100)

{

printf("a>10 && a<100");

}

else

{

printf("a>10 && a<100");

}

if 判斷都是使用cmp再加上條件跳轉指令。對于if( A && B)的狀況c語言對應匯編語句,一般都是使用否決法。如果A不成立,立刻跳下一個分支。依次,如果 B 不成立,同樣跳下一分支。

cmp 條件

jle 下一個分支

所以開始部分的反匯編為:

if(a>0 && a<10)

00411A66cmp dword ptr [c],0

00411A6Ajle 411A81h ; 跳下一個else if的判斷點

00411A6Ccmp dword ptr [c],0Ah

00411A70jge 411A81h ; 跳下一個else if的判斷點

{

printf("a>0");

00411A72push offset string "a>0" (4240DCh)

匯編語言和c語言哪個難_c語言對應匯編語句_c語言嵌入匯編

00411A77call @ILT+1300(_printf) (411519h)

00411A7Cadd esp,4

}

else if 的跟 else 的特征是,開始都有一條無條件跳轉至判斷結束處,阻止中間的分支執行結束后,直接開啟這個分支。這個分支可執行至的惟一方法也是,前面的判定條件不滿足。

else 則在jmp之后直接執行操作。而else if則開始重復if之后的操作,用cmp比較,然后用條件跳轉指令時行跳轉。

else if( a>10 && a<100)

00411A7Fjmp 411AA9h ;直接跳至判斷塊外

00411A81cmp dword ptr [c],0Ah ;比較+條件跳轉,目標為下一個分支處

00411A85jle 411A9Ch

00411A87cmp dword ptr [c],64h

00411A8Bjge 411A9Ch

{

printf("a>10 && a<100");

00411A8Dpush offset string "a>10 && a<100" (424288h)

00411A92call @ILT+1300(_printf) (411519h)

00411A97add esp,4

}

else

00411A9Ajmp 411AA9h ;這里是else,所以唯有簡單的一條跳轉。

{

printf("a>10 && a<100");

00411A9Cpush offset string "a>10 && a<100" (424288h)

00411AA1call @ILT+1300(_printf) (411519h)

00411AA6add esp,4

}

return c;

2、switch-case 語句

switch 的特征是有多個判定。因為 swtich 顯然不用判斷大于小于,所以都是je(因此,C語言中switch語句不支持float類別的數組),分別跳至每個case處。最后一個是無條件跳轉,直接跳至default處。以下的代碼:

switch(a)

{

case 0:

printf("a>0");

case 1:

{

printf("a>10 && a<100");

break;

}

default:

printf("a>10 && a<100");

}

匯編語言和c語言哪個難_c語言嵌入匯編_c語言對應匯編語句

反匯編的switch(a)

00411A66mov eax,dword ptr [a]

00411A69mov dword ptr [ebp-0E8h],eax

00411A6Fcmp dword ptr [ebp-0E8h],0// case 0:

00411A76je 411A83h

00411A78cmp dword ptr [ebp-0E8h],1// case 1:

00411A7Fje 411A90h

00411A81jmp 411A9Fh// default:

{

顯然是非常a 是否是0、1這兩個數字。匯編指令先把a移動至[ebp-0E8h]這個地址,然后再非常,這是調試版本編譯的特征??赡苁菫榱吮苊庵苯硬僮鞫褩6斐啥褩F茐??最后一條直接跳轉到default處。當然,如果沒有default,就會跳到swtich{}之外。

從此處我們可以看到:switch語句里,完成“比較判斷”的指令會與“case”指令的兩個別,在匯編中,不是按照C語句逐句翻譯的,而是分開為兩個指令模塊來推動的!

case 0:

printf("a>0");

00411A83push offset string "a>0"(4240DCh)

00411A88call @ILT+1300(_printf) (411519h)

00411A8Dadd esp,4

case 1:

{

printf("a>10 && a<100");

00411A90push offset string "a>10 && a<100" (424288h)

00411A95call @ILT+1300(_printf) (411519h)

00411A9Aadd esp,4

break;

00411A9Djmp myfunction+8Ch (411AACh)

}

default:

printf("a>10 && a<100");

00411A9Fpush offset string "a>10 && c<100" (424288h)

00411AA4call @ILT+1300(_printf) (411519h)

00411AA9add esp,4

}

至于case 和 default分支中,如果有break,則會降低一個無條件跳轉匯編指令。若沒有break,則就沒有任何循環控制代碼。

小結:如果在反匯編代碼中看到連續多個“比較cmp”和“相等跳轉je”就會使人聯想到“switch”語句了!

帖子:64

-->

學習了 比較容易看懂 (*^__^*) 嘻嘻……

c語言嵌入匯編_匯編語言和c語言哪個難_c語言對應匯編語句

帖子:3622

-->

支持一下,不過終于有不少人做過這種的工作了,當然我不是不鼓勵這種的文章,而是期望可以不同的角度以及不同的方法表達,方便不同性格的人學習才是重要的

帖子:1020

-->

我來說說笨笨.....

支持一下笨笨的逆向分析教程

帖子:36

-->

貌似在某本書上發現過

帖子:650

-->

這篇文章我喜歡 簡約而又不簡潔 希望樓主今后多發幾篇這樣的預測

帖子:650

-->

有了這個原理 就可以IDA 的 F5了 O(∩_∩)O~

帖子:32

-->

很踏實的學習

帖子:57

-->

sunnytown2009-5-31 14:52

學習了,受教

帖子:234

-->

林郎君2009-5-31 15:25


本文來自電腦雜談,轉載請注明本文網址:
http://www.gefhbj.live/a/jisuanjixue/article-138786-1.html

    相關閱讀
    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    少林宝藏100在线客服 秒速飞艇6码公式口诀 广西麻将手机版免费下载 单机四人麻将免费版 2020年私募基金新规 贵阳捉鸡麻将高手经 重庆麻将下载手机版 贵州11选5基本走 山西11选5前三直选遗漏 上证指数5年走势图 山西体彩11手机版 中国股票交易规则 山西快乐十分今日开 25选7中奖号 极速快三是不是人为控制的 中国竞彩网500比分直播 股票价值最大化