一段完整的arm匯編語言 匯編語言有幾種版本?
匯編語言有幾種版本?x86匯編8086匯編ATampT匯編Intel匯編ARM匯編在ARM匯編程序如何實(shí)現(xiàn)子程序的返回?子程序進(jìn)入到時,直接返回地址保存在LR寄存器中,返回有兩種做法:將LR然后賦給P
匯編語言有幾種版本?
x86匯編
8086匯編
ATampT匯編
Intel匯編
ARM匯編
在ARM匯編程序如何實(shí)現(xiàn)子程序的返回?
子程序進(jìn)入到時,直接返回地址保存在LR寄存器中,返回有兩種做法:
將LR然后賦給PC:MOVPC,LR
直接跳轉(zhuǎn):BXLR
要想精通C語言,必須先學(xué)習(xí)匯編嗎?
雖然說匯編是一門單獨(dú)的的語言,C也一門單獨(dú)的的語言,它們看上去并沒有什么聯(lián)系,但是學(xué)習(xí)匯編這個可以幫助我們分析什么C語言程序的設(shè)計原理。要想精通C語言,需要先自學(xué)匯編才是正確的學(xué)習(xí)順序。
舉例說明:【“Hello World!”程序使用匯編表現(xiàn)】
建議使用“Hello World!”程序詳細(xì)介紹,如圖3-5-1所示。
圖3-5-1中,我們只看見了C語言代碼,并沒有什么看見了匯編,我們該咋查看呢?在VisualC開發(fā)工具中,反匯編窗口,不需要下斷點(diǎn)、按F7編譯、按F5調(diào)試運(yùn)行才能可以切換到反匯編窗口。該如何下斷點(diǎn)哪?選中后“intmain(void)”這一行按F9,會在這一行代碼前出現(xiàn)一個黃色的圓點(diǎn),只能說明巳經(jīng)斷下斷點(diǎn),有圖3-5-2所示。【注:按F9下斷點(diǎn)只是在VisualC開發(fā)工具中不使用】
按F9下斷點(diǎn)后,我們隨即按F7,讓程序編譯,程序?qū)嶋H編譯后再按F5現(xiàn)場調(diào)試,會再次出現(xiàn)如圖3-5-3所示。
出現(xiàn)圖3-5-3的界面之后,我們?nèi)缓簏c(diǎn)擊鼠標(biāo)左鍵,又出現(xiàn)如圖3-5-4界面。
中,選擇Go ToDisassembly,會出現(xiàn)如圖3-5-5的界面,說明成功可以切換到反匯編窗口,按F10一步一步地想執(zhí)行。
下面的圖片3-5-5中,有追加代碼示例:
以上是一個求完整的函數(shù)調(diào)用,都是“Hello World!”程序的運(yùn)行原理。
我們也也可以在C語言程序中合成一體匯編,我們一般稱內(nèi)聯(lián)匯編。接下來的介紹內(nèi)聯(lián)匯編。
3.5.2【內(nèi)聯(lián)匯編】
內(nèi)聯(lián)匯編格式:
__asm
{
}
我們在里面添加一些代碼:
#includeltstdio.hgt
intmain(void)
{
__asm
{
moveax,eax
movecx,eax
movedx,ecx
}
return0
}
我們在VisualC中輸入代碼示例CH03_5_1,如圖3-5-6所示。
在main函數(shù)前下斷點(diǎn),我們切換到到反匯編窗口打開系統(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
總結(jié)“Hello World!”程序總共只寫了9行代碼,而編譯器批量生成了很多匯編指令,同樣“CH03_5_1”中的程序也只有一短短的11行代碼,編譯器也自動導(dǎo)入了很多匯編指令,畢竟匯編指令是可以讓我們明白自己寫的程序運(yùn)行過程的原理,可是沒有C語言更比較直觀的可以體現(xiàn)出我們是想的結(jié)果。簡單說來,匯編語言更妄想于詳細(xì)解釋程序啟動的過程,C語言更被害妄想于具體解釋結(jié)果。
如果沒有我們把程序運(yùn)行的過程弄清,這樣當(dāng)然能結(jié)論出程序的結(jié)果,反之,如果只清楚程序的結(jié)果并到底程序運(yùn)行中是整樣一步步利用的,那只能說我們并沒有什么完全的學(xué)會了C語言。所以我這那是我們課程為啥學(xué)習(xí)匯編,我想知道為什么把匯編放進(jìn)C語言之前講的原因。
肯定這只不過在下一己之見,希望能大家一起來討論。