开始使用 MASM(中译)

这篇文章好不容易从备份硬碟找出来,还好辛苦翻译的没有不见,看倌觉得有用就拿去用吧!下面的文章内容可能有些旧了,有空再更新吧!(2011/07/04)

Updated 3/4/2007
Hello 您好! 你买了Assembly Language for Intel-Based Computers, 第5版这本书, 现在你需要取得所有需要的软体并且设定好以方便你开始工作。 我们会尽可能地让这些程序很容易操作,假如你很急着要开始, 你只需要阅读项目1. 然后其他的等有空再来阅读。

  1. 32位元应用程式的设定

  2. 16位元程式的设定 (12-16章)

  3. 专案属性的设定

  4. 从头开始新增专案

  5. 产生原始码列表档案

  6. 使用Visual Studio 2005 debugger

  7. MASM 语法醒目功能

  8. 使用批次档组译 , 连结, 及侦错

发现文件有错误?请立即email 给作者Kip Irvine, 翻译上有什么不妥处,也请mail给我, 除了有提到的,所有文件中的操作都可以用于Visual Studio 2005 及 Visual C++ 2005 Express版本。


32-位元应用程式的设定

假如你正使用Visual Studio 2005 Professional or Team Suite, 这些产品已经包含了Microsoft Assembler 8.0. 你可以跳过步骤1及2直接到步骤3。

步骤 1: 安装 Visual C++ 2005 Express 版本

你购买的本书附有光碟片,光碟片中包含了Visual C++ 2005 Express 版本。你可以使用它来撰写, 编辑, 编译, 侦错及执行你的组合语言程式, 假如你没有收到光碟片,可以从微软 下载这个软体. (假如前面的连结已经改变, 到 http://msdn.microsoft.com/vstudio 搜寻这个版本下载.) 当你安装Visual C++ 时, 注意一下C++编译器被安装的位置, 这个资讯在后面会用到. 从现在开始, 我们会从 Visual C++ Express 的名字中抛开"2005" 这个词了。

步骤2: 下载并安装Microsoft Assembler

浏览Microsoft’s MASM 8.0 下载网站。在微软的网页跟着下载及安装的指示去作,假如这个连结坏了, 请 email让我们知道

步骤 3: 安装本书的范例程式

按下这个连结 取得本书最新的连结程式库及范例程式, 这些范例被存在可以自动解压缩到c:\Irvine 资料夹的一个压缩档中。除非你不喜欢使用这个位置, 不然不要改变这个路径, (实验室管理员: 你可以将 c:\Irvine 目录指定为唯读。) 假如你计划改变安装的位置, 请阅读我们关于改变专案属性 的相关操作指示. 下列的档案也会被复制到 c:\Irvine 目录中:

Filename

Description

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)

Link16.exe

16-bit linker

Irvine32.lib

32-bit link function library used with this book

Macros.inc

Include file containing macros (explained in Chapter 10)

SmallWin.inc

Small-sized include file, used by Irvine32.inc

User32.lib

Link library with Windows functions.

make16.bat

Batch file for building 16-bit applications

VirtualKeys.inc

Keyboard code definitions file, used by Irvine32.inc

有一个子目录Examples 里头有本书所有的范例。

步骤4: 建置一个组合语言程式的范例
预备步骤: 设定定位点的大小为 5

开启 Visual C++ Express, 并且从工具选单选择选项, 选择文字编辑器, 选择 所有语言, 并且选择 定位点:

20070606-1.png
设定定位点大小及缩排大小为 5。

开启专案

Visual Studio 及 Visual C++ Express 需要组合语言原始码属于一个专案当作容器, 专案roject 会有像是组译器, 连结器及所需程式库的位置的设定资讯, 专案会有自己命名的资料夹以及所有的档案都会在里头, 我们已经在c:\Irvine\Examples 目录里新增了专案的资料夹, 它的名称是Project_Sample. 依序执行下面的步骤:

  1. 开启 Visual Studio 或是 Visual C++ Express。

  2. 假如你使用 Visual Studio, 从档案选单选择 开启专案。或者 , 如果你使用Visual C++ Express, 选择 开启, 然后选择专案/方案。

  3. 点选到 c:\Irvine\Examples\Project_Sample 这个资料夹然后开启Project.sln 这个档案。

  4. 方案总管视窗里, 这个项目左边有个+的符号按下给它展开 , 用滑鼠双按main.asm 这个档案, 将它开启在编辑的视窗里, (Visual Studio 的使用者可能会看到一个弹出视窗询问在asm档案的编码方式 , 只要按OK按钮就可以继续。)

