汇编与C混合编程
打算用C语言写加壳程序,由于外壳部分(shell)必须用汇编写,所以就来混合编程一把。为后面做准备。开始进入正题。
首先下面是汇编代码。分别导出(函数,变量,标签)。
;author:zhujian198
;email:zhujian198@gmail.com
;date:2009/3/28
.586
.model flat,stdcall
option casemap:none
include WINDOWS.INC
;export function declare
proAdd proto :DWORD,:DWORD
;export variable
public Number
;export Lable address
public L1
.data
Number dd 34
.code
;prepare export this function
proAdd proc a:DWORD,b:DWORD
L1 LABEL DWORD
xor eax,eax
add eax,a
add eax,b
ret
proAdd endp
end
;email:zhujian198@gmail.com
;date:2009/3/28
.586
.model flat,stdcall
option casemap:none
include WINDOWS.INC
;export function declare
proAdd proto :DWORD,:DWORD
;export variable
public Number
;export Lable address
public L1
.data
Number dd 34
.code
;prepare export this function
proAdd proc a:DWORD,b:DWORD
L1 LABEL DWORD
xor eax,eax
add eax,a
add eax,b
ret
proAdd endp
end
编译汇编代码为obj文件
命令行:ML /c /coff MyTest.asm
现在写个C程序来调用下。
#include <stdio.h>
extern "C" int __stdcall proAdd(int a,int b);
extern "C" int Number;
extern "C" int L1;
int main(int argc, char* argv[])
{
int nRes = proAdd(3,4);
printf("Call Assembly function %d\n",nRes);
int n = Number;
printf("Assembly Variable value is %d\n",n);
int lable = L1;
printf("Assembly LABLE %d\n",lable);
return 0;
}
extern "C" int __stdcall proAdd(int a,int b);
extern "C" int Number;
extern "C" int L1;
int main(int argc, char* argv[])
{
int nRes = proAdd(3,4);
printf("Call Assembly function %d\n",nRes);
int n = Number;
printf("Assembly Variable value is %d\n",n);
int lable = L1;
printf("Assembly LABLE %d\n",lable);
return 0;
}
运行结果: