Assembly 为什么在MIPS汇编语言中使用.globl main?

Assembly 为什么在MIPS汇编语言中使用.globl main?,assembly,mips,spim,Assembly,Mips,Spim,我不知道.globl和.ent做什么。 角色是什么? 我需要使用globl吗。main和.ent main始终?在您的情况下,.globl是一个汇编程序指令,它告诉汇编程序,main符号可以从当前文件外部访问(也就是说,它可以从其他文件引用),而.ent是一个调试器(伪)标记main项的操作在GNU气体汇编器上的任何其他ISA中都是相同的,例如在x86_64 Linux上: 梅因 .text .globl main .ent main 退出状态 .text .global _

我不知道
.globl
.ent
做什么。 角色是什么?
我需要使用
globl吗。main
.ent main
始终?

在您的情况下,
.globl
是一个汇编程序指令,它告诉汇编程序,
main
符号可以从当前文件外部访问(也就是说,它可以从其他文件引用),而
.ent
是一个调试器(伪)标记
main

项的操作在GNU气体汇编器上的任何其他ISA中都是相同的,例如在x86_64 Linux上:

梅因

       .text
.globl main
.ent   main
退出状态

.text
.global _start
_start:
    /* exit syscall */
    mov $60, %rax
    mov exit_status, %rdi
    syscall
组装和运行:

.data
.global exit_status
exit_status:
    .quad 42
给出:

as -o main.o main.S
as -o exit_status.o exit_status.S
ls -o main.out exit_statis.o main.o
./main.out
echo $?
nm hello_world.o mystring.o
但如果我们取消这条线:

42
然后,
ld
出现以下故障:

.global exit_status
因为它看不到它所需要的符号
exit\u status

.globl
.global
是文档中提到的同义词:因此我更喜欢使用拼写正确的同义词;-)

我们可以通过查看文档中包含的信息来观察正在发生的事情

对于正确的程序:

main.o: In function `_start':
(.text+0xb): undefined reference to `exit_status'
给出:

as -o main.o main.S
as -o exit_status.o exit_status.S
ls -o main.out exit_statis.o main.o
./main.out
echo $?
nm hello_world.o mystring.o
对于失败的一个:

main.o:
0000000000000000 T _start
                 U exit_status

exit_status.o:
0000000000000000 D exit_status
以及:

包含:

符号类型。至少使用以下类型:;其他也取决于对象文件格式。如果是小写,符号通常是本地的;如果大写,则符号为全局(外部)。然而,对于特殊的全局符号(“u”、“v”和“w”)显示了一些小写符号

在C级别上,您可以使用
static
关键字控制符号可见性:

在Ubuntu 16.04、Binutils 2.26.1中测试

"D"
"d" The symbol is in the initialized data section.

"T"
"t" The symbol is in the text (code) section.

"U" The symbol is undefined.