<раздел "a">
<command 1>
<command 2>
...
</a>
<функция "f">
<command 1>
<alias "a">
<command n>
...
</f>
...
mr r3, r31 //адрес начала
mr r4, r30 //значение
mr r5, r29 //размер
loop:
cmp r5, 0
beq exit_loop
stb r4, 0(r3)
addi r3, r3, 1
addi r5, r5, -1
b loop
exit_loop:
...
//наш кусок в виде отдельной функции
memset:
cmp r5, 0
beq exit_loop
stb r4, 0(r3)
addi r3, r3, 1
addi r5, r5, -1
b memset
exit_loop:
blr //прыгнуть на запомненное место возврата
...
//в основном коде осталась лишь передача параметров и прыжок
mr r3, r31
mr r4, r30
mr r5, r29
bl memset //прыгнуть и сохранить место возврата
... //сюда вернется процессор после исполнения функции
каким образом тело функции понимает, по какому адресу находится вершина стека?
но если попытаться делать прыжок на один участок кода из разных функций
общий код не будет понимать, с каким контекстом ему работать в данный момент
Но что, если мы имеем дело с многопоточностью
Почему считается, что вызов подпрограммы дороже, чем например использование цикла?
Нужный контекст создается в функции передаваемыми ей параметрами.
Повторяющийся участок кода выделяете в отдельную функцию, которая должна в качестве параметров принимать всю необходимую ей для работы информацию.
Абсолютно обычная практика.
Использование функций - это простое решение, но не идеальное. Если требуется сократить всего несколько инструкций, дешевле будет дублировать, чем делать вызов подпрограммы.
Использование функций - это простое решение, но не идеальное. Если требуется сократить всего несколько инструкций, дешевле будет дублировать, чем делать вызов подпрограммы.