提示: 假如 方案总管 视窗没有看到, 在View选单中选择方案总管, 另外如果你在方案总管视窗没有看到main.asm 的话, 看一下视窗底下的tab键,按方案总管 tab。

在编辑视窗你将会看到下列的程式:

TITLE MASM Template				(main.asm)

; Description:
;
; Revision date:

INCLUDE Irvine32.inc

.data
myMessage BYTE "MASM program example",0dh,0ah,0

.code
main PROC
    call Clrscr

    mov  edx,OFFSET myMessage
    call WriteString

    exit
main ENDP

END main
稍后, 我们将告诉你如何复制这个程式作为你自己程式的起点
程式建置

接下来, 你将要建置(组译及连结)范例程式:

  • 假如你是使用Visual C++ Express, 从建置选单中选择建置方案

  • 假如你是使用Visual Studio, 从建置选单中选择建置专案

在荧幕下面的输出视窗里, 你应该会看到类似下面的讯息, 指示建置的程序:

------ 已开始建置: 专案: Project, 组态: Debug Win32 ------

Assembling...

Assembling: .main.asm

正在连结...

正在嵌入资讯清单...

已将建置记录储存于 "file://c:IrvineexamplesProject_sampleDebugBuildLog.htm"

Project - 0 个错误,0 个警告

========== 建置: 1 成功、0 失败、0 最新、0 略过 ==========

假如你没有看到这些讯息, 这个专案有可能再他上次建置的时候没有再变更, 没有问题–只要在文件里的某个地方加个空白,储存, 然后再试试建置。

执行程式

侦错选单里选择启动但不侦错, 下面的控制台视窗应该会出现, 虽然你的视窗会比这一个大一点: 20070606-2.png

”请按任意键…” 讯息是Visual C++ Express 自动产生的. 恭喜您, 你已经执行了你的第一个组合语言的程式。 按任意键关闭控制台视窗。

当你组译及连结这个专案时, 一个叫Project.exe 的档案会在project的 \Debug 资料夹下产生, 这个就是当你执行专案时执行的档案, 你可以在Windows的档案总管里双按Project.exe 这个档案来执行, 但是它只会出现荧幕闪一下然后就不见, 那是因为在命令列视窗关闭前档案总管没暂停这个显示。

新增你自己的专案

