色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > GNU ARM匯編--(二)匯編編譯鏈接與運(yùn)行

          GNU ARM匯編--(二)匯編編譯鏈接與運(yùn)行

          作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏

          [cpp]view plaincopy
          1. CROSS=arm-linux-
          2. CFLAGS=-nostdlib
          3. beep.bin:start.Sbeep.S
          4. ${CROSS}gcc$(CFLAGS)-c-ostart.ostart.S
          5. ${CROSS}gcc$(CFLAGS)-c-obeep.obeep.S
          6. ${CROSS}ld-Tbeep.ldsstart.obeep.o-obeep.elf
          7. ${CROSS}objcopy-Obinary-Sbeep.elfbeep.bin
          8. rm-f*.o
          9. clean:
          10. rm-f*.elf*.o
          11. rm-fbeep.bin

          編譯后將beep.bin文件燒寫到dram中,就可以聽到聲音了.雖然可以運(yùn)行了,但還是有兩個(gè)疑問:

          1.lds編譯鏈接文件的寫法和技巧 //后續(xù)要繼續(xù)追

          2.elf文件的格式 //elf格式是比較新的可執(zhí)行文件格式,目前在很多OS上都是用這種格式.這個(gè)格式可以在有操作系統(tǒng)的情況下直接運(yùn)行,但是對于裸機(jī)的情況,必須對elf文件 做objcopy處理 后續(xù)也要繼續(xù)追

          hello world的例子如下:

          helloworld.S:

          [cpp]view plaincopy
          1. .data
          2. msg:.asciz"hello,world"
          3. .text
          4. .align2
          5. .global_start
          6. _start:
          7. ldrr1,=msg@address
          8. movr0,#1@stdout
          9. movr2,#13@length
          10. swi#0x900004@sys_write
          11. movr0,#0
          12. swi#0x900001@sys_exit
          13. .align2

          makefile:

          [cpp]view plaincopy
          1. all:
          2. arm-linux-ashelloworld.S-ohelloworld.o
          3. arm-linux-ldhelloworld.o-ohelloworld

          將elf文件放到跑有l(wèi)inux的arm板子中,運(yùn)行就輸出hello world.也可以在ubuntu中qemu-arm helloworld模擬.

          對比x86下同樣用系統(tǒng)調(diào)用來輸出hello world的程序:

          [cpp]view plaincopy
          1. .data
          2. msg:.string"hello"
          3. len=.-msg
          4. .text
          5. .global_start
          6. _start:
          7. nop
          8. movl$len,%edx
          9. movl$msg,%ecx
          10. movl$1,%ebx
          11. movl$4,%eax
          12. int$0x80
          13. movl$0,%ebx
          14. movl$1,%eax
          15. int$0x80

          它們有幾點(diǎn)不同:

          1.arm是用swi指令來進(jìn)行軟中斷,陷入內(nèi)核態(tà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é),對GNU ARM匯編有了認(rèn)識(shí),并且對系統(tǒng)調(diào)用軟中斷,中斷處理,uboot異常向量表等等有了探究的欲望,也對elf格式和編譯鏈接有了興趣,根據(jù)自己的方向和精力,后續(xù)對這些內(nèi)容做一個(gè)或深或淺的學(xué)習(xí).


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