1. 程式人生 > >從彙編看for迴圈

從彙編看for迴圈

從彙編看for迴圈

看看在彙編中for迴圈是怎樣來實現的。

寫一個簡短的C語言程式碼:

int main()

{

int i;

for(i=0;i<10;i++)

{

printf("%d /n",i);

}

return 0;

}

照例在編譯的時候輸出彙編程式碼,如下:

; 3: int i;

; 4: for(i=0;i<10;i++)

i=0

movDWORD PTR _i$[ebp], 0

跳到迴圈的開始

jmpSHORT [email protected]

[email protected]:

i++

moveax, DWORD PTR _i$[ebp]

addeax, 1

movDWORD PTR _i$[ebp], eax

迴圈的起始位置

[email protected]:

以下兩條彙編相當於:

if(i>=10)

{

goto SHORT [email protected];

}

cmpDWORD PTR _i$[ebp], 10; 0000000aH

jgeSHORT [email protected]

; 5: {

; 6: printf("%d /n",i);

movecx, DWORD PTR _i$[ebp]

pushecx

pushOFFSET $SG590

call_printf

addesp, 8

; 7: }

jmpSHORT [email protected]

[email protected]:

整個for迴圈如果再翻譯成C語言,那麼就相當於下面的樣子:

i=0;

loop:

if(i>=0)

{

goto endloop;

}

printf("%d/n",i);

i++;

goto loop;

endloop:

很清楚了,讓人容易搞錯的地方就是會認為“表示式三”比“內嵌語句”先執行,而實際上是內嵌語句先執行,雖然“表示式三”的彙編程式碼在內嵌語句的前面,也在“表示式二”的前面,通過編譯器輸出的彙編程式碼可以得到澄清了。

相關推薦

彙編for迴圈

從彙編看for迴圈 看看在彙編中for迴圈是怎樣來實現的。 寫一個簡短的C語言程式碼: int main() { int i; for(i=0;i<10;i++) { printf("%d /n",i); } return 0; } 照例

原始碼角度for迴圈和foreach的區別

for迴圈和foreach的區別 關於for迴圈和foreach的區別,你真的知道,用了那麼多年使用起來已經很熟悉了,可突然問我講講這兩的區別,一下還真把我給卡住了一下,下面從原始碼的角度簡單分析一

彙編尾遞迴

尾遞迴尾遞迴自然也是一種遞迴的形式,百度百科的定義是:如果一個函式中所有遞迴形式的呼叫都出現在函式的末尾,我們稱這個遞迴函式是尾遞迴的。當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一

彙編c語言函式呼叫

學C語言時,就聽老師說函式呼叫時是通過棧來記錄資訊,又聽說什麼“保留現場”,"恢復現場"一些既聽不懂,也不知道怎麼弄懂的東西。最近正在學習Linux下的彙編,現在就通過一個簡單的例子來展示一下彙編級的函式呼叫,這樣能夠增加大家對C語言的理解。雖然並不是很完善,但是足夠闡明函式

位元組碼Java中for-each迴圈(增強for迴圈)實現原理