不久之后, 你会想要新增自己的专案, 最简单的方式就是复制整个c:\Irvine\Examples\Project_Sample 资料夹到新的位置 , 并且你有读写的权限。(假如你在学校的电脑实验室工作, 最好的位置就是使用USB随身碟, 然后你可以修改程式,闲置,执行它。

步骤 5: 以侦错模式来执行范例程式

在这个步骤里, 你可以在范例程式里设置中断点, 然后你可以使用Visual C++ debugger 一次一个叙述地执行程式。

  1. 在侦错模式下要开始逐步执行你程式, 按F10键。

  2. 有一个黄色的箭头会出现在第一行程式叙述左边(call Clrscr).这个箭头表示下一行要被执行的叙述。

  3. 按 F10 键 (called Step Over) 来执行现在这个叙述 , 继续按F10 直到程式执行到exit 叙述。

  4. 有一个小的黑色的视窗图像出现在Windows的状态列上, 开启并检视命令列视窗的内容 , 你会看到"MASM program example" 出现在视窗里。

  5. 再按 F10 以结束程式。

20070606-3.png

暂存器

假如你想显示CPU 的暂存器, 照着下面这样做: 开始侦错程式, 然后从侦错选单中选择视窗, 从下拉列表中选择暂存器, 下面的视窗会显示暂存器的内容, 对这个视窗按滑鼠右键并且将旗标这个项目勾选以开启状况旗标的显示。你可以在侦错选单里选择停止侦错于任何时候中断侦错, 你也可以在工具列上按下蓝色的按钮20070612-1.png来中断侦错, 要从程式移除中断点按下红色的点它就会不见。

设定中断点

假如你在程式设定中断点, 你可以使用侦错的功能来执行程式到这个中断点, 在那一点,侦错器来开始逐步执行。

  1. 在call WriteString 叙述左边的边缘按下滑鼠 , 在边边的地方会出现一个大的红点。

  2. 从侦错选单里选择开始侦错, 程式会执行并且在中断点这一行暂停 , 就像前面黄色箭头所显示那样。

  3. 按 F10 直至程式完成。

你可以用滑鼠按下红点来移除中断点, 花几分钟来实验侦错选单的命令, 设定更多的中断点再执行这个程式, 这一次你可以使用 F11 键来逐步执行就跟按 F10键那样来侦错。

建置并执行其他程式

假如你想要执行其他的程式, 或是想要新增自己的程式, 你可以编辑或修改这个main.asm, 或是你可以从project里移除main.asm 然后插入其他的.asm 档于 project里。

  • 要从 project 移除程式不用删除档案, 在方案总管视窗里的名字处按滑鼠右键 , 在选单里选择从专案移除, 假如你改变了想法决定将它再加回专案里, 在相同的视窗那里按滑鼠右键, 选择加入, 选择现有项目, 然后选择你想新增的档案。

  • 要从专案移除程式以及删除原始码, 可以用滑鼠选择档案按下Del 键 , 或者你可以用滑鼠右键这个档案然后选择移除。

新增档案到专案里

最简单的方式就是从档案总管拖拉组合语言的原始档案到方案总管的专案名字上来加入到已开启的专案, 在你的专案资料夹里会有一个参考产生, 现在这样试:

  1. 从你的专案移除main.asm 。

  2. 新增c:\Irvine\Examples\ch03\AddSub.asm 档案参考给专案。

  3. 建置并执行专案。

下面是在终端视窗所看到的结果, 除了EAX暂存器相同的值外可能其他的值都跟我们的都不一样:

当你按下任意键, 这个终端视窗就会关闭。

复制原始档案

假如你想要现行档案一个复制, 使用档案总管来复制你的档案到你的专案资料夹中, 然后在方案总管里滑鼠右键于专案名称处, 选择新增, 选择现有项目, 然后选择档案。 回到前面 或是阅读有关 专案属性的设定


建置16-位元应用程式(12-16章)

只有12 章到16 章需要建置16位元的应用程式, 除了一些例外会在本书中提到, 你的16位元的应用程式也可以在Windows XP 及 Windows Vista下执行。 假如你计划建置16位元的应用程式,你需要在Visual C++ Express (或 Visual Studio)的工具选单新增两个新的命令, 从工具选单里的外部工具新增命令, 下面的对话会出现, 虽然在功能表内容里的项目有很多可能没有:

20070612-3.png

步骤 1: 新增 Build 16-bit ASM 命令

按下加入按钮像上图那样填完标题, 命令,引数及初始目录, 在命令及引数的右边有一个箭头, 按下箭头会有一个便利的列表出现, 你可以不用担心会拼错:

20070612-5.png

按下 套用按钮存取这个命令。

步骤2: 新增 Run 16-bit ASM 命令

按下加入按钮新增一个新的命令叫做Run 16-bit ASM:

20070612-6.png

像上图那样填完资料后按下确定按钮储存命令然后关掉外部工具对话视窗。

测试你新的16位元命令

要测试你新的16位元命令, 在本书里的范例程式中的ch03的资料夹开启16-bit.asm 的档案, 选工具选单里选择Build 16-bit ASM, 下面的命令视窗会出现, 显示成功组译及连结的执行, 以及跟程式相关的档案列表:

20070612-7.png

按下任意键来关闭视窗, 接下来我们要执行程式, 在工具选单里选择Run 16-bit ASM , 下面的视窗会出现, 除了EAX暂存器的值一样外其他的暂存器的值有可能会不一样:

20070612-8.png

按下任意键来关闭视窗。 你已经完成了建置及执行16位元组合语言程式的设定。

回到前面

专案属性设定(额外的主题)

我们想你可能会想知道更多有关Visual C++ 专案来设定组合语言程式。 假如是这样, 我们会进行专案组态的重要部份。 假定我们的范例专案还开着, 从专案选单选择Project 属性, 按下组态属性展开, 然后按下Microsoft Macro Assembler 8.0展开, 你会看到下图这样:

20070612-9.png

Microsoft Macro Assembler 8.0。 里按下 General , 注意Include Paths 选项已经设为c:\Irvine 目录了, 这个选项可以告诉组译器哪里可以找到".inc"副档名的档案, 下面是个例子:

20070612-10.png

组态属性里找到连结器这个项目, 选择输入这个项目, 并且注意在其他相依性这个项目里已经有两个档案被加入了, user32.lib 档是标准的MS-Windows 档案, irvine32.lib 档案是本书提供的连结程式库, 两个档案之间必须保留至少一个空白字元来分开:

20070612-11.png

接下来,仔组态属性下选择连结器, 然后选择一般其他程式库目录选项会是 c:\Irvine, 所以这个连结器可以找到 Irvine32.lib 这个程式库档案:

20070612-12.png

组态属性下选择连结器, 选择侦错, 注意产生侦错资讯选项设为Yes: 20070612-13.png

连结器下选择系统, 注意子系统选项设为主控台 (/SUBSYSTEM:CONSOLE): 20070612-14.png

我们使用主控台 (/SUBSYSTEM:CONSOLE)设定因为组合语言程式可以容易地输出到文字视窗中, 这个视窗可以在开始>执行选单中执行cmd.exe 来看到。 按下确定按钮来关闭 Project 属性页视窗。 回到前面


产生原始码列表档案

在 7/26/06之前, 书中下载的Visual Express 专案范例档案不能产生原始码listing files, 这里会说明在单一专案如何改变: 开启专案, 从选单选择专案, 选择专案属性, 在列表里面选择Microsoft Macro Assembler, 然后选择Listing File, 设定Assembled Code Listing file 选项为$(InputName).lst . 回到前面


从头开始新增专案

你不需要完全自己来新增自己的专案, 坦白来讲这很费功夫, 我们已经在本书的范例程式中的每个资料夹都复制了一份Project_sample 专案, 你只要在这些专案里新增自己的程式就行了, 但是这里要介绍如何新增自己的: 当然你可以命名你想要的专案, 但是我们现在假定你的专案是MyProject 来作为范例, 然后存到c:\temp 目录里, 这些命令有点不同, 完全视你所使用的软体而变:

Visual C++ Express

1. 从档案选单选择新增, 然后选择专案。 2. 在新增专案视窗里头, 选择一般, 然后选择空专案作为专案型别: 20070612-15.png

你可能会将为方案建立目录 选项不要勾选。 3. 按下确定来新增空专案。

Visual Studio
  1. 档案选单里选择新增,选择专案

  2. 在新增专案对话盒里 (见下图), 选择其他语言, 选 Visual C++, 选 一般, 然后选 空专案.

  3. 给专案一个名称以及选择位置,不要改变任何其他选项。

  4. 按下确定按钮。

你也可能想要将为方案建立目录的选项不要勾选。

Visual Studio 及 Visual C++ Express
  1. 使用档案总管或我的电脑从\examples\Project_sample 资料夹复制main.asm 档案道理要新增的专案里 。 (在我们的范例里这个资料夹命名为MyProject)。

  2. 回到Visual Studio 或 Visual C++ Express, 在方案总管视窗里滑鼠右键按下你的专案名称 , 选择加入, 选择现有项目, 然后选择main.asm. (这个档案可能不会出现, 你可以在档名的对话盒输入*.asm 看看。) 按下加入将它新增到你的专案里。

  3. 从专案选单里选择自订建置规则, 你会看到可用的规则档的列表可能会跟我们的有所不同 , 在Microsoft Macro Assembler 这个选项给勾选:

20070612-16.png

按下确定按钮来关闭这个视窗。

7. 接下来,你需要一些定制化, 我们会假设你已安装了本书的档案在c:\Irvine 目录里, 依照文件里的专案属性设定这节来改变, 假如你不是安装在c:\Irvine, 你需要对专案属性做些适当的改变。

8. 选择 建置专案, 假如你的输出视窗跟下面的讯息一样, 那就表示你做对了:

------ 已开始建置: 专案: myProjet, 组态: Debug Win32 ------

Assembling... Assembling: .main.asm

正在连结...

正在嵌入资讯清单...

已将建置记录储存于 "file://c:temp\myProjet\Debug\BuildLog.htm"

myProjetc - 0 个错误,0 个警告

========== 建置: 1 成功、0 失败、0 最新、0 略过 ==========

回到前面


MASM 语法醒目功能

在下面的图示里, Visual Studio 及 Visual C++ 2005 Express 可以将MASM 的保留字给醒目化: 20070612-17.png

这个功能需要两个步骤来完成:

1) 下载Usertype.dat 档到C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 资料夹里。

