Mips- Как запустить несколько файлов в Марсе

Я пытаюсь написать программу, в которой пользователь вводит параметр, и она разветвляется и запускает программу из другого файла. Я пытался найти ответ, но мне не повезло. У меня есть все файлы, которые я хочу использовать, в одном каталоге, и я изменил их все на .global и зашел в настройки, чтобы собрать все файлы в каталоге.

.data
options: .asciiz "Enter 1 for Roadway\nEnter 2 for Equipment\nEnter 3 for Labor\nEnter 4 for Total Projects Costs\n"

.text
.global main

main:
    li $v0, 4   
    la $a0, options
    syscall

    li $v0, 5
    move $t0, $a0
    syscall

    beq $t0, 1, option1
    #beq $t0, 2, option2
    #beq $t0, 3, option3
    #beq $t0, 4, option4

    li $v0, 10
    syscall

option1:
    #this is where I'd like to run code from another file

    jr, $ra

person Harmony    schedule 29.10.2017    source источник
comment
Вы хотите вызывать функции в другом файле (чтобы все файлы были частью одной большой программы)? Или вы хотите создать два отдельных исполняемых файла и иметь первый исполняемый файл, опционально exec второй, либо заменяя себя, либо ожидая выхода второй программы, прежде чем продолжить? (Разница была бы более очевидной, если бы вы не использовали универсальную среду разработки + симулятор; это разница между связыванием нескольких исходных/объектных файлов в один исполняемый файл и созданием отдельных исполняемых двоичных файлов.)   -  person Peter Cordes    schedule 30.10.2017
comment
@PeterCordes Я думаю, что первое сработает лучше, потому что, если они вызовут вариант 4, я хочу, чтобы программа вызывала все программы.   -  person Harmony    schedule 30.10.2017
comment
Хорошо, тогда слово, которое вы ищете, не программа. Это функция, процедура или подпрограмма. Вы создаете одну программу с разными функциями, которые вы можете вызывать с помощью jal и возвращать из которых с помощью jr. Я не знаю подробностей того, как MARS позволяет вам использовать несколько файлов; в обычной системе вы бы собрали несколько исходников asm в отдельные файлы .o и использовали компоновщик (ld), чтобы связать их в один исполняемый файл (например, Windows .exe, если это поможет). Другой вариант — использовать директиву .include для включения других файлов в один источник, чтобы он строился так, как если бы это были все 4 файла.   -  person Peter Cordes    schedule 30.10.2017
comment
Использовали ли вы .global my_function для экспорта метки my_function, чтобы она была видна компоновщику? См. ответ Ped7g. Если это не так, отредактируйте свой вопрос с помощью минимальный воспроизводимый пример, воспроизводящий ошибку, которую вы получаете.   -  person Peter Cordes    schedule 05.11.2017
comment
@PeterCordes Извините, неважно. Я понял. У меня были файлы в неправильной папке. Спасибо.   -  person Harmony    schedule 05.11.2017


Ответы (1)


Симулятор MARS имеет настройку «Настройки/Собрать все файлы в каталоге», которая позволяет связывать несколько файлов в одну программу.

Пример... я создал новый каталог на диске и сохранил в нем два файла .asm:

func.asm

.text

.globl printAsciiz

    # $t5 = address of ASCIIz string, modifies $v0
printAsciiz:
    # store original $a0 to stack (to preserve it)
    addi    $sp, $sp, -4
    sw      $a0, ($sp)
    # output the message from t5
    li      $v0, 4
    move    $a0, $t5
    syscall
    # restore $a0 from stack
    lw      $a0, ($sp)
    addi    $sp, $sp, 4
    # return from function
    jr      $ra

main.asm

.data
    msg:    .asciiz     "Hello world\n" 

.text

.globl main
main:
    # call output function from other file
    la      $t5, msg
    jal     printAsciiz
    # terminate program
    li      $v0, 10
    syscall

Теперь, когда вы переключаетесь на вкладку редактора с помощью main.asm (! важно, когда вкладка редактирования переключается на func.asm, процесс сборки будет выполнять результат func.asm как отдельное приложение — немного неуклюжее и странное поведение) и нажимаете кнопку сборки (с «все файлы» включены), результирующий двоичный файл запустится в main.asm путем загрузки $t5 с адресом, а затем вызовом функции printAsciiz из func.asm.

person Ped7g    schedule 30.10.2017
comment
Когда я запускаю его, я получаю сообщение об ошибке, что он не найден в таблице символов? Что может быть причиной этого? - person Harmony; 05.11.2017
comment
@HarmonyKunzler Чего нет в таблице символов? Оба файла находятся в каталоге проекта? Редактор есть на main.asm? Включена ли настройка «Собрать все файлы в каталоге»? - person Ped7g; 05.11.2017
comment
Извини, неважно. Я понял. У меня были файлы в неправильной папке. Спасибо. - person Harmony; 05.11.2017
comment
Итак, я подключаю файлы с помощью jal homework5, который работает и приводит меня туда, но этот код начинается с использования jal, поэтому, когда я использую jr $ra, чтобы вернуться к основному файлу, он просто перезапускает домашнюю работу5. Есть ли другой регистр, который я могу использовать, чтобы указать, куда перейти? - person Harmony; 06.11.2017
comment
@HarmonyKunzler, если вы используете вложенный jal, homework5 должен сначала где-то сохранить $ra, прежде чем делать свой собственный jal. Обычно для этого используется стек. user.it.uu.se/~justin/Teaching/NewDarkSlides/ Лекция5.pdf На слайде 14 показан базовый пример, но вы можете просмотреть остальную часть, чтобы узнать, есть ли для вас полезная информация. Вы также можете сохранить $ra в каком-нибудь регистре $sX (а затем jr $sX для возврата), но в зависимости от соглашения о вызовах, которому вы хотите следовать, вы также должны сохранить их, поэтому, если вы не хотите следовать всему, что является пользовательским соглашением о вызовах, используйте стек. - person Ped7g; 06.11.2017