正文

Win32汇编语言程序设计教程[转]2005-09-22 13:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wukong/5100.html

分享到:

Win32汇编语言程序设计教程



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


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


add eax,edx


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


C 代码
a = a + b; >> C编译器 >> 汇编语言
add eax, edx >>汇编器>> 原始输出(十六进制)
66 03 C2



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


1.1-为什么?(Why?)
既然用汇编写程序很困难,那么为什么你用A汇编而不是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 hell是指由于dll新的版本被旧的版本给代替了。由于使用了dll新版本的程序仍然调用新的函数,导致了致命的错误。


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



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

阅读(3716) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册