在不同mips文件中调用标签

问题描述 投票:0回答:1

我有两个 mips 汇编文件。在文件 A 中,我需要调用文件 B 以便它计算一些内容,但我不明白如何执行此操作。

我已经尝试使用

.globl
,这样我就可以从 A 调用正确的标签。我的问题是两个文件都有一个主标签,这会引发错误。但是如果我删除 B 中的主标签,那么我就可以调用它。但是文件 B 必须能够独立运行并从文件 A 调用,而我还没有找到一种方法来运行没有主标签的文件。

有没有办法在没有主标签的情况下执行文件,例如,我可以指定不同的入口点吗?或者是否有另一种方法,我不必更改文件 B 并且仍然能够调用它并自行运行它?

感谢您的帮助!

艾米丽

mips qtspim
1个回答
0
投票

一个程序在所有文件中应该只有一个

main
,这有点像程序的定义;这是正确控制流的问题——你的程序要么从 A 开始,要么从 B 开始,但这两者都是不合逻辑的。

要在文件中共享代码,您可以创建第三个文件 C(具有共享函数,但没有任何

main
),并将该文件与两个单独的程序一起使用,一个是由 A(具有其自己的
main
)和 C 创建的程序,另一个是由 B(具有其自己的 main)和 C 创建的程序。因此,您有两个程序,每个程序都有自己的
 main
并且每个人单独共享第三个文件,C.
当然,你也可以使用4个文件:A、A1、B、B1,其中两个程序的构建如下:

A、A1、B1 — A 中的
    main
  • ,A1、B1 中的其他可共享功能
    B、B1、A1 — B 中的 
  • main
  • ,A1、B1 中的其他可共享功能
    
    
根据我的经验,QtSpim 甚至不需要您在加载一个又一个文件时使用
.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,只是两者都不能。

    

© www.soinside.com 2019 - 2024. All rights reserved.