飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1537|回复: 0

win32asm基础教程

[复制链接]

该用户从未签到

发表于 2007-8-17 22:39:36 | 显示全部楼层 |阅读模式
win32asm基础教程

先来对这个教程做个小介绍。Win32Asm不是一个非常流行的编程语言,而且只有为数不多(但很好)的教程。大多数教程都集中在编程的win32部分(例如,winAPI,使用标准Windows编程技术等),而不是汇编语言本身,例如伪代码(opcodes),寄存器(registers)的使用等。虽然你能在其他教程中找到这些,但那些教程通常是解释Dos编程的。它当然可以帮你学汇编语言,但在Windows中编程,你不再需要了解Dos中断(interrupt)和断口(port)In/our函数。在Window中,WindowsAPI提供了你可在你的程序中使用的标准功能(function),后面还会对此有更多内容。这份教程的目标是在解释用汇编编Win32程序的同时学习汇编语言本身。

1.0汇编语言

汇编是创造出来代替原始的由处理器理解的二进制代码的。很久以前,但是尚没有任何高级语言,程序是用汇编写的。汇编代码直接描述处理器可以执行的代码,例如:

add eax,edx

这条指令-add-把两个值加到一起。Eax和edx被称为寄存器,它们可以保存值在处理器内部。这条代码被转换为66 03 c2(16进制)。处理器读这行代码,并执行它所代表的指令,像C等高级语言把它们自己的语言翻译为汇编语言,而汇编程序又把它转换为二进制代码:

C 代码
>> C编译器 > >
汇编语言
>>汇编器>>
原始输出(十六进制)

a = a + b;
add eax, edx
66 03 C2


(注意该处的汇编语言的代码被简化了,实际输出决定于C代码的上下文)

1. 1-为什么?(Why?)

既然用Asm写程序更困难,为什么你用Asm而不是C或者别的什么??-汇编产生的程序更小而且更快。在有人工智能的高级编程语言中,编译器要产生输出代码变得(比汇编)更困难。编译器必须指出最快(或最小)的方式产生汇编代码,而且虽然编译器变得越来越好,你自己来写(汇编)代码(包括可选的代码优化)能生成更小更快的代码。但是,当然,这比高级语言难多了。还有另一个与某些使用运行时dll的高级语言不同的地方,它们在大多数时运行良好,但有时由于dll版本(dll hell)产生问题而用户总是要安装这些Dll。对于Visual C++,这不是一个问题,它们是与Windows一同安装的。而Visual Basic甚至部把自己的语言转换为汇编语言(虽然5版本及以上作了一些,但不完全)。它高度依赖msvbvm50.dll-Visual Baisc虚拟机。由VB产生的exe文件仅仅存在简单的代码和许多对这些dll的调用。这就是vb慢的原因。汇编是所有中最快的。它仅仅用系统的dll像Kernel32.dll, User32.dll等。

另一个误解是许多人认为汇编不可能用来编程。当然,它难,但不是不可能。用汇编创建大的工程的确很难,我只是用它来写小程序,用于需要速度的代码被写在能被其他语言导入的dll中。而且,Dos和Windows还有一个很大的区别。Dos程序把中断当“函数”用。像中断10用于显示,中断13用于文件存储等。在Windows中,API函数只有名字(比如MessageBox, CreateWindowsEx)。你能导入库(DLL)并使用其中的函数。这使得用asm写程序简单多了。你将在下一章中学习更多关于这方面的知识。

2.0开始

介绍已经够多了,现在让我们开始吧。要用汇编写程序,你需要一些工具。下面,你能看到我将在本教程中用哪些工具。我建议你安装同样的工具,因而你能跟着教程试验那些例子。我也给处一些其他选择,虽然你能选择其中的大部分,但是要警告的是在汇编器(masm,tasm和nasm)中有很大的区别。在这个教程中,将使用masm,因为它有很有用的功能(像invoke),它使得编程更容易。当然,你可以自己选择你更喜欢的汇编器,但这将使你更难跟着教程走而且你不得不把教程中的例子进行处理使它可以在你用的汇编器中运行。

汇编器

我的选择:Masm(在win32asm包中)

网址:win32asm.cjb.net

描述:一个把伪代码(opcodes)翻译为给处理器读的原始输出(object文件)的汇编器

