windows下c与asm编译链接

因为在Windows下使用VS编写程序再编译的方式,对我在linux整天游荡的人来说实在是感觉被IDE束缚着很不爽。我喜欢用emacs写完了然后用一个命令编译完了就ok了。

下面是在Windows下的C与Asm互相调用如何编写,编译,链接成功的?前提是确定下面使用的命令路径能够找得到。
先贴c代码:
A.c

#include <stdio.h>
#include <stdlib.h>

int asm_func(int);
int c_var;

int main(int argc, char* argv[])
{
int r;
c_var = 0;
r = asm_func(c_var);
printf("r = %d\n", r);
return 0;
}

再贴asm代码,注意在Windows下asm使用的是MASM,对应的语法可以查看MSDN手册或者到网上搜资料来看。
你娘的,微软的asm还能像c一样声明函数,还带参数,我靠太虎了,呵呵
B.asm

.386
.model flat, c
.code

asm_func PROC x:SDWORD

mov eax, x
add eax, 1

; return value already in eax
RET
asm_func ENDP

end

下面是编译,链接:
分别编译c,编译asm:

cl /c A.c
ml /c B.asm
分别输出:
A.obj, B.obj

链接:
cl A.obj, B.obj
或者
link A.obj, B.obj

/c选项代表只编译不链接。可以使用/?选项查看帮助。

记住在Windows开发,跟Windows平台有关问题答案大多都在MSDN.


下面是改进版本的asm中可以调用c的function和全局变量。
A.c如下:

#include <stdio.h>
#include <stdlib.h>

int asm_func();
int *c_var;

int main(int argc, char* argv[])
{
int r = 4;
c_var = &r;
r = asm_func();
printf("r = %d\n", r);
return 0;
}

void c_func(){
printf("This is in C function\n");
}

B.asm如下:

.386
.model flat, c

EXTERN c_var : PTR SDWORD
EXTERN c_func : PROTO

.code
divisor.

asm_func PROC uses edx

call c_func
mov edx, c_var
mov eax, 1
add eax, SDWORD PTR [edx]

; return value already in eax
RET
asm_func ENDP

end

最后输出结果为:

This is in C function
r = 5





posted @ 2011-12-03 14:25  Jack204  阅读(1934)  评论(0编辑  收藏  举报