<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > GNU ARM匯編--(二)匯編編譯鏈接與運行

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

作者: 時(shí)間:2016-11-26 來(lái)源:網(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文件燒寫(xiě)到dram中,就可以聽(tīng)到聲音了.雖然可以運行了,但還是有兩個(gè)疑問(wèn):

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

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

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文件放到跑有linux的arm板子中,運行就輸出hello world.也可以在ubuntu中qemu-arm helloworld模擬.

對比x86下同樣用系統調用來(lái)輸出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指令來(lái)進(jìn)行軟中斷,陷入內核態(tài)來(lái)實(shí)現系統調用的.而x86是用int $0x80

2.x86的系統調用號是用eax寄存器表示的,是第一個(gè)參數.而arm的swi直接帶有系統調用號,0x900004是0x900000+4,其中0x900000是base.

根據google,做了上面的總結,對GNU ARM匯編有了認識,并且對系統調用軟中斷,中斷處理,uboot異常向量表等等有了探究的欲望,也對elf格式和編譯鏈接有了興趣,根據自己的方向和精力,后續對這些內容做一個(gè)或深或淺的學(xué)習.


上一頁(yè) 1 2 下一頁(yè)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>