外部命令不在程序集中的其他源文件中导入声明的变量
extern command not importing a declared variable in other source file in assembly
所以,我正在尝试实现一个程序,它将使用在其他源文件中声明的变量。我正在阅读的书说我可以导入在其他文件中声明的变量和函数名称,方法是使用
extern < symbolName > 其中 symbolName 是函数名称或全局声明的变量(即在 .data 和 .bss 部分)。但是,当我尝试导出变量 var
时,变量作为外部变量的声明并没有错,但是当我尝试在代码中使用它时,yasm 通知我它是一个未声明的名称。为什么会这样?
编辑:
File1.asm
section .data
var db 123
File2.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
在此之后,如果我assemble,就会发生这个错误:
ld:未定义的标识符“var”
您需要在 File1.asm
行 var db 123
之前添加指令 global var
。参见 https://www.tortall.net/projects/yasm/manual/html/manual.html#nasm-directive-global
默认情况下,当您在程序集源文件中定义标签时,该标签是该模块的本地标签。它将用于解析同一文件中的引用,但该符号不会包含在汇编程序创建的目标文件的符号 table 中。所以它不能从其他文件中引用,因为链接器永远不会听说过该符号。这很像 C 或 C++ 中的 static
文件范围变量。
global
指令使汇编器将该符号包含在目标文件的符号 table 中,这样其他文件就可以引用它,就像 C 或 C++ 中的全局变量一样。它有时被称为“导出符号”。这就是你想要的。
请注意,您已将此指令用于 global _start
,并且其目的大致相同:_start
符号需要出现在符号 table 中,以便链接器可以知道它的值将其用作 executable.
的入口点
所以,我正在尝试实现一个程序,它将使用在其他源文件中声明的变量。我正在阅读的书说我可以导入在其他文件中声明的变量和函数名称,方法是使用
extern < symbolName > 其中 symbolName 是函数名称或全局声明的变量(即在 .data 和 .bss 部分)。但是,当我尝试导出变量 var
时,变量作为外部变量的声明并没有错,但是当我尝试在代码中使用它时,yasm 通知我它是一个未声明的名称。为什么会这样?
编辑: File1.asm
section .data
var db 123
File2.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
在此之后,如果我assemble,就会发生这个错误: ld:未定义的标识符“var”
您需要在 File1.asm
行 var db 123
之前添加指令 global var
。参见 https://www.tortall.net/projects/yasm/manual/html/manual.html#nasm-directive-global
默认情况下,当您在程序集源文件中定义标签时,该标签是该模块的本地标签。它将用于解析同一文件中的引用,但该符号不会包含在汇编程序创建的目标文件的符号 table 中。所以它不能从其他文件中引用,因为链接器永远不会听说过该符号。这很像 C 或 C++ 中的 static
文件范围变量。
global
指令使汇编器将该符号包含在目标文件的符号 table 中,这样其他文件就可以引用它,就像 C 或 C++ 中的全局变量一样。它有时被称为“导出符号”。这就是你想要的。
请注意,您已将此指令用于 global _start
,并且其目的大致相同:_start
符号需要出现在符号 table 中,以便链接器可以知道它的值将其用作 executable.