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