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

使用 Visual Studio 2010/2012 进行汇编编程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (51投票s)

2011年10月21日

CPOL

7分钟阅读

viewsIcon

314919

downloadIcon

14575

使用 Visual Studio 2010 或 2012 进行汇编编程的示例


介绍 

本文提供了一个简单的示例,演示如何用 x86 汇编语言编写一个小型程序。所使用的技术将是 MASM(现已随 Visual Studio 分发的 Microsoft Assembler)以及 Microsoft Visual Studio 2010 或 Visual Studio 2012。汇编程序在速度和对其他编程语言无法触及的事物的完全控制方面具有优势。该示例是一个非常简单的基本文本加密示例,其中包含了开始处理低级编程奇妙领域所需的所有基本汇编命令。了解计算机在那个级别如何响应对于想成为程序员的人来说至关重要。再说一遍,主要建议只有一个:尝试!尝试 MASM 手册中找到的各种命令,自己修改命令,玩弄内存和寄存器。

汇编编程

汇编编程意味着比使用高级编程语言(如 C++)需要更详细地告诉计算机如何做事情。

示例程序

我写了一个关于汇编的小介绍 这里 。 在这个小型教程中,我将使用一个简单的编码/解码程序(HuoCodec)作为示例,该程序在我文章的“下载文件”部分分发(并在 这里 有更详细的解释)。 该程序接受来自键盘的输入(用户键入的字母和数字),并通过向用户键入的字母的 ASCII 码值添加一个值来对其进行“编码”。

汇编基础知识解释 

汇编与内存密切相关。大多数时候,您需要将数据从内存的一个位置(寄存器)移动到内存的另一个位置。这是通过 `mov` 命令完成的。例如,命令...

mov     AscChar, al

...将 `AL` 内存寄存器的内容移动到代表变量 `AscChar` 的内存段(该变量保存用户输入的字符)。

您还可以对内存执行操作,例如,将一个值加到一个已存储在内存中的值上。命令...

add	al, 2

...将 `2` 加到 `AL` 内存寄存器的内容上。这就是我们“加密”用户输入的文本的“密钥”。在这种情况下,当用户输入“`a`”时,程序将在屏幕上显示“`c`”(因为它会在用户输入的“`a`”的 ASCII 值上加 `2`)。

汇编程序的流程可以通过 `cmp` 命令比较两个值来控制...

cmp     al, 5

...然后根据比较结果将流程重定向到我们想要的地方。例如,当我们想跳转到点 `'endLoop'`(它通过在代码中放置一个具有该名称的标签来表示程序的结束)如果 `AL` 等于 `5`,那么我们使用 `je`(Jump if Equal)命令。

je      endLoop

相应的代码部分在提供的代码中被注释掉了。您可以自己尝试,看看如果您在代码中放入其他类似命令(如 `jz`(Jump if Zero))会发生什么。

解密实验:如果您想解密用该程序加密的消息,只需创建一个新程序,将 `-5`(而不是 `5`)添加到 `AL` 寄存器!

 

MASM 命令

Microsoft MASM Assembler 嵌入了一些现成的函数,可用于执行特定任务。例如,为了在命令行窗口中获取用户输入的字符,我们在项目中调用 `crt_getch` 函数。

call    crt__getch

同样,当我们想在屏幕上打印某些内容时,我们使用 `StdOut` 函数。

invoke  StdOut , offset AscChar

实验:请自行找出 `Locate` 函数的作用。

