为了学习的顺利进行,今天尝试复习 C 语言和汇编语言的联合编译。代码很简单:
/* main.c */ extern void Print1(); char strFormat[] = "x = %d, y = %d, x + y = %d"; int main() { Print1(); return 0; }
; proc.nas extern printf extern strFormat global Print1 [SECTION .data] nX dd 14 nY dd 23 [SECTION .text] Print1: mov eax, [nX] mov ebx, [nY] mov ecx, eax add eax, ebx ; 注意参数入栈顺序:从右向左 push dword eax ; nX + nY push dword ebx ; nY push dword ecx ; nX push dword strFormat call printf add esp, byte 4 * 4 ret
#MakeFile nasm -felf32 proc.nas gcc -m32 -o main main.c proc.o
依然采用 GCC + NASM,可以通过编译,可是链接成执行文件怎么都通不过,一直报错“未定义函数”!
尝试各种操作系统(WinXP 32位、Win7 64位)、各种编译器版本(MinGW 32 位、64 位)、各种编译参数,搞了大半天,死活不让我过!
就在快绝望的时候,突然想起以前浏览的 C 语言库函数,依稀记得函数名前面都带有个下划线 “_”!是不是就是这个原因呢?试试。。。。。。
extern _printf extern _strFormat global _Print1 [SECTION .data] nX dw 14 nY dw 23 [SECTION .text] _Print1: mov eax, [nX] mov ebx, [nY] mov ecx, eax add eax, ebx ; 注意参数入栈顺序:从右向左 push dword eax ; nX + nY push dword ebx ; nY push dword ecx ; nX push dword _strFormat call _printf add esp, byte 4 * 4 ret
竟然真是的,编译通过了!
总结,汇编语言(NASM)和 C 语言(GCC)联合编译的时候(在 Windows 系统下),汇编代码中和 C 语言产生混编关系的变量和函数,前面都要加一个下划线“_”!C 语言代码中不加。
时间: 2024-10-02 20:34:58