Assembly Mips-如何在Mars中运行多个文件
我正试图编写一个程序,让用户输入一个选项,然后它从另一个文件分支并运行一个程序。 我试着寻找答案,但我一点运气都没有。 我将所有要使用的文件都放在同一个目录中,并将它们全部更改为.global,然后进入设置以组装目录中的所有文件Assembly Mips-如何在Mars中运行多个文件,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,我正试图编写一个程序,让用户输入一个选项,然后它从另一个文件分支并运行一个程序。 我试着寻找答案,但我一点运气都没有。 我将所有要使用的文件都放在同一个目录中,并将它们全部更改为.global,然后进入设置以组装目录中的所有文件 .data options: .asciiz "Enter 1 for Roadway\nEnter 2 for Equipment\nEnter 3 for Labor\nEnter 4 for Total Projects Costs\n" .text .glob
.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
火星模拟器具有“设置/汇编目录中的所有文件”设置,允许多个文件链接到单个程序中
例如。。。我在磁盘上创建了新目录,并在其中保存了两个.asm文件:
函数
main.asm
现在,当使用main.asm
切换到编辑器选项卡时(!重要信息,当编辑选项卡切换到func.asm
时,生成过程将以独立应用程序的形式执行func.asm
结果-有点笨拙和奇怪的行为),并点击构建按钮(打开“所有文件”设置),生成的二进制文件将在main.asm
中启动,方法是加载带有地址的$t5
,然后从func.asm
调用printasciz
函数。火星模拟器具有“设置/汇编目录中的所有文件”设置,允许多个文件链接到单个程序中
例如。。。我在磁盘上创建了新目录,并在其中保存了两个.asm文件:
函数
main.asm
现在,当使用
main.asm
切换到编辑器选项卡时(!重要信息,当编辑选项卡切换到func.asm
时,生成过程将以独立应用程序的形式执行func.asm
结果-有点笨拙和奇怪的行为),并点击构建按钮(打开“所有文件”设置),生成的二进制文件将从main.asm
开始,方法是加载带有地址的$t5
,然后从func.asm调用printasciz
函数。是否要调用另一个文件中的函数(因此所有文件都是一个大型程序的一部分)?或者,是否要构建两个独立的可执行文件,并让第一个可执行文件(可选)与第二个可执行文件(替换自身或等待第二个程序退出后再继续)?(如果您不使用一体式开发+模拟器环境,差异将更加明显;这是将多个源/对象文件链接到一个可执行文件与构建单独的可执行二进制文件之间的区别。)@PeterCordes我认为第一个更好,因为如果他们调用选项4,我希望程序调用所有程序。好的,那么你要找的词不是“程序”。它是“函数”、“过程”或“子程序”。您正在制作一个具有不同功能的程序,您可以使用jal
调用该程序,然后使用jr
返回该程序。我不知道火星如何让你使用多个文件的细节;在“普通”系统中,您可以将多个asm源汇编成单独的.o
文件,并使用链接器(ld
)将它们链接到一个可执行文件(如Windows.exe
,如果有帮助的话)。另一个选项是使用.include
指令将其他文件包含到一个源中,因此它的构建方式就像所有4个文件一样。您是否使用.global my_function
导出my_function
标签,以便链接器可以看到它?参见Ped7g的答案。如果不是这样的话,你的问题会重复你所犯的错误。@PeterCordes抱歉,没关系。我想出来了。我把文件放错文件夹了。谢谢。是否要调用另一个文件中的函数(因此所有文件都是一个大型程序的一部分)?或者,是否要构建两个独立的可执行文件,并让第一个可执行文件(可选)与第二个可执行文件(替换自身或等待第二个程序退出后再继续)?(如果您不使用一体式开发+模拟器环境,差异将更加明显;这是将多个源/对象文件链接到一个可执行文件与构建单独的可执行二进制文件之间的区别。)@PeterCordes我认为第一个更好,因为如果他们调用选项4,我希望程序调用所有程序。好的,那么你要找的词不是“程序”。它是“函数”、“过程”或“子程序”。您正在制作一个具有不同功能的程序,您可以使用jal
调用该程序,然后使用jr
返回该程序。我不知道火星如何让你使用多个文件的细节;在“普通”系统中,您可以将多个asm源汇编成单独的.o
文件,并使用链接器(ld
)将它们链接到一个可执行文件(如Windows.exe
,如果有帮助的话)。另一个选项是使用.include
指令将其他文件包含到一个源中,因此它的构建方式就像所有4个文件一样。您是否使用.global my_function
导出my_function
标签,以便链接器可以看到它?参见Ped7g的答案。如果不是这样的话,你的问题会重复你所犯的错误。@PeterCordes抱歉,没关系。我想出来了。我把文件放错文件夹了。谢谢。当我运行它时,我得到一个错误,在符号表中找不到它?是什么原因造成的?@HarmonyKunzler在符号表中找不到什么?这两个文件都在“项目”目录中吗?编辑器是否在main.asm上?“汇编目录中的所有文件”设置是否已选中?对不起,不必客气。我想出来了。我把文件放错文件夹了。谢谢。所以我将文件与jal homework5
连接起来,它可以将我带到那里,但该代码是从使用jal开始的,所以当我使用jr$ra
返回主文件时,它只会重新启动homework5。是否有其他寄存器可用于指定跳转到何处?@HarmonyKunzler如果使用嵌套的jal
,homework5
必须先将$ra
存储在某个位置,然后再执行自己的jal
。通常使用堆栈进行此操作。”他说
.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
.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