; 编译链接方法 ; (ld 的‘-s’选项意为“strip all”) ; gcc -c not link ; ; [root@XXX XXX]# nasm -f elf foo.asm -o foo.o ; [root@XXX XXX]# gcc -c bar.c -o bar.o ; [root@XXX XXX]# ld -s foo.o bar.o -o foobar ; [root@XXX XXX]# ./foobar ; the 2nd one ; [root@XXX XXX]# 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 num2nd ; ┓ push num1st ; ┃ call choose ; ┣ choose(num1st, num2nd); add esp, 4 ; ┛ 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 void myprint(char* msg, int l