2016-06-28 3 views
-1

Так что я пишу программу сборки, где я поставил переменную один, два или три, а затем в зависимости от этого переменного правой функция должна использоваться в дальнейшей программе ,ассемблера создана функция, зависящая от переменной

В качестве примера, если значение одна функция должна выглядеть следующим образом:

FUNC: 
    ADD r2, r3, 6 
    WBS r30.t1 
    SUB r3, r3, 1 

Или, если значение два:

FUNC: 
    ADD r2, r4, 5 
    SUB r4, r4, 2 

Так что не должно быть никакой разницы в зависимости от того, какая функция действительно вызвана.

Как настроить метку сборки для запуска другой предписанной процедуры?

+1

как вы это делаете на любом другом языке, если переменная, а затем functino else if then function, и так далее. просто сделайте это здесь. или написать простую функцию на языке высокого уровня, скомпилировать ее и посмотреть, что производит компилятор. в основном вам нужно сравнивать и прыгать –

+0

@dwelch: хорошо, но не эффективно для моей цели .. Эти функции будут вызываться очень часто, и я должен только инициализировать их в специальной рутине, а затем оставить их такими же, как они есть. Они будут меняться ровно один раз. Я задавался вопросом, нет ли лучшего решения. – InvAdErZz

+0

Вы имеете в виду указатель на функцию? Или саморедактирующий код. – Jester

ответ

1

Является ли эта «переменная» постоянной времени сборки? Если это так, используйте макросы ассемблера, а не инструкции, которые будут выполняться во время выполнения.

Если нет, но он изменяется крайне редко, самомодифицирующийся код может работать. (то есть скопируйте соответствующий машинный код в буфер, помеченный как FUNC, когда он изменится, поэтому вам не нужно проверять переменную перед каждым вызовом).

На самом деле это не self модифицирующий код, если только «я» означает всю программу. Это больше похоже на компилятор JIT специального назначения.


Если ни одна из этих вещей так, то вы, очевидно, придется писать ассемблер, который зависит от значения переменной каким-то образом. Основным выбором являются условные ветви, косвенный переход/вызов или исходное выполнение.

Помните, что каждая инструкция по сборке просто превращается в несколько байтов машинного кода. Вы можете взаимодействовать только с «переменными» времени исполнения, используя инструкции asm, а не директивы ассемблера или что-либо «волшебное», как вы, кажется, надеетесь.

+1

Добавление к случаю модификации кода: если рассматриваемая функция вызывается только из одного или двух мест, то, вероятно, проще и эффективнее просто исправить смещение ветви вызывающей команды, а не переписывать весь код вызываемого абонента. – Notlikethat

Смежные вопросы