一个操作系统的是实现之C语言与汇编互相调用
2018-03-19 00:12
260 查看
bar.c
foo.asm
编译脚本
由于我的电脑是64位,因此用gcc编译的C代码是64为,而nasm是32位汇编器,32位程序和64位程序无法链接在一起,解决办法是让gcc 用32位模式编译
详细介绍在如下链接编译的解决
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
相关文章推荐
- 一个操作系统的实现(12)-汇编和C相互调用
- ARM汇编程序---C语言调用ARM汇编实现字符串的拷贝
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3-b)
- 一个通用的调用shell命令及打印退出状态的C语言实现
- 一个操作系统的实现 不同特权级代码段之间的跳转 CPL DPL RPL 调用门
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-实践篇)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-理论)
- C语言创建一个数组,利用函数调用实现数组的初始化,逆置和清零
- 汇编调用C语言 实现简单加法计算
- C语言调用汇编语言 实现字符串拷贝
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-理论)
- ARM汇编程序---C语言调用ARM汇编实现字符串的拷贝
- 同一个C语言工程不同C文件之间的函数互相调用问题(一)
- C语言调用汇编实现字符串对换
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-实践篇)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-有特权级转换-进入ring3)
- 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)