GNU ARM汇编--(二)汇编编译链接与运行
GNU的匯編器是GNU Tools的一部分,可以用來(lái)ARM的匯編語(yǔ)言源代碼編譯為二進(jìn)制文件.關(guān)于GNU匯編器的介紹可以搜索《GNU Assembler Manual》.這里我們只是做一個(gè)簡(jiǎn)短的介紹,對(duì)GNU匯編器有一個(gè)大概的認(rèn)識(shí),同時(shí)通過兩個(gè)例子了解一下GNU ARM匯編.
? ? ?給出一個(gè)模板文件:
?
[cpp]?view plaincopyprint?? ? ? 匯編器的使用:
?
? ? ? 一種匯編器是arm-elf-as,一種是arm-linux-as之類的,這兩種匯編器是有細(xì)微區(qū)別.但是一般做開發(fā),半導(dǎo)體廠商都會(huì)提供特定的編譯器,用那個(gè)編譯器應(yīng)該是沒錯(cuò)的,而且優(yōu)化效果應(yīng)該是最優(yōu)的,畢竟是芯片公司提供的嘛.他們對(duì)體系架構(gòu)最了解,很清楚的知道怎么去優(yōu)化.而我們一般的開發(fā)者也可以了解處理器的體系架構(gòu)和嵌入式系統(tǒng)的系統(tǒng)的特征來(lái)對(duì)匯編代碼和c代碼做優(yōu)化.
? ? ? 編譯過程:
? ? ? arm-elf-as -marm7tdmi --gdwarf2 -o filename.o filename.s
? ? ? -marm7tdmi是指定CPU,arm7tdmi是屬于ARMv4T的,一般來(lái)說(shuō)同是ARMv4T應(yīng)該是兼容的.
? ? ? --gdwarf2是表示包含debug信息.
? ? ? 鏈接過程:
? ? ? arm-elf-ld -o filename.elf filename.o
? ? ? 和UNIX系統(tǒng)編程一樣,我們可以根據(jù)上面的步驟寫makefile,然后make一下.
? ? ? 具體ARM的指令集,偽指令就不寫了,資料很多.
? ? ? 下面舉兩個(gè)ARM匯編的實(shí)例,一個(gè)是裸機(jī)下的蜂鳴器(簡(jiǎn)單的控制GPIO而已,比流水燈還簡(jiǎn)單),一個(gè)是ARM linux下的"hello world"(利用系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的).
? ? ? ?蜂鳴器的例子如下:
? ? ? ?beep.lds ?beep.S ?Makefile ?start.S
? ? ? start.S:
?
[cpp]?view plaincopyprint?
? ? ? beep.S
?
?
[cpp]?view plaincopyprint?
? ? ? beep.lds
? ? ? ?makefile:
?
?
[cpp]?view plaincopyprint?
? ? ? ? 編譯后將beep.bin文件燒寫到dram中,就可以聽到聲音了.雖然可以運(yùn)行了,但還是有兩個(gè)疑問:
?
? ? ? ? 1.lds編譯鏈接文件的寫法和技巧 ? ?//后續(xù)要繼續(xù)追
? ? ? ? 2.elf文件的格式 ? ? ? ?//elf格式是比較新的可執(zhí)行文件格式,目前在很多OS上都是用這種格式.這個(gè)格式可以在有操作系統(tǒng)的情況下直接運(yùn)行,但是對(duì)于裸機(jī)的情況,必須對(duì)elf文件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?做objcopy處理 ? ? ? ?后續(xù)也要繼續(xù)追
?
? ? ? ? hello world的例子如下:
? ? ? ? helloworld.S:
?
[cpp]?view plaincopyprint?
? ? ? ?makefile:
?
?
[cpp]?view plaincopyprint?
? ? ? ? 將elf文件放到跑有l(wèi)inux的arm板子中,運(yùn)行就輸出hello world.也可以在ubuntu中qemu-arm helloworld模擬.
?
? ? ? ? 對(duì)比x86下同樣用系統(tǒng)調(diào)用來(lái)輸出hello world的程序:
?
[cpp]?view plaincopyprint?
? ? ? ? ? ?它們有幾點(diǎn)不同:
?
? ? ? ? ? ? 1.arm是用swi指令來(lái)進(jìn)行軟中斷,陷入內(nèi)核態(tài)來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用的.而x86是用int $0x80
? ? ? ? ? ? 2.x86的系統(tǒng)調(diào)用號(hào)是用eax寄存器表示的,是第一個(gè)參數(shù).而arm的swi直接帶有系統(tǒng)調(diào)用號(hào),0x900004是0x900000+4,其中0x900000是base.
?
? ? ? ? ? ? 根據(jù)google,做了上面的總結(jié),對(duì)GNU ARM匯編有了認(rèn)識(shí),并且對(duì)系統(tǒng)調(diào)用軟中斷,中斷處理,uboot異常向量表等等有了探究的欲望,也對(duì)elf格式和編譯鏈接有了興趣,根據(jù)自己的方向和精力,后續(xù)對(duì)這些內(nèi)容做一個(gè)或深或淺的學(xué)習(xí).
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?轉(zhuǎn)載于:blog.csdn.net/dndxhej
轉(zhuǎn)載于:https://www.cnblogs.com/Daniel-G/archive/2012/10/15/2725057.html
總結(jié)
以上是生活随笔為你收集整理的GNU ARM汇编--(二)汇编编译链接与运行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Effective C#》读书笔记——
- 下一篇: 开发和使用Web用户控件