Ubuntu下用gcc与nasm联合编译

本文介绍了如何在Ubuntu环境下,使用gcc和nasm联合编译32位程序。首先展示foo.asm和bar.c的源代码,接着详细说明了编译、链接和执行的步骤,包括nasm的-f elf32选项,gcc的-m32选项,以及ld的-m elf_i386选项。最后,解释了extern和global关键字的作用,以及汇编指令如dd、push、dword和add的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代码

foo.asm

;编译链接的方法
;(id的'-s'选项意为"strip all")
;
;$ nasm -f elf foo.asm -o foo.o
;$ gcc -c bar.c -o bar.o
;$ id -s hello.o bar.o foobar
;$ ./foobar
;the 2nd one
;$

extern choose		;int choose(int a,int b)

[section .data]		;数据在此

num1st	dd	3
num2nd	dd	4

[section .text]		;代码在此

global _start		;我们必须导出 _start 这个入口,以便让链接器识别
global myprint		;导出这个函数为了让bar.c使用

_start:
	push	dword [num2nd]	;'.
	push	dword [num1st]	;|
	call 	choose		;|choose(num1st,num2nd);
	add	esp,8		;/

	mov	ebx,0
	mov	eax,1		;sys_exit
	int	0x80		;系统调用

;void myprint(char* msg,int len)
myprint:
	mov	edx,[esp + 8]	;len
	mov	ecx,[esp + 4]	;msg
	mov	ebx,1
	mov	eax,4		;sys_write
	int	0x80		;系统调用
	ret

bar.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值