您的位置:首页 > 编程语言 > C语言/C++

一个操作系统的是实现之C语言与汇编互相调用

2018-03-19 00:12 260 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