关于:Masm,宏(macro)汇编器,是一个有很多有用的特色的汇编器。像“invoke”,它可以简化对API函数的调用并对数据类型进行检查。你将在本教程的后面学习这些。如果你读了上面的文字你就知道本教程推荐使用masm。

供选择:Tasm[dl],nasm[dl]

链接器

我的选择:微软附加链接器(link.exe)

网址:win32asm.cjb.net(在win32asm包中)

描述:链接器把对象(object)文件和库文件(用与DLL导入)“链接”到一起输出最终的可执行文件。

关于:我会用Iczelion的Win32asm包中的link.exe。但大多数的链接器都可以用。

供选择:Tasm linker[dl]

资源编辑器

我的选择:Borland资源编辑器
在开始 win32asm 编程前需要做哪些准备?

至少, 你需要32位Windows :) 可以是Windows 95/98/NT/2000. 就我的个人意见, 最好的编程平台是Windows NT/2000, 因为它更稳定, 此外, 一些有着在Windows 95/98中会被忽略的小错误的程序运行在Windows NT/2000下将立即得到错误通知.

你必须要有一些汇编语言的基本知识. 如果你是一个完全的汇编语言新手, 你可以在网上寻找一些教材和指南. 完整的汇编书籍站点是 Randal Hyde's The Art of Assembly Language Programming. 注意这本书是关于16位DOS汇编的. 当然, 无论在OS/Windows 还是 Linux中, 基本的汇编命令是相同的. 我已经网上找到一些教授32位汇编语言的地方. 下一步是学习更多的关于一般Windows 编程的知识. 关于这方面, 可以找到的最好的书是Charles Petzold 的 《Programming Windows 95》. 这本书不是在线读物,你可以从本地的书店里购买。你将发现这本书的价值远远高于他的价格。

现在需要结合你的汇编语言的Windows编程两方面的知识以使得工作更加容易。我写了一些关于这个主题的指南,你可以在下面的网站找到: http://win32asm.cjb.net.

需要的工具是:

编译/连接器(Assembler/Linker). 你可以使用好几个编译器. 我更喜欢微软宏汇编 (MASM). 你可以从以下站点免费下载 http://masm32.cjb.net. 它包含在叫做 MASM32 的包中. 你也可以使用 Borland/InPrise 的 Turbo Assembler (TASM) 和 NetWide Assembler (NASM). TASM 未作为一个单独的产品升级. 最后的版本是5.0r. 此外, 它不是免费的. NASM 是一个自由软件汇编器. 可是,就我所知,它的定位并不在 win32asm. 它更多的用在Linux中. 你可以从以下站点下载最新版本的 NASM : its main page. 还有一个新的自由软件汇编器叫 SpAsm ,也可以使用. 它包含一个IDE和内置的调试器(debugger).
文本编辑/综合编程环境(Text Editor/IDE). 你可以使用任何文本编辑器. 我一般用 UltraEdit. 有的人更喜欢 WinEdit. Justin Decker 编的 VisualASM 是一个MASM的IDE. 对 TASM 用户来说, 可能会发现 TASM IDE 更让你喜欢.
资源编辑器(Resource editor). 如果你需要设计对话框,菜单,图标,光标等,就需要一个好的资源编辑器。 有几个资源编辑器可以选择. 比如, Borland Resource Workshop (BRW), Symantec Resource Editor. 我更喜欢整合到 Visual C++ IDE 中的那个资源编辑器.
Win32 API 参考. 在你编程过程中需要频繁的查找这个参考. 你可以从这个站点下载免费版本:Borland/InPrise site. 然而, 这个版本比较过时. 在里面找不到最新技术的信息. 在 Microsoft Developer Network有很多关于这个参考的升级更新信息,如果你能买到MSDN的CD那是最好的了,它将使得你的知识库里拥有许多很棒的资源。
调试器(Debugger). 相信我, 你需要一个调试器来找出你程序中的bug. 可以买到的最好的软件调试器是 SoftICE. 还有一个 Netwalker 的免费调试器,可以从这里下载: my site
概略的讲, 如果你想使用 MASM, 下载 MASM32 package 然后阅读 my win32asm tutorials. 我高度建议你使用 MASM: 99% 的 win32asm 程序员使用 MASM 所以你可以更容易的获得许多支持.
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表