Win32汇编的环境和基础- Win32汇编教程之一_人生的对决,首先要有勇气!
http://www.vckbase.com/document/viewdoc/?id=268

<iframe height="15" frameborder="0" width="728" scrolling="no" vspace="0" style="left: 0pt; position: absolute; top: 0pt;" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-4159669282587342&output=html&h=15&slotname=9155085061&w=728&lmt=1262938310&flash=0&url=http%3A%2F%2Fwww.vckbase.com%2Fdocument%2Fviewdoc%2F%3Fid%3D268&dt=1262938310554&prev_slotnames=4947706540&correlator=1262938310349&frm=0&ga_vid=1348213272.1262938310&ga_sid=1262938310&ga_hid=183510498&ga_fc=0&u_tz=480&u_his=1&u_java=0&u_h=800&u_w=1280&u_ah=770&u_aw=1280&u_cd=32&u_nplug=7&u_nmime=19&biw=1280&bih=633&ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dwin32%25BB%25E3%25B1%25E0%2B%25C2%25DE%25D4%25C6%25B1%25F2%26oq%3Dwin32hui%26f%3D3%26rsp%3D4&fu=0&ifi=2&dtd=6&xpc=mr0XiPMQRP&p=http%3A//www.vckbase.com" name="google_ads_frame" marginwidth="0" marginheight="0" id="google_ads_frame2" hspace="0" allowtransparency="true">

前言 ( VC知识库 )
许多学习VC的朋友希望更深入地学习编程:剖析操作系统底层结构、分析其它程序的代码、病毒与安全研究、硬件驱动的开发。这些都需要汇编的基础,而网上关 于WIN32汇编的教程却非常少,感谢罗云彬先生为我们带来了《罗云彬WIN32汇编教程》,该教程深入浅出,讲解详细易懂,非常适合学过VC又有基本的 汇编知识的读者阅读。在此对罗云彬先生答应VC知识库转载该教程表示感谢!同时欢迎大家访问。

汇编工具下载 ( 公欲善其事,必先利其器 )

文件
[][] Win32 汇编编译器,包含详尽的 Import 库,让你可以直接在汇编中使用 Win32API,内含 Microsoft MASM 6.14 大小:3997k
大小:3.66M
Borland 公司的32位汇编编译器,{wy}的缺陷是 Import 库不够全.大小:4.3M
Dos 下的汇编编译器工具包,包括 masm5.0,link,obj2asm,exe2bin,lib 等 大小:163K
Microsoft 的 nmake和 Borland 的 make,功能就不用我说了,大小:80K
我推荐汇编编程使用的编辑器,有关键字自定义颜色显示等所有你想得到的功能,这里是。
设置:先将语法文件 asm.stx 拷贝入安装后的目录,然后在 Tools->Preference 中设置 Font 到 Fixedsys,在 Syntax 中加上一项 ASM 即可。 大小:910K
资源编辑器,支持双字节 大小:2.16M
我见过{zh0}的 16 进制编辑器 大小:1.56M
Windows 程序的反汇编程序 大小:921K


一、32位环境简介

  在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断 等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系 统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任 何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程 一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。
在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M的内存,寻址时通过段寄存器来制定段的初始地 址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。
而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在{zgj}--0级中,所有应用程序都工作在3级中(Ring3), 在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说,系统才是全开放的。
在内存方面,Windows使用了处理器的分页机制,使得对应用程序来说,所有的内存都是“平坦”的,你不必用一个段寄存器去指定段的地址,因为在保 护模式下,段寄存器的含义是不同的(可以参见80386手册方面的书籍),你可以直接指定一个32位的地址来寻址4GB的内存。
在程序结构方面,Windows程序也有很大的不同,它是“基于消息”的,你可以想象这样一个常见的Windows窗口,上面有几个按钮,如果你用 Dos编程的思路去考虑,你会发现实现它很困难:鼠标移动到窗口边缘时拖动会改变窗口大小,鼠标点击按钮时再做要做的事,你会发现,你的程序自开始执行后 就在等待,你不知道鼠标先会点什么地方,实际上你是在等待所有可能的事情的发生。而在Dos下,你可以只顾自己先执行,需要用户输入时,再停下来,你不输 入我就不再执行,而且,我让你输入数据A你就不能输入数据B。
好了,言归正传,因为以上是Win32编程的基础,无论对Win32汇编还是VC++,它们都是一样的,下面我们来看看有关Win32汇编的内容。

二、Win32ASM编译器

  Win32ASM 的编译器最常用的有两种:Borland公司的Tasm5.0和Microsoft的Masm6.11以上版本,两种编译器各有自己的优缺点,Tasm带 了一个不大不小的Import库,而Masm没有带,但Masm在代码的优化上面好象比Tasm做得好,但它却不带Import库。看来使用哪一种编译器 还是比较难选择的,但Steve Hutchesson给了我们一个答案,他为Masm建立了一个很全的Import库,基本上包括了Windows绝大部分的Api函数,这些库、 include文件和其他工具还有Masm6.14版本一起做成了一个 Masm32编译器 -- Masm32V5。这样一来,我们用汇编编程就象用C一样方便。
因为有了Masm32V5,所以就我个人而言,我推荐使用Masm作为Win32ASM的编译工具,但Masm和Tasm的宏语法有很多的不同,我的这个教程是以Masm格式写的。

三、Masm32的环境设置

  在Win32编程中,由于Windows有很多的数据结构和定义,这些都放在include文件中,还有连接时要用到Import库(通俗的讲就是Windows提供的DLL文件中的函数列表,也就是告诉程序到哪里去调用API函数),这些都放在include 和lib目录中。我们在编译时要指定以下的系统环境:

set include=\Masm32v5\Include
set lib=\Masmv5\lib
set path=\Masmv5\Bin

这样编译器就会到正确的路径中去找 include 文件和 lib 文件。你可以自己在 autoexec.bat 文件中加上以上语句,为了产生Windows的PE格式的执行文件,在编译和连接中要指定相应的参数:

编译: Ml /c /coff 文件名.asm
连接: Link /SUBSYSTEM:WINDOWS OBJ文件名.obj 资源文件名.res

为了不在每次编译时都要打这么多的参数,我们可以用 nmake 文件来代为执行,nmake 是代码维护程序,他会检查 .asm .obj .exe .res 等文件的时间,如果你更新了源程序,他会自动执行编译程序或连接程序产生相应的文件。你可以在文件名为 makefile 的文件中指定使用的编译器和连接程序以及相应的参数,下面是一个 makefile 文件的例子:

NAME = Clock
OBJS = $(NAME).obj
RES = $(NAME).res
$(NAME).exe: $(OBJS) $(RES)
Link /DEBUG /SUBSYSTEM:WINDOWS $(OBJS) $(RES)
$(RES): $(NAME).rc
Rc $(NAME).rc
.asm.obj:
Ml /c /coff $(NAME).asm

文件告诉 nmake程序,程序名为 clock,产生 clock.exe 文件需要 clock.obj和 clock.res 文件,而产生 clock.res 文件需要 clock.rc 文件,产生 clock.obj 文件要用到 clock.asm 文件,至于是否需要执行 ml, link 和 rc,程序会根据文件的时间自动判断。

作者网站:


郑重声明:资讯 【Win32汇编的环境和基础- Win32汇编教程之一_人生的对决,首先要有勇气!】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——