2) 开启 Visual Studio 或 Visual C++ 2005 Express, 从工具选单里选择选项, 选择文字编辑器, 选择副档名, 在右边的对话盒里输入asm 作为副档名, 从编辑器选择Microsoft Visual C++, 然后按加入按钮, 按确定来储存你的改变。

20070612-18.png

 

回到前面

 

用批次档来组译,连结及侦错

很多人喜欢用Windows 的批次档来组译及连结程式, 批次档是一个文字档里面包含了一系列的命令来执行就像在命令列提示字元下输入的一样, 事实上,它们也够威力来执行变数, 回圈,IF 叙述等等。 要执行批次档最简单的方法就是先开启命令列提示字元视窗,然后在提示下输入批次档的名称来执行(有时需要参数), 要开启命令列提示字元, 你必须执行一个叫cmd.exe 档案, 我们会让制作批次档可以更简单。 按滑鼠右键下载这个zip档 , 这个档含有下列的项目:

  • 一个到cmd.exe的捷径, 可以在目前的目录下开启命令列提示字元

  • asm32.bat, 一个组译及连结程式的批次档

  • main.asm, 一个组合语言范例档

在你的电脑上解压缩这个压缩档在c:\Irvine\Examples 目录里, 然后照着下面的作:

  • 复制 asm32.bat 到你的系统路径的任何一个目录中 , 假如你使用Windows XP, 你可以存放到c:\Windows 资料夹中。 (假如你使用Windows 2000, 存放到c:\Winnt 资料夹中 。) 在你的系统路径上有asm32.bat 允许你在命令列提示字元下输入asm32 来执行。

  • 双按cmd.exe 捷径 , 命令列提示字元就会出现:

