MIPS-Assembly: как «определить» подпрограмму для последующего использования

Существует множество отличных примеров того, как правильно следовать соглашениям о вызовах функций MIPS. Однако я не понимаю, как использовать функцию только при ее вызове. Следующее напечатает 51 (используя MARS):

.data
strproc: .asciiz "procedure example"
strnl: .ascii "\n"

.text
printnl: li $v0, 1
li $a0, 5
syscall

#jal printnl

li $v0, 1
li $a0, 1
syscall

Тем не менее, мне бы очень хотелось иметь возможность выполнять инструкции, связанные с меткой printnl, только при прыжке и ссылке (когда «вызывается»). Возможно ли это в MIPS? Не стесняйтесь критиковать мои дизайнерские наклонности как часть вашего ответа. Я не уверен, как мне написать простую программу на ассемблере, которая может нуждаться в большом количестве повторяющихся инструкций.

Я пробовал это (но он не собирается):

.data
strproc: .asciiz "procedure example"
strnl: .ascii "\n"

printnl: li $v0, 1
li $a0, 5
syscall

.text
li $v0, 1
li $a0, 1
syscall
jal printnl

person gordlonious    schedule 30.09.2018    source источник
comment
Просто поместите подпрограмму в точку, где поток управления обычно не достигает ее, например. после основной рутины.   -  person fuz    schedule 30.09.2018
comment
Не могли бы вы привести пример? Какова семантика «основной процедуры» в MIPS? Вроде есть какие-то директивы для этого, но нужных пока не накопал.   -  person gordlonious    schedule 30.09.2018
comment
Выполнение переходит от одной инструкции к другой, если вы не перенаправляете ее. Я предполагаю, что в SPIM выполнение начинается в начале текстового сегмента. Вы выходите из своей программы, выполняя системный вызов 10. Если вы поместите свою подпрограмму после этого, управление никогда не достигнет ее, если вы не вызовете ее явно.   -  person fuz    schedule 30.09.2018


Ответы (1)


Выполнение переходит от одной инструкции к другой, если вы не перенаправляете ее. Я предполагаю, что в SPIM выполнение начинается в начале текстового сегмента и заканчивается, когда вы вызываете системный вызов выхода (системный вызов № 10). Если вы поместите свою подпрограмму после системного вызова выхода, возврата функции или любого другого безусловного перехода, управление никогда не достигнет ее, если вы не вызовете ее явно. Например:

        .data
strproc:.asciiz "procedure example"
strnl:  .ascii "\n"

        .text
        # entry point
        li $v0, 1
        li $a0, 1
        syscall     # print integer 1

        jal println # call println

        li $v0, 10
        syscall     # exit program

printnl:li $v0, 1
        li $a0, 5
        syscall     # print integer 5
        jr $ra      # return from function
person fuz    schedule 30.09.2018