Возврат к вызывающей функции сборки MIPS

Я только начал изучать сборку MIPS и не могу понять, как условно вернуться к процедуре caller. Пример сделает мой вопрос яснее. У меня есть процедура caller, которая что-то делает перед вызовом multiply, я хочу, чтобы эта процедура выполнялась other things после завершения multiply. Я знаю, как использовать условия для перехода к меткам, но вместо beq $t3, 80, caller я хочу вернуться к caller сразу после jal multiply. Я знаю, что для возврата нужно использовать jr $ra, но могу ли я вызвать его с помощью условия?

caller:
    doing_somehing
    jal multiply
    other_things    

multiply:
    beq $t3, 80, caller

    lw $t4, array($t3)
    mul $t4, $t4, $t1
    sw $t4, array($t3)

    addi $t3, $t3, 4
    j multiply

Сборка должна вести себя как этот код C:

void caller()
{
    doing_something();
    multily();
    other_things();
}

void multiply()
{
    int i = 0;
    while (i < 80)
    {
        someUnrelated();
        i += 4;
    }
    return;
}

person Misho Tek    schedule 07.04.2019    source источник


Ответы (1)


... но могу ли я вызвать это с помощью условия?

К сожалению нет.

Лишь несколько процессоров (например, совместимые с 8080 (8080, Z80, 8085) и ARM) допускают возврат на основе условий.

Вам придется использовать инструкцию beq, которая переходит к инструкции jr $ra.

person Martin Rosenau    schedule 07.04.2019