使用没有 masm32 数据包的符号名称

Use symbolic names without masm32 packet

卡盘。

我目前正在学习汇编语言的奥术。

我编写了一个显示对话框的程序(在 windows 8.1 上)。 我检查了 msdn 参考并弄清楚了如何更改所述对话框的外观和行为。我还了解了 return 值的存储位置以及如何读取它。所以我的问题不是那种 "help me i am stuck".

看看这个小对话框程序:

.386
.model          flat, stdcall
includelib      "C:\Program Files (x86)\Windows Kits.1\Lib\winv6.3\um\x86\user32.lib"
includelib      "C:\Program Files (x86)\Windows Kits.1\Lib\winv6.3\um\x86\kernel32.lib"

MessageBoxA     PROTO :DWord, :DWord, :DWord, :DWord
ExitProcess     PROTO :DWord

.data
Caption         db  "Masm shizzle",0
Text            db  "Click OK my friend",0

.code
start:
                push    11h
                push    OFFSET  Caption
                push    OFFSET  Text
                push    0
                call    MessageBoxA

                push    0
                call    ExitProcess
end start

这很有效,我弄清楚了参数需要如何在堆栈上排序。
然后我尝试改进代码并使其更具可读性和更清晰,所以我打破了.code 部分下降到:

.code
start:
                invoke  MessageBoxA, 0, addr Text, addr Caption, 11h
                invoke  ExitProcess, 0
end start

然后我偶然发现了一个网页,该网页宣布您可以在 "windows.inc" 的帮助下通过使用符号名称使代码更具可读性。 它说那里我什至不需要写 functionA (ANSI)。

所以 invoke 调用看起来像这样:

invoke Messagebox, NULL, addr Text, addr Caption, MB_ICONINFORMATION

问题是这些符号名称来自 masm32 包,更具体地说来自 "windows.inc"。
虽然我基本上不反对使用 masm32,但我想知道在只安装了 Visual Studio 的 "standart" windows 主机上是否有我可以使用的等效文件。
更具体地说,如果我想在远程机器上 运行(甚至编译)此代码,我不能假设主机上存在 masm32 安装,因此包含将指向无处。 (据我了解,还是如果我预编译它是否打包到可执行文件中?)

如果没有masm32不行,那我想我需要写一个符号名称库....

您可以获得 MASM32 package by Hutch from here.
这是迄今为止处理这些问题的最简单方法。

它还会按照 in this thread 所述处理您的 ANSI/UniCode 情况。

如果您想使用像

这样的 ANSI 版本,使用这个包您将无事可做
MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD

如果您想使用 UniCode 版本

MessageBoxW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD

你必须定义

__UNICODE__ EQU true    ; or any other way of defining the __UNICODE__ define

在文件开头(包含之前)。

完成后你可以使用 - 在这两种情况下 - 下面一行

invoke MessageBox, 0, addr Text, addr Caption, 11h