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
相关文档:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
EXEC SQL include sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
EXEC SQL BEGIN DECLARE SECTION;
& ......
C没有类
这让人很疲惫
对象的说法很时髦
不就是继承封装组合人人会
右走是C++,这个大众都熟悉它
左走就是objective-c,躲在僻静僻静的麦金塔
本是同根生的C
如何高举面向对象的大旗
求同存异标新立异且听一一细分清
对象的C
是不同的C
类的处理与众不同重点要区分
不重复是我的口头禅
任何时候我只说一次告诉 ......
#include<stdio.h>
#include<math.h>
float x1,x2,disc,p,q;
int main()
{
void greater_than_zero(float,float);
void equal_to_zero(float,float);
void smaller_than_zero(float,float);
float a,b,c;
printf("\ninput a,b,c:");
scanf("%f,%f,%f",&a,&b,&c) ......
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.spri ......