汇编程序指令 .global 的作用是什么

What is the effect of the assembler directive `.global`

当我在 MARS 中 运行 我的代码时,它不需要任何 .global 指令,而且我知道 MARS 不使用该指令。

现在,当我将我的代码移植到一个特定的汇编器 (MCB32) 时,运行s 来自命令行。 所以我不得不修改我的代码并添加那些你可以在代码中看到的指令。

那么该指令的作用是什么?这是否意味着类似此函数的定义是全局的?

我在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


.global delay .global time2string

.macro PUSH reg addi $sp,$sp,-4 sw \reg,0($sp) .endm .macro POP reg lw \reg,0($sp) addi $sp,$sp,4 .endm

.data .align 2 .text main:

好吧,假设您确实在某处使用了这些标签,那么它就有意义了。我在您提供的代码中看不到它们。

在one/some 汇编程序中,所有标签都是局部的,除非另有说明。例如,在 C 中,所有函数名称都是全局的,除非您将静态放在前面(这可能是编译器使用的标准事物或约定,不知道,不要打我)。因此,对于 C,如果您不想在该对象之外发布该函数,您通常会在前面添加一个静态。在 asm 中,至少 one/some 你必须将标签声明为全局标签,否则其他对象无法 link 使用它。即使在一种汇编程序的汇编语言中,有时也会以各种方式声明它的声明方式,有时您有指令将某些东西声明为带参数的函数等,或者您只是说这个标签是全局的。

与许多其他语言不同,汇编语言通常不由某些标准定义,充其量是来自芯片或 IP 供应商的文档,但我们已经无数次看到如何未能定义汇编语言。汇编程序读取和解析汇编语言的程序基本上定义了该汇编语言,对于同一目标或平台,您可以拥有与程序员一样多的汇编器。只要机器代码是正确的,它在很大程度上受标准控制,在逻辑本身中是硬连线的,你就可以发明几乎任何你想要的东西,允许某人编写程序来为该目标制作机器代码。通常但并非总是如此,创建机器语言文档的芯片或 IP 供应商的精神用于指令,但指令、宏语言等通常在汇编程序领域内,有时试图符合以前的供应商产品,有时会带着自己的东西自己出去。

所以你真的必须一个接一个地使用汇编器并查看文档(如果有的话),并且不要假设汇编语言用于一个目标 machine/processor 从汇编器到汇编器的端口,预计必须重写部分,如果你不那么对你有好处,你很幸运。