65.9K
CodeProject 正在变化。 阅读更多。
Home

32 位汇编很容易

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.78/5 (21投票s)

2006年12月30日

CPOL

3分钟阅读

viewsIcon

66046

downloadIcon

1111

使用32位汇编实现最大性能、更小的应用程序很容易

Sample Image - assembleriseasy.jpg

引言

与流行的传说相反,如果你能用基于编译器的语言(C/C++,Visual Basic等)编写Windows应用程序,你也可以用汇编编写,特别是如果你选择像MASM这样的宏汇编器。

为什么用汇编程序开发?

1. 正确编写的汇编语言能产生高速、缩小最终尺寸的可执行文件,这超出了最佳编译器的能力。

2. 使用汇编器,您可以编写具有上述优点的动态链接库,这些动态链接库可以从您使用的任何其他语言(例如C/C++,VB等)调用。

3. 同样,编写一个静态库,您可以将它们直接链接到您用其他语言编写的程序中,因为它将采用 Visual C++ 编译器使用的目标模块格式。

简化的可执行文件

.386

告诉汇编器使用 80386 指令集。 除非您想使用仅在更高版本的处理器上可用的指令,例如 .486、.586 等,否则这是最安全的选择。

.MODEL FLAT, STDCALL

.MODEL 指定程序的内存模型。 无论您开发哪种类型的应用程序(标准可执行文件、dll、静态库、控制台等),Win32 下都只适用一种模型,即 FLAT 模型。 也就是说,我们无需像在 16 位世界的旧时代那样担心内存模型或段。 内存是一个大的 4 GB 连续空间,因此,您不必使用段寄存器。

STDCALL 通知汇编器参数如何传递给函数。 在您的第一步中,您无需为此担心。

OPTION CASEMAP:NONE

函数名称等区分大小写。 还有更多选项,但您现在无需担心它们。

Include ...

此指令告诉汇编器打开后面的文件名,并将内容放置在那里。 在我们的例子中,我们使用了 WINDOWS.INC、kernel32.inc、user32.inc,因为我们的程序需要存在于其中的常量/结构和函数原型的定义。

IncludeLib ...

告诉汇编器您的程序使用哪些导入库的最简单方法。 在我们的例子中,我们需要 user32.lib 和 kernel32.lib。

.DATA

一个包含程序初始化数据(变量)的部分。 在我们的示例中,定义了两个(多)BYTE 变量,即 MsgCaption 和 MsgBoxText。 类似于高级语言中的字符串变量。

.DATA? 可用于未初始化的数据,而 .CONST 部分包含常量声明(永远无法在您的程序中修改)。

您不必在程序中使用所有三个部分。 只声明您想要使用的部分。

.CODE

这是您的代码所在的位置

Start

    你的代码在这里

End Start

其中 Start 是用于指定代码范围的任何任意标签。 两个标签必须相同。

以上可以被认为是一个骨架项目,只缺少实际代码。 在我们的示例中,我们有两行带有 Windows API 函数调用的代码

  Invoke MessageBox, NULL,Offset MsgBoxText, Offset MsgCaption, MB_OK
  Invoke ExitProcess,NULL

您可以使用以下方法使用 MASM 汇编器汇编我们的示例代码

  ml  /c  /coff  /Cp assembleriseasy.asm

并使用以下方法链接

  link /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 assembleriseasy.obj

请注意,除了使用命令行之外,还有很多工具(如果不是全部)是免费的,可以帮助您轻松构建应用程序。

结论

我知道我没有详细介绍任何汇编器指令,但我这样做是有目的的。 我只是想让您查看汇编列表文件的基本结构,以验证它足够简单,可以开始用汇编语言编程。

汇编程序链接

WinAsm Studio IDE,教程,源代码,汇编程序论坛:http://www.winasm.net

MASM32 是 32 位 Microsoft 汇编器 (MASM) 的工作开发环境:http://www.masm32.com/

Ewaynes 的 Win32 汇编主页:http://asmedit.massmind.org

flat assembler 的站点 http://www.flatassembler.net/

© . All rights reserved.