当我在 MARS 中运行代码时,它不需要任何
.global
指令,而且我知道 MARS 不使用该指令。
现在,当我将代码移植到从命令行运行的特定汇编器(MCB32)时。 所以我必须修改我的代码并添加那些你可以在代码中看到的指令。
那么该指令的效果如何?这是否意味着像这个函数是全局定义的?
我在 MARS 汇编器中使用的
.macro
。
# Written 2015 by F Lundevall
# Copyright abandonded - this file is in the public domain.
.macro PUSH (%reg)
addi $sp,$sp,-4
sw %reg,0($sp)
.end_macro
.macro POP (%reg)
lw %reg,0($sp)
addi $sp,$sp,4
.end_macro
.data
.align 2
main:
我在MCB32汇编器中使用的
.macro
。
.全局延迟 .全局时间2字符串.宏PUSH reg 阿迪 $sp,$sp,-4 SW 例如,0($sp) .endm .macro POP 寄存器 长波 例如,0($sp) 阿迪 $sp,$sp,4 .endm
.data .align 2 .text main:
假设您确实在某个地方使用了这些标签,那么这是有道理的。 我在您提供的代码中没有看到它们。
在一个/某些汇编器中,除非另有说明,所有标签都是本地的。 例如,在 C 中,所有函数名称都是全局的,除非您将 static 放在前面(这可能是编译器使用的标准事物或约定,不知道,不要为此打败我)。 因此,对于 C,如果您不想在该对象之外发布该函数,通常会在前面添加静态。 在 asm 中,至少对于一个/一些你必须将标签声明为全局的,否则其他对象无法与它链接。 即使在一种汇编程序的汇编语言中,有时也可以通过多种方式声明它,有时您有指令来声明带有参数的函数等,或者您只是说这个标签是全局的。
与许多其他语言不同,汇编语言通常不是由某种标准定义的,最多是芯片或 IP 供应商的文档,但我们已经无数次看到它无法定义汇编语言。 汇编器(读取和解析汇编语言的程序)基本上定义了该汇编语言,对于同一目标或平台,您可以拥有与程序员一样多的汇编器。只要机器代码是正确的(很大程度上受标准控制,在逻辑本身中硬连线),您就可以发明几乎任何您想要的东西,以允许某人编写为该目标生成机器代码的程序。 通常但并非总是如此,创建机器语言文档的芯片或 IP 供应商的精神用于指令,但指令、宏语言等通常在汇编器领域,有时试图符合以前的供应商产品,有时会自己推出自己的产品。
因此,您确实必须逐个汇编器进行汇编,并查看可用的文档,并且不要假设一台目标机器/处理器的汇编语言从汇编器移植到汇编器,期望必须重写部分内容,如果您不这样做,那么很好对你来说,你很幸运。