看http://github.com/dwelch67/yagbat QEMU目錄。
這裏有一對夫婦從手臂調用手臂或拇指的例子
start_vector:
mov sp,#0x20000
;@ call an arm function from arm
bl notmain
;@ call a thumb function frm arm
ldr r0,=0xAABBAABB
bl hexstring_trampoline
;@ call a thumb function frm arm
ldr r0,=0x12341234
ldr r1,hexstring_addr
mov lr,pc
bx r1
;@ call a thumb function frm arm
ldr r0,=0x12312344
bl hexstring_trampoline
hang:
b hang
hexstring_trampoline:
ldr r1,hexstring_addr
bx r1
hexstring_addr: .word hexstring
如果你看看指令集,你會發現你需要使用BX或BLX於ARM和Thumb狀態之間切換。 BLX並不像BX那樣得到廣泛的支持。
從定義的角度來看,程序計數器,PC是超前兩個指令的指令的執行期間。對於拇指是4字節,對於手臂8字節。兩種情況下的說明。爲了模擬一個不能用來改變狀態的BL,你需要加載帶有返回地址的鏈接寄存器,並根據地址的ls位使用bx分支到函數改變狀態。所以
mov lr,pc
bx r1
here:
mov lr,pc上面加載這裏的地址:這是我們的返回地址,bx r1以獨立狀態的方式調用函數。 LR的地址LSbit表示方式返回,你需要經常使用BX返回
pre_thumb:
ldr pc,lr
thumb_capable:
bx lr
編譯器分配BL指令調用函數,鏈接器填充其餘的以後,如果太遠遠達不到,那麼它需要鏈接器自己添加的蹦牀功能。同樣,如果你需要改變模式,bl會調用一個蹦牀函數。我仿照上面的一個模擬,你可以看到它有點浪費,希望我對編譯器的解釋只是爲BL分配空間使得更清晰,浪費將是總是計劃模式更改,並且必須爲代碼中的大部分函數調用插入nops。
代碼還包括呼叫從拇指彙編手臂:
.thumb
.thumb_func
.globl XPUT32
XPUT32:
push {lr}
;@ call an arm function from thumb asm
ldr r2,=PUT32
mov lr,pc
bx r2
pop {r2}
bx r2
大致相同,除了你不能彈出的拇指模式,LR,你可以彈出到PC,但我不認爲切換模式,所以你不能使用它,你需要一個備用註冊表。當然,你需要知道的調用約定知道註冊就可以使用,或者你可以換另一套推動和彈出保存所有,但LR
push {r2,lr}
;@ call an arm function from thumb asm
ldr r2,=PUT32
mov lr,pc
bx r2
pop {r2}
mov lr,r2
pop {r2}
bx lr
拇指以拇指或手臂武裝你只需要使用一個BL如果你能達到。 ldr pc,地址如果你不能。
其中是該編譯器從? –
kernel.o :(。ARM.exidx + 0x0):未定義對'__aeabi_unwind_cpp_pr1'的引用 make:*** [kernel.elf] Error 1 –
你是在試圖構建一個arm linux應用程序嗎?或嵌入式(無操作系統)應用程序?如果一個linux應用程序那麼你不需要啓動代碼,工具鏈應該爲你做所有這些,你擔心main()作爲你的入口點。 –