2014-09-29 51 views
-3

說我有以下彙編代碼:在ARM程序集中分支到不同的子例程?

subroutineA: 
    ....some assembly code.... 

subroutineB: 
    ....some assembly code.... 

subroutineC: 
    ....some assembly code.... 

現在,在其他子程序,我想建立的東西,將隨機轉移到上述3個子程序之一。

喜歡的東西:

subroutineD: 
    ....some code to randomly branch to either 
     subroutineA, or subroutineB, or subroutineC .... 

如何在ARM彙編程序有效地做到這一點?

這裏是我結束瞭解決這個問題,它可能會幫助別人的某一天(僞下面的代碼):

我宣佈大會陣列來存儲所有的子程序標籤(它們的內存地址):

.global my_arr 
my_arr: 
    .long subroutineA 
    .long subroutineB 
    .long subroutineC 
    ....... 

我在Assembly(LFSR)中也有一些隨機數發生器。說我有有隨機數R0(當然,使0和子程序的總數之間確定的隨機數),那麼我會做這樣的事情:

ldr R4, =my_arr 
ldr R5, [R4, R0] 

然後在R5,我有一個隨機地址子程序。然後我可以簡單地做:

blr R5 

去子例程。

+0

@OliverCharlesworth我猜你在暗示什麼,先是生成一個數字,然後做一個比較,如果number是1,那麼執行bl subroutineA,如果number是2,執行bl subroutineB,依此類推。但是如果我有很多子程序,這會變得非常低效嗎?也許我不明白你在說什麼? – JJackJi 2014-09-29 23:00:18

+0

@GregHewgill我是新來的大會,我只是想了解什麼是最好的方式去做這樣的事情。用C語言(或其他語言)說,我會將所有子例程存儲在某個結構中,並生成一個隨機數,然後跳轉到結構中該索引處的子例程。 – JJackJi 2014-09-29 23:01:56

+1

你可以在彙編語言中做幾乎完全相同的事情。創建一個函數地址數組,並根據隨機數對數組中的某個函數進行間接調用。 – 2014-09-29 23:21:43

回答

1

您可以有效地實現這樣的跳轉表,

adr lr, return 
cmp r0, #3 
ldrlo pc, [pc, r0, lsl #2] @ pc is 8 bytes ahead 
b error     @ also functions as padding 
.long subroutineA 
.long subroutineB 
.long subroutineC 
return: 
@ one of three routines finished here. 
... 
error: 
@ random out of array range. 

這是非常通用的。大衛密封給出了一個很好的方式來實現在9.2.5多路分支的ARM ARM第二版開關類型語句,

cmp r0,#max 
addlo pc, pc, r0, LSL #routineSizeLog2 
b  outOfRange 
index0: 
... 
index1: 
... 
index2: 
... 

編譯器通常做我的第一個版本(函數指針類型),但這樣做不需要保存lr來實現交換機。通常case報表不是線性的。但是,許多人使用David Seal的方法在彙編程序中創建中斷處理程序等。

+0

那麼,這不是編譯器實現開關的唯一方式,但它是一種常見的方式。 – 2014-10-09 19:13:45

相關問題