環境:vc++
do while 會先執行do裡面的迴圈體,執行完去執行while的條件判斷,如果為真,繼續執行do裡面的迴圈體,如果為假,則結束迴圈
c程式:
上面先執行sum+=i;i++;
,接著執行i<=100
,如果為true,則繼續執行do迴圈,否則,結束迴圈。
反彙編:
5
: int i=
1,sum=0;
00401028 c7 45 fc 01
0000
00 mov dword ptr [ebp-4]
,10040102f c7 45 f8 00
0000
00 mov dword ptr [ebp-8]
,06:
dowhile
(i<=
100)
;00401048
837d fc 64 cmp dword ptr [ebp-4]
,64h
0040104c 7e e8 jle main+
26h (
00401036)10
:printf
("sum=%d\n"
,sum)
;0040104e 8b 55 f8 mov edx,dword ptr [ebp-8]
00401051
52 push edx
00401052
681c 20
4200 push offset string "sum=%d\n"
(0042201c)
00401057 e8 34
0000
00 call printf (
00401090
)0040105c 83 c4 08 add esp,811
:return0;
0040105f 33 c0 xor eax,eax12:
}
從上面的程式我們可以看出,sum+=i就是
00401036
8b 45 f8 mov eax,dword ptr [ebp-8]
00401039
0345 fc add eax,dword ptr [ebp-4]
0040103c 89
45 f8 mov dword ptr [ebp-8]
,eax
i++就是:
0040103f 8b 4d fc mov ecx,dword ptr [ebp-4]
00401042
83 c1 01 add ecx,
100401045
894d fc mov dword ptr [ebp-4]
,ecx
彙編執行完這幾條語句,就去執行
00401048
837d fc 64 cmp dword ptr [ebp-4]
,64h
0040104c 7e e8 jle main+
26h (
00401036
)
比較[ebp-4]和100的大小,如果小於等於就跳轉到00401036執行,否則往下執行,相當於c中i<=100,如果小於等於,繼續執行迴圈體,否則結束
c和混編混合程式設計:
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...
C 彙編的混合程式設計
aptcs arm thumb 程式呼叫規範 pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程 函式 呼叫者與被呼叫者之間的協議。協議規定 呼叫函式如何傳遞引數 即壓棧方法,以何種方式存放引數 被呼叫函式 如何獲取引數,以何種方式傳遞函式返...
ARM彙編和C混合程式設計 筆記
arm復位啟動先執行彙編指令,完成硬體的初始化 為什麼不用c語言?因為c語言無法訪問arm內部的暫存器,例如棧,所以需要彙編來進行初始化 c語言能不能跟彙編相互並且反覆呼叫?不能,因為這樣容易導致區域性變數的混用。彙編呼叫c程式 global start start 將gpj2 3 output l...