码迷,mamicode.com
首页 > 其他好文 > 详细

GCC 和 NASM 联合编译

时间:2015-11-03 19:44:42      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:

   为了学习的顺利进行,今天尝试复习 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 语言代码中不加。


GCC 和 NASM 联合编译

标签:

原文地址:http://my.oschina.net/u/580100/blog/525442

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!