GNU ARM匯編--(二)匯編編譯鏈接與運行
[cpp]view plaincopy
- CROSS=arm-linux-
- CFLAGS=-nostdlib
- beep.bin:start.Sbeep.S
- ${CROSS}gcc$(CFLAGS)-c-ostart.ostart.S
- ${CROSS}gcc$(CFLAGS)-c-obeep.obeep.S
- ${CROSS}ld-Tbeep.ldsstart.obeep.o-obeep.elf
- ${CROSS}objcopy-Obinary-Sbeep.elfbeep.bin
- rm-f*.o
- clean:
- rm-f*.elf*.o
- rm-fbeep.bin
編譯后將beep.bin文件燒寫到dram中,就可以聽到聲音了.雖然可以運行了,但還是有兩個疑問:
1.lds編譯鏈接文件的寫法和技巧 //后續(xù)要繼續(xù)追
2.elf文件的格式 //elf格式是比較新的可執(zhí)行文件格式,目前在很多OS上都是用這種格式.這個格式可以在有操作系統(tǒng)的情況下直接運行,但是對于裸機的情況,必須對elf文件 做objcopy處理 后續(xù)也要繼續(xù)追
hello world的例子如下:
helloworld.S:
[cpp]view plaincopy
- .data
- msg:.asciz"hello,world"
- .text
- .align2
- .global_start
- _start:
- ldrr1,=msg@address
- movr0,#1@stdout
- movr2,#13@length
- swi#0x900004@sys_write
- movr0,#0
- swi#0x900001@sys_exit
- .align2
makefile:
[cpp]view plaincopy
- all:
- arm-linux-ashelloworld.S-ohelloworld.o
- arm-linux-ldhelloworld.o-ohelloworld
將elf文件放到跑有l(wèi)inux的arm板子中,運行就輸出hello world.也可以在ubuntu中qemu-arm helloworld模擬.
對比x86下同樣用系統(tǒng)調(diào)用來輸出hello world的程序:
[cpp]view plaincopy
- .data
- msg:.string"hello"
- len=.-msg
- .text
- .global_start
- _start:
- nop
- movl$len,%edx
- movl$msg,%ecx
- movl$1,%ebx
- movl$4,%eax
- int$0x80
- movl$0,%ebx
- movl$1,%eax
- int$0x80
它們有幾點不同:
1.arm是用swi指令來進行軟中斷,陷入內(nèi)核態(tài)來實現(xiàn)系統(tǒng)調(diào)用的.而x86是用int $0x80
2.x86的系統(tǒng)調(diào)用號是用eax寄存器表示的,是第一個參數(shù).而arm的swi直接帶有系統(tǒng)調(diào)用號,0x900004是0x900000+4,其中0x900000是base.
根據(jù)google,做了上面的總結(jié),對GNU ARM匯編有了認識,并且對系統(tǒng)調(diào)用軟中斷,中斷處理,uboot異常向量表等等有了探究的欲望,也對elf格式和編譯鏈接有了興趣,根據(jù)自己的方向和精力,后續(xù)對這些內(nèi)容做一個或深或淺的學習.
評論