重要提示:您必须在项目中包含相关的 MASM 库才能使用上述函数。在此项目中,请将 `masm32rt.inc` 文件包含在 `\masm32\include\` 文件夹中,如源代码的 `include` 语句所述(它随 MASM 分发,您也可以在此网站的 zip 文件中找到它)。

如何使用 VS2010 编写汇编

使用 Visual Studio 编写汇编程序可能会有些棘手。必须遵循特定的步骤才能使用 VS2010 / VS2012 创建您的第一个 MASM x86 汇编程序(以下配置步骤的图像取自 此处)。

展开“其他项目类型”树,选择“Visual Studio 解决方案”,然后创建一个新的“空白解决方案”。

文件 | 添加 | 新建项目…

展开“其他语言”、“Visual C++”、“常规”部分,然后创建一个新的“空项目”。

现在,在“解决方案资源管理器”中右键单击项目,然后选择“生成自定义项…”。

勾选“masm”框,然后单击“确定”。

通过在“解决方案资源管理器”中右键单击项目并选择“添加 | 新建项…”,然后选择“文本文件”,向项目中添加一个带有 `.asm` 扩展名的文件。输入一个以 `.asm` 结尾的文件名(例如,test`.asm`)。按“确定”。

现在(如果您跳过了最后几个步骤,这将不起作用),右键单击项目并选择“属性”。您应该会看到一个类似这样的对话框(注意树的底部有一个 MASM 项)。如果看不到,则说明有问题。

为了使其正常工作,在链接器选项中有几个关键设置需要配置。

根据需要将以下属性设置为 Windows 或 Console。

配置属性 > 链接器 > 系统 > 子系统

将入口点设置为您的主方法名称(根据 END 指令 - 请参阅代码)。

配置属性 > 链接器 > 高级 > 入口点

现在您要做的就是编写一些代码并运行它。

Visual Studio 2012 和 MASM

上述内容也适用于 Visual Studio 2012。您还必须为项目定义配置参数,如下面的图片所示。

我将 Huo_MASM_7 应用程序从 VS2010 迁移到 VS2012,它运行得非常好,几乎没有问题。我说“几乎”,是因为唯一需要更改的是 SAFESEH 编译参数,它必须更改为 NO 才能成功编译程序,如下图所示。

除此之外,程序编译并运行得非常好。

x86-64 位汇编编程

x86-64 位汇编语言扩展了 32 位寄存器,并包含一些新寄存器。因此,它有例如 rax 和 rcx,它们是 eax、ecx 32 位寄存器的 64 位版本。它还定义了 8 个新寄存器(r8、r9 等)以及这些寄存器的 32 位版本(r8d、r9d)。然后您“只需”使用这些寄存器来进行 64 位汇编编程。重要的是要知道,您在以前的 32 位汇编程序中通过堆栈(使用 push 和 pop 命令)所做的事情,在 64 位中只能通过寄存器来完成。这可能意味着将 32 位程序移植到 64 位可能比您想象的要复杂。

更详细地说,64 位 x86 汇编中关于寄存器的主要变化是:

  • EAX、EBX、ECX、EDX、ESI、EDI、EBP 和 ESP “通用”寄存器全部扩展到 64 位。扩展后的寄存器使用 RAX、RBX、RCX、RDX、RSI、RDI、RBP 和 RSP 进行访问。
  • 您仍然可以使用现有的名称 EAX、EBX、ECX、EDX、ESI、EDI、EBP 和 ESP 来访问这些寄存器的低 32 位(即最低有效 32 位)。
  • 定义了八(8)个新寄存器:*r8*、*r9*、*r10*、*r11*、*r12*、*r13*、*r14*、*r15*。这些寄存器的 32 位版本是:*r8d*、*r9d*、*r10d*、... *r8w*、*r9w*、...是这些新寄存器的 16 位变体(低字),*r8b*、*r9b*、...是 8 位变体(低字节)。

您需要一个工具来编译 64 位代码。可能的工具包括 MASM 64 位(在您的 PC 上搜索 `ml64.exe` 文件,它通常随每个 Visual Studio 一起打包)或 GoAsm(请参阅下面的互联网参考)。

互联网上的 MASM 资源

您可以在以下网站上找到更多关于使用 MASM 进行汇编编程的信息:

32 位互联网资源

  1. http://www.masm32.com/
  2. http://www.masm32.com/board/index.php
  3. http://www.infernodevelopment.com/introduction-masm32
  4. http://thestarman.pcministry.com/asm/win32/index.html
  5. http://www.piclist.com/techref/language/asm/win32asm.htm

64 位互联网资源

  1. http://www.masm32.com/board/index.php?board=43.0
  2. http://www.godevtool.com/GoasmHelp/64bits.htm#easy [GoAsm]
  3. http://www.codegurus.be/codegurus/Programming/assembler&win64_en.htm
  4. http://www.masm32.com/board/index.php?topic=6557.0;prev_next=prev

历史

  • 初始教程版本发布:2011-10-21
  • 文章更新:2011-10-26
  • 文章更新:2012-09-20 
© . All rights reserved.