![](/img/trans.png)
[英]In MIPS Assembly why do we use syscall? Why doesn't the program operate on the instructions given automatically?
[英]Why do we use .globl main in MIPS assembly language?
.text
.globl main
.ent main
我不知道.globl
和.ent
做什么。 作用是什么? 我需要使用globl. main
globl. main
和.ent main
一直?
在您的情況下, .globl
是一個匯編器指令,它告訴匯編器可以從當前文件外部訪問main
符號(也就是說,它可以從其他文件中引用),而.ent
是一個調試器(偽)操作標記main
的入口。
它在 GNU GAS 匯編器上的任何其他 ISA 中都是相同的,例如在 x86_64 Linux 上:
電源
.text
.global _start
_start:
/* exit syscall */
mov $60, %rax
mov exit_status, %rdi
syscall
exit_status.S
.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 $?
給出:
42
但是,如果我們刪除該行:
.global exit_status
然后ld
失敗:
main.o: In function `_start':
(.text+0xb): undefined reference to `exit_status'
因為它看不到它需要的符號exit_status
。
.globl
和.global
是文檔中提到的同義詞: https : .global
所以我更喜歡使用拼寫正確的那個;-)
我們可以通過查看包含在ELF 目標文件中的信息來觀察發生了什么。
對於正確的程序:
nm hello_world.o mystring.o
給出:
main.o:
0000000000000000 T _start
U exit_status
exit_status.o:
0000000000000000 D exit_status
對於失敗的:
exit_status.o:
0000000000000000 d exit_status
和:
man nm
包含:
符號類型。 至少使用了以下類型; 其他的也取決於目標文件格式。 如果是小寫,符號通常是本地的; 如果大寫,則符號是全局的(外部的)。 但是,對於特殊的全局符號(“u”、“v”和“w”),會顯示一些小寫符號。
"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.
在 C 級別,您可以使用static
關鍵字控制符號可見性: “靜態”在 C 中是什么意思?
在 Ubuntu 16.04、Binutils 2.26.1 中測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.