20070612-19.png

在这个视窗的命令提示下, 执行asm32 批次档, 在输入下面的命令后按下Enter:

    asm32

输入下列的命令来组译及连结一个叫main.asm的原始档案:

    asm32 /L main

你应该会看到下列的讯息:

Assembling: main.asm
The file main.obj was produced. ..................................
Linking main.obj to the Irvine32, Kernel32, and User32 libraries.
The file main.exe was produced. ..................................

事实上有几个档案会产生。

  • main.obj – 目的档

  • main.ilk – 累加连结状态档

  • main.pdb – 侦错符号档

假如这个程式有错误, 你可以看到组译器产生的错误讯息, 这里有个范例: Assembling: main.asm main.asm(9) : error A2008: syntax error : myMessage main.asm(15) : error A2006: undefined symbol : myMessage 你可以用文字编辑器(像是Notepad)来开启main.asm, 修正错误, 再执行asm32批次档。

虽然你在这个范例中使用叫main.asm 的档案,asm32.bat 批次档可以用来任何的组合语言档案, 不论它的档名, 唯一的需要是要有.asm 副档名的组合语言程式。

在其他目录里组译程式

无疑地, 你会想要在不同的资料夹下组译程式, 不只是前述范例所使用的batch_sample 资料夹, 你所要作的就是复制cmd.exe 捷径到任何你所要用的目录下, 这个目录是你放你的组合语言的位置, 当你双按来执行这个捷径时, 它会在目前的资料夹里开启一个命令列提示字元的视窗。

组译,连结及侦错

除了组译及连结之外, 你可以使用asm32.bat 这个批次档在Visual Studio debugger开启你的档案。 试试下面的命令:

    asm32 /L /D main

假如程式组译及连结没有错误, 你的程式就会载入到Visual Studio, 第一次你开始使用这个新的程式这个原始码可能不会出现, 你要作的就是按下F10 键来开始侦错, 而你的程式也会出现伴随着一条黄色为底出现在程式的第一行:

(要是你的Visual Studio 如何设定, 你可能必须按F8 键才可以如此。) 从这里,你可以逐步执行程式, 当你执行到call  WriteString这个叙述, 你可以按F11键进入它的程式, 当你结束时, 关闭 Visual Studio, 从这次开始, 当你在 Visual Studio debugger载入相同的程式时, 你的原始码就会正确地出现。

只有组译没有连结

偶尔, 你可能想要组译程式却不连结, 举例来说,当你建立一个多模组的专案,在你把它们连结成最后的执行档之前你想要分别组译每个asm档案为 obj 档, 或者, 你想要组译一个模组新增进入一个连结的程式库 (像是 Irvine32.lib), 要只组译一个原始档案, 输入下列的命令:

    asm32 main

你应该会见到下列的输出:

 Assembling: main.asm
The file main.obj was produced. ..................................

假如你有兴趣学习更多有关批次档的资讯, 这里有一些连结可以参考:

连结很可能很快就会过期, 但是你可以用Google找 ,并且相信可以找到一堆的连结。