使用没有 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
卡盘。
我目前正在学习汇编语言的奥术。
我编写了一个显示对话框的程序(在 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