Win32

来源:互联网 发布:mysql如何执行sqltxt 编辑:程序博客网 时间:2024/06/05 19:09

1、什么是Win32?

 Win32是指你现在所使用的操作系统是32位的windows环境

Win32的重要意义?

  从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。
  理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。
  因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
  线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

二者关系

  线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

操作系统分类

  根据进程与线程的设置,操作系统大致分为如下类型:
  (1)单进程、单线程,MS-DOS就是这种操作系统;
  (2)多进程、单线程,多数UNIX(及类UNIX的LINUX)是这种操作系统;
  (3)多进程、多线程,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是这种操作系统;
  (4)单进程、多线程,VxWorks是这种操作系统。

引入线程的好处

  在操作系统中引入线程带来的主要好处有:
  (1)通过进程来创建、终止线程比单独地通过应用程序来创建、终止线程要快;
  (2)同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外,线程的出现还有以下几个原因:
  ①并发程序的并发执行,在多处理环境下更为有效。一个并发程序可以建立一个进程,而这个并发程序中的若干并发程序段就可以分别建立若干线程,使这些线程在不同的处理机上执行。
  ②每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间。这样可以解决父子进程模型中,子进程必须复制父进程地址空间的问题。
  ③线程对解决客户/服务器模型非常有效。

Dos汇编的特点

  在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汇编的内容。

编辑本段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,程序会根据文件的时间自动判断。

编辑本段Win32ASM程序的结构和语法

  让我们先来看看一个最简单的Win32汇编程序:
  .386
  .model flat, stdcall
  option casemap :none ; case sensitive
  include windows.inc
  include kernel32.inc
  includelib kernel32.lib
  .data
  szCaption db 'Win32汇编例子',0
  szText db 'Win32汇编,Simple and powerful!',0
  .code
  start:
  invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
  invoke ExitProcess,NULL
  end start
  这就是一个能执行的最简单的Win32汇编程序,下面我简单地介绍一下各部分的作用:

386

  这条语句和Dos下汇编是一样的,是告诉编译器我们要用到80386的指令集,因为32位汇编程序要用到32位的寄存器如eax,ebx等,所以这一句是必须的,当然,你也可以用.486,.586等,当用到特权指令时,还可以用 .386p,.486p等等。

include 语句

  include 语句包含了一些系统的定义和API函说明,其中所有的Windows 数据结构定义和常量定义包含在 windows.inc 中,而其他 API函数的说明包含在 xxx.inc 中, 如查 Microsoft Win32 Programmer's Reference 知道 ExitProcess包含在kernel32.dll 中,那么我们就要在程序中包括 include kernel32.inc 和 includelib kernel32.lib语句,否则在编译时会出现 API 函数未定义的错误。而 MessageBox 在 user32.dll 中,那么我们就要在程序中包括 include user32.inc 和 includelib user32.lib语句

data 或data

  指明了接下来是数据段,.data 定义了预定义的变量,.data?定义了未初始化的变量,两者的不同之处是 .data? 定义的变量并不占用 .exe 文件的大小,而是在程序执行时动态分配,所以开始是不指定初始值的数据可以放在 .data? 段中,如一个1K大小的缓冲区,放在 .data?中,程序将不会增加一个字节。

code

  指明了接下来是代码段,我们的所有代码都放在这里。最后的一句 start 语句指定了程序开始执行的语句。程序中的 ExitProcess 是一个标准的 Win32 API,对应 Dos汇编中的 int 20h 或 mov ah,4ch/int 21h,也就是程序退出。而 MessageBox 也是一个标准的 API,功能是在屏幕上显示一个消息框,具体的参数上面已经解释过了还有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 语句中, MB_OK 和 NULL 已经预定义在 Windows.inc 中。
原创粉丝点击