在开始下面列出的教程之前,请访问 Github 页面 (surferkip/asmbook) 下载以下文件:
- Irvine.zip - 代码示例和所需库
- Project32_VS2022.zip - 配置为汇编语言的样例 32 位 Visual Studio 2022 项目
- Project64_VS2022.zip - 配置为汇编语言的样例 64 位 Visual Studio 2022 项目
32 位应用程序的必要设置
下载并安装了 VS 2022 社区版之后,并启用 Visual C++ 桌面开发。首先,确认这一组件是否已经安装。启动 Visual Studio 时,在启动窗口上点击 "创建新项目" 面板:
接下来,在 创建新项目 对话框窗口中,在最近项目模板列表中查找带有 C++ 按钮的 Console App 项目类型。
如果在列表中看不到C++,请关闭Visual Studio并运行一个名为Visual Studio Installer的单独程序。
Visual C++ 语言包含 Microsoft Assembler(MASM)。要验证是否已安装 MASM ,请打开 Windows 资源管理器窗口,查找 Visual Studio 安装目录中的名为 ml.exe 的文件,例如 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.nn.nnnn\bin\HostX64\x86 。(上述的 "n" 字符表示您当前 VS 的安装版本号。)
示例程序
在本文档的顶部,有名为 Irvine.zip 的文件的下载方式,我们需要下载这一文件,并将其提取到 C:\Irvine 文件夹中,建议不要更改路径。
C:\Irvine 文件夹应包含以下文件:
Filename | Description |
---|---|
b16.asm, b32.asm | Blank templates for 16-bit and 32-bit assembly language source files |
GraphWin.inc | Include file for writing Windows applications |
Irvine16.inc | Include file used with the Irvine16 link library (16-bit applications) |
Irvine16.lib | 16-bit link function library used with this book |
Irvine32.inc | Include file used with the Irvine32 link library (32-bit applications) |
Irvine32.lib | Irvine's 32-bit link library |
Kernel32.lib | 32-bit link library for Windows API |
Link16.exe | 16-bit Microsoft linker |
Macros.inc | Irvine's macro include file (see Chapter 10) |
SmallWin.inc | Small-sized include file containing MS-Windows definitions, used by Irvine32.inc |
User32.lib | MS-Windows basic I/O link library |
VirtualKeys.inc | Keyboard code definitions file, used by Irvine32.inc |
名为 Examples 的子目录包含了一些示例程序、 16 位、 32 位和 64 位库的源代码,以及两个用于较早版本Visual Studio的示例项目。
配置 Visual Studio
您可以在不打开或创建项目的情况下打开 Visual Studio 。在初始启动屏幕上,选择 继续但无需代码 ,就在 创建新项目 按钮的下方。
选择 C++ 配置
Visual Studio 支持多种编程语言和应用类型。 C++ 编程语言的配置最接近汇编语言编程,因此采用以下步骤:
- 从菜单中选择 工具 >> 导入和导出设置
- 选择 "导入选定的环境设置" 单选按钮
- 选择 "否,仅导入新设置......" 单选按钮
- 从默认设置列表中选择 "Visual C++" ,然后点击下一步按钮
- 点击完成按钮,然后点击关闭按钮
- 注意 Visual Studio 工作区左右两侧的选项卡。关闭 Server Explorer 和 Toolbox 选项卡。如果将来不小心关闭了一个窗口,您可以将其恢复:从菜单中选择"查看",然后从查看菜单列表中找到窗口的名称。
教程:构建并运行一个 32 位程序
现在可以打开并构建一个 32 位项目。
打开项目
Visual Studio 要求汇编语言源文件必须属于一个 项目 ,这是一种容器。项目包含配置信息,如汇编器、链接器和所需库的位置。项目有自己的文件夹,并保存属于它的所有文件的名称和位置。
按照文章开头的说明,下载 Project32_VS2022.zip 文件并将其解压缩到您的工作目录中。它包含一个名为 AddTwo.asm 的样本 asm 测试文件。
按照以下步骤操作:
- 启动 Visual Studio 。
- 通过从 Visual Studio 菜单中选择 文件 >> 打开 >> 项目/解决方案 ,打开我们的样本 Visual Studio 项目文件。
- 转到您解压缩我们的项目文件的工作文件夹,并选择名为 Project.sln 的文件。
- 一旦项目被打开,您将在 Visual Studio 的解决方案资源管理器窗口中看到项目名称。您还应该在项目中看到一个名为 AddTwo.asm 的汇编语言源文件。双击文件名以在编辑器中打开它。
您应该在编辑器窗口中看到以下程序:
arduino
; AddTwo.asm - adds two 32-bit integers.
; Chapter 3 example
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.code
main proc
mov eax,5
add eax,6
invoke ExitProcess,0
main endp
end main
后续可以使用此文件作为创建新程序的起点。
构建程序
构建(汇编和链接)示例程序。从 生成 菜单中选择 生成 Project 。在屏幕底部的输出窗口中,您应该看到类似以下的消息,指示构建结果:
rust
生成开始于 20:38...
1>------ 已启动生成: 项目: Project, 配置: Debug Win32 ------
1>Assembling AddTwo.asm...
1>Project.vcxproj -> D:\0_fushiProject\asmbook-main\Project32_VS2022\Debug\Project.exe
========== "生成": 1 成功,0 失败,0已跳过 ==========
========== 生成 于 20:38 完成,耗时 02.002 秒 ==========
如果您没有看到这些消息,则该项目可能自上次构建以来没有被修改。只需从 生成 菜单中选择 重新生成 Project 。
调试程序
首先设置一个断点。在程序中设置好断点后,您可以使用调试器全速执行( run )程序,直到达到断点。在那一点上,调试器将进入单步执行模式。具体操作步骤如下:
- 确保 ASM 源代码文件在编辑器窗口中打开。
- 在
mov eax,5
语句左侧的边框单击鼠标,边框上应该出现一个大红点。 - 从调试菜单中选择"开始调试"。程序运行到带有断点的行上暂停。(可选地,您可以关闭"诊断工具"、"自动"和"调用堆栈"窗口。)
- 逐步执行代码时程序输出会显示在控制台窗口中。
- 按下 F10 键以执行当前语句。继续按 F10 ,直到程序即将执行
invoke
语句。 再按一次 F10 以结束程序。
在暂停时,您的程序将如下所示:
寄存器
在调试程序时, CPU 寄存器中的值非常重要的。要想能看到它们的值,
- 首先,在"工具 >> 选项"菜单下,选择左侧的"调试",然后选择"启用地址级调试"。
- 接下来,在源代码中的可执行语句上设置一个断点,以调试模式运行程序。
- 从调试菜单中选择"窗口",然后从下拉列表中选择"寄存器"。
寄存器窗口会停靠在 Visual Studio 工作区,还可以在寄存器窗口中显示 CPU 标志,在寄存器窗口内右键单击并在弹出菜单中选中"标志"即可。
在调试菜单中选择"停止调试"可以中断调试会话,在工具栏上单击红色方块按钮也可以。要从程序中删除断点,请单击红点使其消失。