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

Существует множество замечательных примеров того, как правильно следовать соглашениям о вызовах функций 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

1 Ответ

0 голосов
/ 30 сентября 2018

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

        .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
...