下面是的兩個很簡單的類,可以看出它們的功能是一樣的。Java環境使用的是jdk1.8_111。 package iter; public class TestArray { public static void main(String[] args) { //String[] a

Chrome原始碼事件迴圈

我們經常說JS的事件迴圈有微觀佇列和巨集觀佇列,所有的非同步事件都會放到這兩個佇列裡面等待執行,並且微觀任務要先於巨集觀任務執行。實際上事件迴圈是多執行緒的一種工作方式。通常為了提高執行效率會新起一條或多條執行緒進行並行運算,然後算完了就告知結果並退出,但是有時候並不想每次都新起執行緒,而是讓這些執行緒變成常

彙編和底層的角度c和類c語言

從彙編和底層的角度看c和類c語言       寫這篇文章的目的是對近期底層學習的總結,也算是勉勵自己吧,畢竟是光靠興趣苦逼自學不是自己專業的東西要承受很多壓力。 https://blog.csdn.net/jggyyhh/article/details

Linux gcc for 迴圈中 i=i++ 會造成死迴圈問題及 ++i / i++ 彙編分析

在把 Windows 程式移植到 Linux 時遇到了死迴圈,最後定位到了類似這種的語句 for (i = 0; i < 1; i = i++), 別問我是誰寫的,為什麼這麼寫(淚目!)。 根據我自己的感覺, i = i++ 應該等價於 i++(C標準中 i=i++ 的行為未

原始碼Android】03Android MessageQueue訊息迴圈處理機制(epoll實現)

1 enqueueMessage handler傳送一條訊息 mHandler.sendEmptyMessage(1);經過層層呼叫,進入到sendMessageAtTime函式塊,最後呼叫到enqueueMessageHandler.java public bool

彙編視角函式呼叫

C語言函式如下 int bar(int c, int d) { int e = c + d; return e; } int foo(int a, int b) { return bar(a, b); } int main(void

了一則廣告,學會for迴圈~【java】

剛朋友給發了一則出租資訊,看完感覺自己白學了、、、果斷回去再看一遍for()迴圈~ <span style="font-size:18px;">int[] arr = new

用python實現1加到100的三種方法: for迴圈,while迴圈,匯入模組法

第一種是for迴圈 def sumStartToEnd(start,end): sum = 0 for n in range(start,end+1,1): sum

彙編角度c++引用(reference)

  每當提到c++中的引用時,我們的腦海中浮現的第一句話可能就是--引用就是一個變數的別名,但是引用的的型別到底是什麼?它和指標有什麼關係?它本身在記憶體中佔用空間麼?我們的編譯器是如何將它實現的呢?帶著這些疑問,我們今天就從彙編的角度來解析c++中的引用到底是什麼東西?

簡單的雙重for迴圈彙編解釋

#include<stdio.h> void show() { int i,j; for(i=0;i<100;i++){ for(j=2;j<=i;j++){ if(i%j==0) break; }

彙編角度C++類的方法訪問類成員的原理

C++編譯後最終也是生成了機器碼,不需要直譯器或虛擬機器來執行。相比C語言,C++的類大大的方便了程式碼結構的組織,使得構建大程式簡便容易了很多。例項化一個類後,類的成員方法就可以訪問這個類的成員了,那麼從彙編角度看,到底是如何實現的呢?其實這個原理也十分簡單,

Swift 列舉-彙編角度列舉記憶體結構

一、基本使用 先看列舉的幾種使用(暫不要問,看看是否都能看懂,待會會逐一講解) 1、操作一 簡單使用 //第一種方式 enum Direction { case east case west case south case north func testDi

CESPC趨勢:微信房卡二八杠棋牌源碼下載顯示器會更大

不同的 發的 棋牌 華碩 汽車 趨勢 第一次 合作 想要 2017年年末時,微信房卡二八杠棋牌源碼下載( h5.super-mans.com Q:2012035918)微信房卡二八杠棋牌源碼下載,這次合作史無前例。回看歷史,兩家公司爭鋒相對,現在卻握手言和,它們為獨立

天搜科技:618大數據如何助力電商發展

浙江 人工智能 商業 數據平臺 未來 多維 通過 浙江天搜 51cto 一年一度的年中電商大促“6·18”已經落幕,今年6.18依然異常“火爆”,眾多電商平臺紛紛刷新銷量紀錄。但在熱鬧背後,不少電商平臺感受到的是這次618流量大減,更有商家表示自家平臺流量直接減半。在流量大

C for迴圈語句執行順序

發現居然搞不清楚最基礎的東西了,反思。。。   for(表示式1;表示式2;表示式3){迴圈體} 知道其的語句執行順序對我們來說可以避免很多失誤   我們可以利用下面這個小程式輕易測出其內在的語句迴圈順序: #include<stdio.h>

CVPR2013計算機視覺研究的三個趨勢

 申明:本文非筆者原創,原文轉載自:http://www.bfcat.com/index.php/2013/07/compute-visioni-trends/ tombone‘s blog 最近一直在update關於CVPR2013的感受,今天,他在部