【问题标题】:Assembly language for Windows CEWindows CE 的汇编语言
【发布时间】:2013-03-31 10:28:29
【问题描述】:

如何用汇编语言为 Windows CE (x86) 编写程序? 现在我正在使用 VS2008 winth Windows CE 5.0 SDK,我的 C++ 程序运行良好。 我试图用我的代码创建一个 asm 文件并将其包含到项目中:

#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 

在我想以 asm 代码调用 WinApi 函数 (MessageBox) 之前一切正常。

    .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:未定义符号:消息框

我为 MASM 添加了包含 Windows CE SDK 库的包含路径:

C:\Program Files\Windows CE 工具\wce500\STANDARDSDK_500\Lib\x86

并尝试包含coredll.lib,但没有效果

includelib coredll.lib

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

感谢您的回答!

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

统一更新: 谢谢大家。 我设法通过编写函数的原型定义来构建项目:

MessageBoxW PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD

如何避免为我将使用的每个函数编写这样的原型? 据我了解,我需要 .inc 文件,其中包含功能的原始定义? 或者以某种方式使用 .h 文件中的函数定义?

【问题讨论】:

  • 可能是 MessageBoxA?也就是说,MessageBox 的 ASCII 变体,实际上是在 c 标头中 #defined:#define MessageBox MessageBoxW,如果定义了 UNICODE,则 #define MessageBox MessageBoxA,否则。
  • 感谢您的回复!

标签: windows assembly windows-ce


【解决方案1】:
Invoke MessageBox, NULL, ADDR szMessageText, ADDR szMessageCaption, MB_OK

winapi 中没有名为 MessageBox 的函数。 MessageBoxA 是一个采用 8 位编码字符串的遗留函数,MessageBoxW 是一个采用 utf-16 编码字符串的函数。这在您用 C 编写代码时通常是不可见的,预处理器会根据您是否定义了 UNICODE 预处理器符号自动翻译函数名称。

在汇编中编写代码时没有这样的帮助,您必须自己选择正确的名称。顺便说一句,实际上不确定 Windows-CE 是否仍支持旧功能,您很快就会发现。背景 MSDN 文章是available here

【讨论】:

  • 谢谢。我使用 PROTO 定义 MessageBoxW 并且一切正常。但是如何避免对我将使用的每个函数都使用 proto?
  • 互联网上的 .inc 文件包含 winapi 函数的声明。我认为masm32有它们,你必须看看。
  • masm的user32.inc中有MessageBoxW的proto。 "MessageBoxW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD" 我还在我的 asm 代码中切换到 STDCALL 调用约定。但现在它给了我这个错误“错误LNK2019:函数_clear@0中引用的未解析的外部符号_MessageBoxW@16”,即使ml.exe的/coff标志
  • 你忘记链接 user32.lib
  • 感谢您的回复!到目前为止,一切都清楚了。我会问是否有任何问题。
猜你喜欢
  • 2011-05-03
  • 2017-01-03
  • 1970-01-01
  • 2010-12-24
  • 2013-10-29
  • 2014-10-07
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多