bar.c
void myprint(char* msg, int len);
int choose(int a, int b)
{
if(a >= b){
myprint("the 1st ont \n", 13);
}
else{
myprint("the 2nd one \n", 13);
}
return 0;
}
foo.asm
extern choose ;
[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 ; 调用C函数
add esp, 8
mov ebx, 0
mov eax, 1 ;sys_exit
int 0x80 ;系统调用
myprint:
mov edx, [esp+8]; len
mov ecx, [esp+4]; msg
mov ebx, 1
mov eax, 4 ;sys_write
int 0x80 ;系统调用
ret
编译脚本
由于我的电脑是64位,因此用gcc编译的C代码是64为,而nasm是32位汇编器,32位程序和64位程序无法链接在一起,解决办法是让gcc 用32位模式编译
详细介绍在如下链接编译的解决
nasm -f elf -o foo.o foo.asm
gcc -m32 -c -o bar.o bar.c
ld -m elf_i386 -s -o foobar foo.o bar.o