我有两个 mips 汇编文件。在文件 A 中,我需要调用文件 B 以便它计算一些内容,但我不明白如何执行此操作。
我已经尝试使用
.globl
,这样我就可以从 A 调用正确的标签。我的问题是两个文件都有一个主标签,这会引发错误。但是如果我删除 B 中的主标签,那么我就可以调用它。但是文件 B 必须能够独立运行并从文件 A 调用,而我还没有找到一种方法来运行没有主标签的文件。
有没有办法在没有主标签的情况下执行文件,例如,我可以指定不同的入口点吗?或者是否有另一种方法,我不必更改文件 B 并且仍然能够调用它并自行运行它?
感谢您的帮助!
艾米丽
一个程序在所有文件中应该只有一个
main
,这有点像程序的定义;这是正确控制流的问题——你的程序要么从 A 开始,要么从 B 开始,但这两者都是不合逻辑的。
要在文件中共享代码,您可以创建第三个文件 C(具有共享函数,但没有任何
main
),并将该文件与两个单独的程序一起使用,一个是由 A(具有其自己的 main
)和 C 创建的程序,另一个是由 B(具有其自己的 main
)和 C 创建的程序。因此,您有两个程序,每个程序都有自己的 main
并且每个人单独共享第三个文件,C.当然,你也可以使用4个文件:A、A1、B、B1,其中两个程序的构建如下:
A、A1、B1 — A 中的
main
main
.globl
;它只是将程序集源合并在一起,用第二个文件中找到的标签解析第一个文件中任何未解析的标签。
这同样适用于 C 语言程序。每个程序只能有一个main
,但您可以构建两个单独的程序,在两个程序之间共享文件(没有
main
)。
如果您确实必须将两个文件都制作成各自使用彼此功能的程序,则可以通过使用 main
->
Simulator
、Settings
选项卡,关闭 MIPS
来关闭默认异常处理程序,从而放弃在两个文件中使用 Load Exception Handler
。默认的异常处理程序将一小段代码加载到用户文本段中 - 这段代码是启动代码,它使用 main
和
argc
样式参数调用 argv
;放弃默认的异常处理程序意味着您的程序将成为启动代码(这也意味着没有启动代码可返回(jr $ra
),必须使用系统调用来结束程序,而使用默认异常处理程序时可以使用jr $ra
或系统调用#10来停止程序)。使用该设置,它将首先运行第一个加载的文件中的任何代码,因此您可以通过加载文件 A,然后加载文件 B 来运行程序 A,然后通过加载 B,然后加载 A 来运行程序 B。请注意,在 A 和 B 中,您将放弃标签 main
,并将您想要首先运行的任何代码作为第一个放在
.text
部分中。当然,其中一个可以有一个main
,只是两者都不能。