2013-03-31 101 views
2

如何用Windows CE(x86)的汇编语言编写程序? 现在我使用VS2008 winth Windows CE 5.0 SDK,我的C++程序运行良好。 我试图创建一个ASM文件,我的代码,并把它列入到项目:用于Windows CE的汇编语言

#include "stdafx.h" 
#include "windows.h" 
extern "C" void clear(); 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    clear(); 
    return 0; 
} 

clear.asm:

.586    ;Target processor. Use instructions for Pentium class machines 
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions 
.STACK   ;Define a stack segment of 1KB (Not required for this example) 
.DATA    ;Create a near data segment. Local variables are declared after 
        ;this directive (Not required for this example) 
.CODE    ;Indicates the start of a code segment. 

clear PROC 
    xor eax, eax 
    xor ebx, ebx 
    ret 
clear ENDP 
END 

一切顺利,直到我想要调用WINAPI函数(MessageBox中)形式asm代码。

.DATA ;Create a near data segment. Local variables are declared after 

    szMessageText  DB "Hello world text", 0 
    szMessageCaption DB "HWorld capt, 0 

    .CODE ;Indicates the start of a code segment. 
    clear PROC 
    Invoke MessageBox, NULL, ADDR szMessageText, ADDR szMessageCaption, MB_OK 
    clear ENDP 
    END 

它给

错误A2006:未定义的符号:MessageBox的

我添加包括与Windows CE SDK库为MASM路径:

C:\ Program Files文件\ Windows CE Tools \ wce500 \ STANDARDSDK_500 \ Lib \ x86

和试图包括coredll.lib,但没有什么效果

includelib coredll.lib 

所以主要问题是: 哪里是我的错?我可以使用winapi函数编写asm代码吗?

Thaks为您解答!

-------------------------------------------- ---

UPD: 谢谢大家。 我设法通过编写的函数原型defenition建设项目:

MessageBoxW PROTO HWND:DWORD,lpText:DWORD,lpCaption:DWORD, UTYPE:DWORD

如何避免写出这样我将使用每个功能的原型? 据我了解,我需要.inc文件与功能proto defenitions? 或以某种方式使用.h文件中的函数定义?

+1

也许MessageBoxA?也就是说,MessageBox的ASCII变体实际上是在c头文件中定义的:#define MessageBox MessageBoxW用于定义UNICODE,否则用#define MessageBox MessageBoxA。 – Aneri

+0

感谢您的回复! – eimc

回答

3
Invoke MessageBox, NULL, ADDR szMessageText, ADDR szMessageCaption, MB_OK 

没有在WINAPI命名MessageBox函数。 MessageBoxA是一个采用8位编码字符串的传统函数,MessageBoxW是一个采用utf-16编码字符串的函数。在C编写代码时,这通常是不可见的,预处理器根据是否定义了UNICODE预处理器符号自动转换函数名称。

当你在程序集中编写代码时没有这样的帮助,你必须自己选择合适的名称。顺便说一句,实际上并不确定Windows-CE是否仍然支持传统功能,你会很快找到答案。背景资料MSDN文章是available here

+0

谢谢。我用PROTO来定义MessageBoxW,并且everythig工作正常。但是,我怎样才能避免使用我将使用的每个函数的原型? – eimc

+0

在winapi函数声明的interwebs周围有.inc文件。我认为masm32有他们,你必须看看。 –

+0

masm的user32.inc中有MessageBoxW的原型。 “MessageBoxW PROTO STDCALL:DWORD,:DWORD,:DWORD,:DWORD”我也在我的asm代码中切换到STDCALL调用约定。但现在它给了我这个错误“错误LNK2019:无法解析的外部符号_MessageBoxW @ 16在函数_clear @ 0中引用”,即使使用ml.exe的/ coff标志 – eimc