所以,我正在嘗試實作一個程式,它將使用在其他源檔案中宣告的變數。我正在閱讀的書指出,我可以使用 extern <symbolName > 匯入在其他檔案中宣告的變數和函式名稱,其中符號名稱是函式名稱或全域宣告的變數(即在 .data 和 .bss 部分)。但是,當我嘗試匯出變數時var ,將變數宣告為外部變數并沒有錯,但是當嘗試在代碼中使用它時,yasm 會通知我這是一個未宣告的名稱。為什么會這樣?
編輯:File1.asm
section .data
var db 123
檔案2.asm
section .data
SYS_exit equ 60
extern var
section .text
global _start
_start:
mov al,byte[var]
last:
mov rax,SYS_exit
mov rdi,0
syscall
在此之后,如果我組裝,則會發生此錯誤:ld:未定義識別符號“var”
uj5u.com熱心網友回復:
您需要global var在File1.asm, 行之前添加指令var db 123。見https://www.tortall.net/projects/yasm/manual/html/manual.html#nasm-directive-global
默認情況下,當您在程式集源檔案中定義標簽時,該標簽是該模塊的本地標簽。它將用于決議同一檔案中的參考,但該符號不會包含在由匯編程式創建的目標檔案的符號表中。所以它不能被其他檔案參考,因為聯結器永遠不會聽說過那個符號。這很像staticC 或 C 中的檔案范圍變數。
該global指令使匯編程式將符號包含在目標檔案的符號表中,以便其他檔案能夠參考它,就像 C 或 C 中的全域變數一樣。它有時被稱為“匯出符號”。這就是你想要的。
請注意,您已經將此指令用于global _start,并且具有大致相同的目的:_start符號需要出現在符號表中,以便聯結器可以知道其值以將其用作可執行檔案的入口點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352569.html
上一篇:三邊三角形的面積
