易截截图软件、单文件、免安装、纯绿色、仅160KB

win7上的c和asm互调用

    最近在研究操作系统,《自己动手写操作系统》上第5章讲了asm和c函数之间互调用,目的是使用c来写操作系统内核的代码,毕竟用汇编写代码还是很费时间的事。
    配置Linux开发环境实在是太麻烦,要装虚拟机,还要配置老半天。于是就想能都在windows环境下实现互调用,很自然的想到了mingw交叉环境。于是下了一个win32版本的nasm编译器,用nasm编译汇编,用gcc编译c,查了一下nasm的编译选项-f可以指定asm文件的目标格式,估计可行,但考虑到mingw是交叉环境,感觉上还是用cl.exe来编c文件比较好,反正nasm也支持导出win32格式的obj文件。试了一下可行,现将代码贴上来。一共三个文件:bar.c, foo.asm, makefile.内容如下:
1. bar.c
#include <stdio.h>
void myprint(); // 函数声明
int choose(int a, int b)
{
int c;
// __asm int 3; // 加断点会进入VS调试器
__asm{ // 内嵌汇编测试,等价于:c = b + 1;
mov eax, dword ptr [b]
inc eax
mov dword ptr [c], eax
}
printf("a = %d, b = %d, c = %d.\n", a, b, c); // 输出:a = 3, b = 4, c = 5.
myprint(); // 调用foo.asm中的_myprint函数
return 0;
}
2. foo.asm
extern _choose ; int choose(int a, int b); 编译器编成的obj文件会将c函数名前自动加下划线
[section .data] ; 数据在此
num1st dd 3
num2nd dd 4
[section .text] ; 代码在此
global _main ; exe入口函数,同样要加下划线
global _myprint ; 导出这个函数为了让 bar.c 使用
_main:
push ebp
mov esp, ebp
push dword [num2nd] ; 参数入栈,从右至左
push dword [num1st]
call _choose ; 调用choose()
add esp, 8 ; 去掉参数
pop ebp
ret
; void myprint(char* msg, int len)
_myprint: ; 空调用
ret 
3. makefile
#加Zi,/DEBUG参数可以进入vs调试
CL=cl /Zi /c
LINK=link /DEBUG
#cl /Zi main.cpp, 也可编译带进vs2008调试的信息。
main.exe : foo.obj bar.obj
$(LINK) /OUT:main.exe foo.obj bar.obj
foo.obj : foo.asm
nasm -f win32 foo.asm -o foo.obj
bar.obj : bar.c
$(CL) bar.c


相关文档:

REVIEW C PRIMER PLUS1

1.传统上,C语言要求必须在一个代码块的开始处声明变量,在这之前不允许任何其他语句。现在C99遵循C++的惯例,允许把声明放在代码块中的任何位置。然而,在首次使用变量之前仍然必须先声明它。
2.操作系统和C库通常使用以一个或两个下划线开始的名字,因些你自己最好避免这种用法。
3.C语言的名字是区分大小写的。 ......

C/C++ 核心技术 总结1

第二章 数据类型
 
一、数据类型分类
 
1 联合类型
2 函数类型
3 数量类型
3.1算术类型
     ① 基本数据类型
            整型(包括char)
            浮点型 ......

【IBM需求信息】 JAVA, C/UNIX需求

大家好,这里有IBM的三个长期需求:均是需要2年以上相关工作经验,其中Java以及Testing需要英语可以交流,C/Unix不需要语言。
Java 大连
描述:Java programming, knowledge in J2SE, SWT/JFace, XML. Eclipse programming, knowledge in eclipse architecture. Clear understanding of plugin development. Hands-on exp ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号