Win32和汇编接口问题

来源:互联网 发布:算法刘汝佳电子式 编辑:程序博客网 时间:2024/05/16 04:54

来说下win32和汇编的接口问题吧。Win32程序是以WinMain()开始的,而C是以main开始的,但是Win32真的必须一定要以WinMain开始么?其实不是。之所以以WinMain开始,是因为编译器内定了WinMain作为被调函数名,然后在WinMain前面,会生成一段asm代码,去调用WinMain 从而开始整个程序。

知道了原理,我们来试试。偶用的工具和平台如下:

Win2000 Prefossonl Sp4    VC6.0    汇编方面是Masm32 V8.2。

开始前说下原理,在VC环境下,建立个Win32App工程,删除系统生成的WinMain,这个时候直接编译,系统Link时会出错,因为VC编译器内定的程序起始点是WinMain ,所以当你没有写这个函数时,系统就会找不到入口点,这样程序就不知道要从哪里开始,这样link时就会报错。 我们要做的就是自己写一个asm文件,来自己定义一个程序入口,然后用C实现这个入口就可以了。从接口上抽象来说,就是汇编调用C函数。下面看代码:

===用来定义程序入口的asm========================================================

.586
.model flat

.data

copyright db "Hello World!"

.code

extern C xmain:   near    ;声明程序入口点
extern C Exit:   near ;声明程序出口点
extern C TerminateProcess@8: near  ;Win32API 可以在这里调用,也可以在C的实现函数里调用
extern C GetCurrentProcess@0: near ;Win32API 可以在这里调用,也可以在C的实现函数里调用

public STARTCODE

STARTCODE PROC NEAR C
 
call xmain  

call Exit

; push eax
; call GetCurrentProcess@0

 ;push eax
 ;call TerminateProcess@8

STARTCODE ENDP

END STARTCODE

=================================================================================

上面这个asm代码,定义了程序入口为xmain,出口为exit 下面要做的就是用C来实现这2个函数,并且把他们的obj文件link起来就可以了。

=========main.c===================================================================

#include <Windows.h>
int xmain(void)
{
       return 0;
}

void Exit(int ExitCode)
{
 
    TerminateProcess(GetCurrentProcess(),ExitCode);
}

================================================================================

这段程序用来实现入口和出口函数。现在先用Masm将asm文件编译,得到obj文件。再将obj文件加入VC6的
Win32App工程,编译这个工程,link。就可以了,然后你可以用单步调试的方法看看,记得打开asm反汇编。
asm代码如何和C接口的。

原创粉丝点击