一段完整的arm匯編語言 匯編語言有幾種版本?
匯編語言有幾種版本?x86匯編8086匯編ATampT匯編Intel匯編ARM匯編在ARM匯編程序如何實現子程序的返回?子程序進入到時,直接返回地址保存在LR寄存器中,返回有兩種做法:將LR然后賦給P
匯編語言有幾種版本?
x86匯編
8086匯編
ATampT匯編
Intel匯編
ARM匯編
在ARM匯編程序如何實現子程序的返回?
子程序進入到時,直接返回地址保存在LR寄存器中,返回有兩種做法:
將LR然后賦給PC:MOVPC,LR
直接跳轉:BXLR
要想精通C語言,必須先學習匯編嗎?
雖然說匯編是一門單獨的的語言,C也一門單獨的的語言,它們看上去并沒有什么聯系,但是學習匯編這個可以幫助我們分析什么C語言程序的設計原理。要想精通C語言,需要先自學匯編才是正確的學習順序。
舉例說明:【“Hello World!”程序使用匯編表現】
建議使用“Hello World!”程序詳細介紹,如圖3-5-1所示。
圖3-5-1中,我們只看見了C語言代碼,并沒有什么看見了匯編,我們該咋查看呢?在VisualC開發(fā)工具中,反匯編窗口,不需要下斷點、按F7編譯、按F5調試運行才能可以切換到反匯編窗口。該如何下斷點哪?選中后“intmain(void)”這一行按F9,會在這一行代碼前出現一個黃色的圓點,只能說明巳經斷下斷點,有圖3-5-2所示。【注:按F9下斷點只是在VisualC開發(fā)工具中不使用】
按F9下斷點后,我們隨即按F7,讓程序編譯,程序實際編譯后再按F5現場調試,會再次出現如圖3-5-3所示。
出現圖3-5-3的界面之后,我們然后點擊鼠標左鍵,又出現如圖3-5-4界面。
中,選擇Go ToDisassembly,會出現如圖3-5-5的界面,說明成功可以切換到反匯編窗口,按F10一步一步地想執(zhí)行。
下面的圖片3-5-5中,有追加代碼示例:
以上是一個求完整的函數調用,都是“Hello World!”程序的運行原理。
我們也也可以在C語言程序中合成一體匯編,我們一般稱內聯匯編。接下來的介紹內聯匯編。
3.5.2【內聯匯編】
內聯匯編格式:
__asm
{
}
我們在里面添加一些代碼:
#includeltstdio.hgt
intmain(void)
{
__asm
{
moveax,eax
movecx,eax
movedx,ecx
}
return0
}
我們在VisualC中輸入代碼示例CH03_5_1,如圖3-5-6所示。
在main函數前下斷點,我們切換到到反匯編窗口打開系統(tǒng),如圖3-6-7所示。
圖3-6-7中的C語言代碼和匯編代碼追加:
1:#includeltstdio.hgt
2:intmain(void)
3:{
00401010pushebp
00401011movebp,esp
00401013subesp,40h
00401016pushebx
00401017pushesi
00401018pushedi
00401019leaedi,[ebp-40h]
0040101Cmovecx,10h
00401021moveax,0CCCCCCCCh
00401026repstosdwordptr[edi]
4:__asm
5:{
6:moveax,eax
00401028moveax,eax
7:movecx,eax
0040102Amovecx,eax
8:movedx,ecx
0040102Cmovedx,ecx
9:}
10:return0
0040102Exoreax,eax
11:}
00401030popedi
00401031popesi
00401032popebx
00401033addesp,40h
00401036cmpebp,esp
00401038call__chkesp(00401050)
0040103Dmovesp,ebp
0040103Fpopebp
00401040ret
總結“Hello World!”程序總共只寫了9行代碼,而編譯器批量生成了很多匯編指令,同樣“CH03_5_1”中的程序也只有一短短的11行代碼,編譯器也自動導入了很多匯編指令,畢竟匯編指令是可以讓我們明白自己寫的程序運行過程的原理,可是沒有C語言更比較直觀的可以體現出我們是想的結果。簡單說來,匯編語言更妄想于詳細解釋程序啟動的過程,C語言更被害妄想于具體解釋結果。
如果沒有我們把程序運行的過程弄清,這樣當然能結論出程序的結果,反之,如果只清楚程序的結果并到底程序運行中是整樣一步步利用的,那只能說我們并沒有什么完全的學會了C語言。所以我這那是我們課程為啥學習匯編,我想知道為什么把匯編放進C語言之前講的原因。
肯定這只不過在下一己之見,希望能大家一起來討論。