Разветвление для разных подпрограмм в сборке 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 ассемблере?
Вот как я решил проблему, и это может помочь кому-то еще (псевдокод ниже):
Я объявил массив в Assembly для хранения всех меток подпрограммы (их адрес памяти):
.global my_arr
my_arr:
.long subroutineA
.long subroutineB
.long subroutineC
.......
У меня также есть генератор случайных чисел в сборке (LFSR). Скажем, у меня есть случайное число вR0
(конечно, убедитесь, что случайное число от 0 до общего количества подпрограмм), тогда я бы сделал что-то вроде:
ldr R4, =my_arr
ldr R5, [R4, R0]
А потом вR5
У меня есть адрес случайной подпрограммы. И тогда я могу просто сделать:
blr R5
перейти к подпрограмме.