我想爲Raspberry Pi B +版本編寫一個非常基本的交叉編譯器來構建簡單的裸機程序。我的編譯器能夠使用ARM指令集數據表將簡單命令翻譯成相應的機器語言指令。ARMv6在裸機編程分支(樹莓派B +)
打開發光二極管(定位自己在烘烤pi當然,http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/)工作正常。
但現在我希望做一些分支指令,而這正是似乎沒有任何工作了:
首先,我想跳轉到絕對addresse,沒有相對分支使用B/BL指令。
要測試一個分支,我使用下面的反彙編代碼(使用料斗拆裝V3測試版拆解),至極開啓與GPIO 16 AND22連接的LED:
00000000 mov r0, #0x20000000 ;Load the GPIO Base Address into R0
00000004 orr r0, r0, #0x200000
00000008 mov r1, #0x40 ;Load the Set Function Mask (for GPIO 22) into r1
0000000c str r1, [r0, #0x8] ;Store the Set Function Mask into the GPFSEL2
00000010 mov r1, #0x400000 ;Move the Set Output Mask (for GPIO 22) into r1
00000014 str r1, [r0, #0x1c] ;Store the Set Output Mask into GPSET0
00000018 mov r0, #0x20000000 ;Load the GPIO Base Address into R0
0000001c orr r0, r0, #0x200000
00000020 mov r1, #0x40000 ;Load the Set Function Mask (for GPIO 16) into r1
00000024 str r1, [r0, #0x4] ;Store the Set Function Mask into the GPFSEL2
00000028 mov r1, #0x10000 ;Move the Set Output Mask (for GPIO 16) into r1
0000002c str r1, [r0, #0x1c] ;Store the Set Output Mask into GPSET0
00000030 b 0x30 ;Infinity Loop to keep the processor up
現在我想在代碼的開頭添加一個分支,跳過第一部分,這樣只有第二個LED被激活。
我試了一下這樣的:
mov r15, #0x1c
但唯一的效果是兩個LED留下暗。
我的第二次嘗試是這樣的:
mov r2, #0x20
bx r2
但是,無論是作品。
所以我的問題是:
- 如何執行這樣的分支?
- 我是否正確使用地址?
這可能是一個有趣的學習練習,gcc有一個'-white'選項來構建不依賴任何庫的代碼。我假設GNU彙編程序可以將ARM asm組裝成一個扁平的二進制文件,所以你可以使用它來編寫啓動代碼,以便運行你的編譯器輸出函數。據我瞭解,這基本上是如何構建Linux內核的:大多數是C語言,其中包含一些用於設置的asm,以及一個構建內核映像而不是ELF可執行文件的構建過程。 –