Win32汇编的环境和基础

1.32位环境简介

在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。

在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M的内存,寻址时通过段寄存器来制定段的初始地址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。

而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在最高级--0级中,所有应用程序都工作在3级中(Ring3),
在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说,系统才是全开放的。

在内存方面,Windows使用了处理器的分页机制,使得对应用程序来说,所有的内存都是“平坦”的,你不必用一个段寄存器去指定段的地址,因为在保护模式下,段寄存器的含义是不同的(可以参见80386手册方面的书籍),你可以直接指定一个32位的地址来寻址4GB的内存。

在程序结构方面,Windows程序也有很大的不同,它是“基于消息”的,你可以想象这样一个常见的Windows窗口,上面有几个按钮,如果你用Dos编程的思路去考虑,你会发现实现它很困难:鼠标移动到窗口边缘时拖动会改变窗口大小,鼠标点击按钮时再做要做的事,你会发现,你的程序自开始执行后就在等待,你不知道鼠标先会点什么地方,实际上你是在等待所有可能的事情的发生。而在Dos下,你可以只顾自己先执行,需要用户输入时,再停下来,你不输入我就不再执行,而且,我让你输入数据A你就不能输入数据B。
好了,言归正传,因为以上是Win32编程的基础,无论对Win32汇编还是VC++,它们都是一样的,下面我们来看看有关Win32汇编的内容。
2.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格式写的。
3.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,程序会根据文件的时间自动判断。

时间: 2024-10-09 16:13:08

Win32汇编的环境和基础的相关文章

"hello,world!"win32汇编小程序

"hello,world!"win32汇编小程序szText db "Hello, world!",0 szCaption db "Win32Asm",0 .codestart: push MB_OK lea eax,szCaption push eax lea eax,szText push eax push NULL call messageboxa xor eax,eax push eax call exitprocess end star

代码-win32汇编加速键不好使怎么解决?

问题描述 win32汇编加速键不好使怎么解决? 什么加载加速键,消息循环,响应都弄了,就是不好使 代码:http://pan.baidu.com/s/1o6p6kx8 解决方案 参考:http://wenku.baidu.com/link?url=VJlWwe9eL2dZIazPNIh1YAEisFrJPmScDdfXrpQfp7z9yGq_bSc_IlOrhua5AdvBCJbpuVTAWL_vJN4KGFcXNyafJToLglEaNqWULIdNzku 解决方案二: 参考:http://b

用win32汇编画八卦图

汇编程序的图: 这几天在学习汇编语言的图形操作,于是想起以前用C#画过个小八卦图 半径R自己给-- Graphics g = e.Graphics; Brush fillWhiteBrush = Brushes.White; Brush fillBlackBrush = Brushes.Black; g.FillPie(fillWhiteBrush, 0, 0, r, r, -90, -180);//左半圆 g.FillPie(fillBlackBrush, 0, 0, r, r, 90, -1

如何创建汇编工作环境

创建汇编工作环境 这里以Windows平台+masm32为例,解释一下建立工作环境要完成的几项工作. 第1.安装好操作系统 无论你是使用Windows/Linux/Unix还是其它什么操作系统,请先安装好并确保它能够正常运行. 第2.获得所使用的软件 对于masm32可以从www.masm32.com下载,这是一个免费软件开发包. 第3.安装得到的软件 在windows下安装,想必大家都知道了,setup.exe/install.exe.如果你的软件将在命令行方式下使用,这时一定记下软件安装的路

win32汇编-WIN32汇编键盘钩子截获全部键盘

问题描述 WIN32汇编键盘钩子截获全部键盘 普通的键盘钩子只能截获普通的键盘操作,但是不能截获到shift等系统键,求问怎么样截获所有的键盘操作 解决方案 http://www.cnblogs.com/zudn/archive/2010/12/15/1906374.html 解决方案二: win32程序测试键盘钩子win32程序测试键盘钩子

win32-求教WIN32汇编如何向后引用变量?

问题描述 求教WIN32汇编如何向后引用变量? 假如我定义一个宏: DEFVAR macro TYPE,VARNAME,VALUE .data ifnb VARNAME TYPE VALUE else VARNAME TYPE NULL endif .code endm 然后在一个对话框消息回调函数里定义: .code _DlgProc proc hWnd,uMsg,wParam,lParam mov eax,uMsg .if eax == WM_CLOSE invoke EndDialog,h

界面划窗口设计-WIN32汇编中窗口设计,新手求帮助

问题描述 WIN32汇编中窗口设计,新手求帮助 .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data? hInstance dd ? nhWnd dd ? .data SZClassName db "My Windows" SZW

《混合云计算》——第一部分 理解概念和构成 第1章 发现你的计算环境的基础1.1 解构云计算的概念

第一部分 理解概念和构成 第1章 发现你的计算环境的基础 本章内容 解构云的概念 发现资源池/云计算模式和服务 评估数据中心的作用 发现公共云和私有云分别适合什么场景 事情变化得很快.云计算已经从一个危险和混乱的概念,发展成为大小机构都开始采用并作为其整体计算战略的一部分.几年前,当Hurwitz&Associates公司编写<云计算傻瓜书>时,还有很多的怀疑.企业会真正愿意采用云计算吗?云计算到底是什么,它如何帮助企业变得更有效呢? 在很短的时间内,市场已经走过了很长的路.今天,越来

汇编教程:ODBC基础

这是使用 win32asm进行数据库编程系列的第一份教程.在如今的IT界,数据库编程变的越来越重要,所以我们不能再忽视它.但如今有很多种数据库在使用,如果我们为了实现win32下数据库汇编语言编程而学习各种数据库文件格式,所花时间大概称得上"永恒". 幸运的是,Microsoft的一项技术使得我们得以摆脱这个大麻烦.它被称为ODBC,是开放式数据库互连(Open Database Connectivity)的缩写,这是一族API,与Windows API相似.它主要与数据库打交道.就是