我曾经认为我们应该在使用它之前声明一个在另一个文件中定义的函数,但最近我因为编程经验改变了我的思维方式。对于三个文件,C
并且ASM
:
主程序
extern test_str;
/*extern myprint*/ --> If I add the line, gcc will report an error: called object ‘myprint’ is not a function
void Print_String() {
myprint("a simple test", test_str);
}
内核.asm
extern Print_String
[section .text]
global _start
global test_str
test_str dd 14
_start:
call Print_String
jmp $
另一个.asm
[section .text]
global myprint
myprint:
mov edx, [esp + 8]
mov ecx, [esp + 4]
mov ebx, 1
mov eax, 4
int 0x80
ret
编译
nasm -f elf another.asm -o another.o
gcc -c -g main.c -o main.o
nasm -f elf kernel.asm -o kernel.o
ld -o final main.o kernel.o another.o
结果
./final
a simple test
在我看来,如果我想使用main.cmyprint
中的函数,我应该事先声明它,因为它 是在另一个文件中定义的,但结果恰恰相反。正如上面的main.c所示。如果我添加 line ,我会得到一个错误。但是,如果没有该声明,我将得到正确的结果。更何况我没有在main.c中定义函数,为什么我可以使用那个函数呢?我不应该提前声明吗?extern
myprint
extern myprint
myprint