Win32汇编学习笔记之基础篇


基础篇

第一章 背景知识

1.1 Win32的软硬件平台

1.1.1    80x86系列处理器简史

Win32可以在多种硬件平台上运行,但使用最广泛的硬件平台是基于Intel公司80x86系列处理器的微型计算机。

19786Intel公司推出它的第一个16位微处理器8086以来,计算机技术就开始进入飞速发展的时期。8086芯片的主频为4.43MHz,集成的晶体管数大约为2.9万个,运算器的位长为16位,采用了20条地址线,可以寻址的范围为220个字节地址,即1 MB1982年,该公司发布了80286处理器,芯片上集成了12万个晶体管,主频提高到了12 MHz

1985
Intel公司推出32位的80386处理器,芯片上集成的晶体管数为27.5万个,主频提高到了33 MHz,地址线则扩展为32条,直接寻址的能力达到4 GB80386处理器在设计的时候考虑了多用户及多任务的需要,在芯片中增加了保护模式、优先级、任务切换和片内的存储单元管理等硬件单元。80386的出现使WindowsUNIX等多任务的操作系统可以在PC上运行。直到现在,运行于80x86处理器之上的多任务操作系统都是以80386的运行模式为基础的。

1989
年,Intel公司推出80486处理器,在芯片内集成了浮点处理器和8 KB的一级缓存,片内的晶体管数达到了118万个,并把主频提高到50 MHz66 MHz80486处理器开始使用流水线技术,即在CPU中由56个不同功能的电路单元组成一条指令处理流水线,然后将一条指令分成56步后再由这些电路单元分别执行,由此提高CPU的运算速度。电路单元的数目就是流水线的深度。为了使计算机中的其他部件不至于成为CPU速度发展的瓶颈,80486处理器开始使用了倍频技术,即让处理器速度(CPU主频)数倍于系统总线速度(外频)。

80386开始,在Intel公司向市场大量推出处理器芯片的同时,其他一些电脑公司和厂商如AMDCyrix等,也纷纷投入大量的人力财力进行处理器的开发和研制,并很快把研制出的产品推向市场。这些CPU芯片和80386芯片兼容,在编程上可以使用和Intel处理器相同的指令集。

1993
3Intel公司推出80586处理器。由于无法阻止其他公司把自己的兼容产品也叫做x86,所以把产品取名为Pentium,并且进行了商标注册,同时启用了中文名称奔腾Pentium芯片中集成了310万个晶体管,内置16KB缓存,主频有60 MHz66MHz两个版本,后来逐步提高,到19956月时主频提高到了133MHzPentium处理器采用许多新技术,其中最重要的变化是采用了超标量体系结构。即将两个同时工作的指令执行部件封装在同一芯片中,用两条并行的通道来执行指令,这相当于两个CPU同时工作,大大提高了处理速度。在586时代,AMDCyrix等其他公司也推出了相应档次的CPU,命名为5x86K5等。

1995
11月,Intel公司推出代号为P6的新一代PentiumPro处理器,中文名称为高能奔腾PentiumPro芯片中集成了550万个晶体管,主频分150 MHz200 MHz多个版本。片内集成了3条平行的指令执行通道,相当于3CPU并行工作,并用超流水线技术将流水线的深度提高到了14级。P6处理器内置16KB一级高速缓存,并将256 KB512KB的二级高速缓存芯片与CPU内核芯片同时封装在一个外壳中,缩短了CPU和二级高速缓存之间的线路走线距离。同时,P6处理器开始使用乱序执行和分支预测技术,这使下一条指令不一定要等到前一条指令执行完毕后才可以开始。所有这些技术使这种CPU在运行32位指令系统时的执行效率明显高于上一代Pentium

随着CPU和操作系统的发展,多媒体技术开始流行,表明依靠浮点处理器已经不能满足多媒体音频和视频信号的实时处理任务了。1997年初,Intel公司在PentiumPro芯片上增加了专用于多媒体处理的57条指令和864位专用寄存器,命名为Pentium MMXPentiumMMX使用了450万个晶体管,最高主频达到了233 MHz

1997
5月,Intel公司又向市场推出了Pentium II芯片,中文名称为奔腾IIPentiumII内集成了750万个晶体管,最高主频达到了300 MHz,也具有MMX的功能。这种处理器将二级高速缓存移到芯片外,以提高芯片成品率。为了照顾低端市场,1998Intel公司推出了除去二级高速缓存的Pentium II简化版,命令为Celeron处理器。由于其缺乏片内二级高速缓存,对速度的影响非常巨大,使Celeron处理器的实际性能非常低。19984月,Intel公司又把128KB二级高速缓存加回到Celeron处理器中,命名为CeleronA处理器。Celeron A的主频从300MHz开始。

1999
年,Intel公司推出集成了950万个晶体管,主频为450 MHz500 MHz,外频为100MHzPentium III处理器。这种处理器新增了SSE指令集,提供70条全新的指令,可以大大提高3D运算、动画片、影像与音效等功能,增强了视频处理和语音识别的功能。这套指令集主要为浏览WWW网页而设计。PentiumIII处理器在芯片内集成了64 KB的一级缓存,并将512KB的二级缓存安装在外壳卡盒内。

2000
11月,Intel公司发布集成4200万个晶体管的Pentium 4处理器,主频达到了1.4 GHz,系统总线速度为400 MHz,流水线的深度提高到20级,并增加了SSE2指令集,提供144条新指令用于提高摄像、多媒体、3D图像和密集运算等方面的速度。时至今日,Intel公司已经发布了主频超过2 GHzPentium 4处理器。

从第一块微处理器诞生至今,处理器技术发展出不少新的体系结构。从微处理器的指令系统来看,有两种分支走向,一种是CISC;一种是RISCCISC即复杂指令系统计算机。从PC诞生以来,人们一直沿用CISC指令集方式。它的指令不等长,指令的条数比较多,编程和设计处理器时都较为麻烦。在CISC之后,人们发明了RISC,即精简指令系统。这种指令系统采用等长的指令,且指令数较少,通过简化指令可以让计算机的结构更为简单,进而提高运算速度。

Intel
80x86系列处理器看起来属于CISC体系,但实际上,从Pentium处理器开始,都已不是单纯的CISC体系了。因为它们引入了很多RISC体系里的先进技术来大幅度提高性能。但是,好马也得配好鞍——没有软件支持的CPU再快也不是好CPU。为了兼容已有的软件,80x86系列处理器也不得不背上沉重的历史包袱。如CPU的位长还是停留在32位;在寄存器、运行模式与内存管理模式等方面还是继承了早期的80386模式;80386以后的处理器虽然增加了不少新指令,但大多用于多媒体扩展,其中很少有和操作系统密切相关的指令。所以,如果不涉及3D及密集运算方面的运算,仅从操作系统的角度看,这些处理器只能算是一个快速的80386处理器而已。

1.12     Windows的历史

  1985 年,微软发布 Windows 1.0,借助这款不太成熟的图形操作系统,用户可以使用鼠标完成任务,而无需键入 MS DOS 命令。这一版本附带了若干个应用程序,例如 MSDOS 文件管理、画图、Windows 编写器、记事本、计算器、日历、时钟、翻转棋,有些程序至今仍然存在。

  那时的 Windows 用户界面已经拥有图标、滚动条、对话框、下拉菜单等元素,不过当时鼠标并不流行,常被认为效率低下、操作繁琐、难以使用,更多的是使用键盘。两年之后,微软发布了改进后的 Windows 2.0,这个版本可以重叠窗口、控制屏幕布局并支持键盘快捷键,第一次出现了控制面板,速度变得更快,系统也变得更可靠和易用。

  1990 年,微软发布 Windows 3.0,支持 Intel 386 处理器、虚拟设备驱动以及提供更好的内存管理技术,首次出现了程序管理器、文件管理器和打印管理器等重要程序和纸牌、扫雷、红心大战等经典游戏。

  这版系统支持虚拟内存以及 16 色的高级图形效果,图标也是经过重新设计,使得视觉图形效果大大提升,另外鼠标开始逐渐普及。用户普遍使用 Alt + Tab 进行程序切换。

  此后微软发布 Windows 3.1(提供多媒体的支持)、Windows forWorkgroups 3.11(提供了对工作组和域的支持)和 Windows 3.2(只有简体中文),这些努力让 Windows 3.X 系列成为了最受欢迎的图形操作系统,取得了商业上的成功。

  1995 年,微软发布 Windows 95,这是一款混合的 16 / 32 位操作系统,这也带来了不稳定,直到 Windows NT 内核出现之后才被基本解决。除此之外,Windows 95 新增不少实用附件,例如写字板、超级终端、磁盘碎片整理程序等,而且具备更强大的联网功能、多媒体功能以及移动计算功能,也结束了图形操作系统间的竞争。

  在用户界面上,Windows 95 更是一场革命。这款系统首次包含桌面、任务栏、开始菜单、资源管理器等诸多元素,这是一个非常具有前瞻性的设计,它的精华至今仍被广泛使用。

  随后微软发布 Windows 98,这个版本专门面向个人用户设计,另外包含多方面的改进,提供即插即用、长文件名、自动播放、自动更新、FAT 32 文件系统等一大批新功能。在用户界面上,网页能被作为桌面背景,而且首次出现右键菜单、快速启动栏等特性,且与 Internet Explore 4 深度整合,使用起来变得更加便捷。

  1999 年末,微软发布 Windows 2000,这是一款纯 32 位的操作系统,以成熟的 Windows NT Workstation 4.0 基本代码为基础而构建,在可靠性、易用性、Internet 兼容性和移动计算支持等方面作了重大改进。

  2000 年秋,微软发布 Windows 9X 系列最终版本 Windows Me,这款系统面向家庭计算机使用而设计,提供了大量音乐、视频和家庭网络增强功能,首次出现了系统还原功能,但是由于系统不再包括实模式的 MS-DOS,因此它很不稳定。

  2001 年秋,微软发布 Windows XP,这个至今仍被广泛使用的操作系统。它提供了新的界面、系统变得更加稳定,完成了 Windows 9X 以及 Windows NT 两种路线的最终统一,而且集成众多软件,是个人操作系统史上的伟大变革。

  此后微软还发布了 64-Bit Edition(首款面向 64 位处理器的 Windows)、Media Center Edition(包含媒体中心以及其它多媒体功能)、Tablet PC Edition(提供手写输入支持)等各种基于 Windows XP 的版本,这让 Windows XP 成为了当时最受欢迎的操作系统。

  在用户界面上,这款系统包含了例如 Luna 界面、选择任务界面、全新开始菜单以及新的登录界面等新元素,另外它还包含新的DirectX 以及各种新的改进,游戏性能大幅提升。

  2006 年末,微软发布 Windows Vista,这款操作系统包含众多令人兴奋的新功能或技术,例如 DirectX 10ReadyBoostBitLockerSuperFetch、游戏中心、体验指数、家长控制、虚拟文件夹(库)、用户账户控制、增强的语音识别、基于索引的搜索等等,相比之前版本增进了安全性,增强了各方各面的功能,为今后的 Windows 7/8 打下坚实基础。

  在用户界面上,它包含了例如侧边栏、Aero 桌面体验、新的开始菜单等新元素,这是一次伟大的变革,有了新的 AeroWindows 用户界面焕然一新,总算看齐其它个人操作系统。尽管它在商业上并不太成功,但它却是一场划时代的系统革命。

  Aero 能够使得人们少点关注窗口边框本身,多点关注窗口中的内容,这是一个全新设计的用户界面,包括 Aero 磨砂玻璃外观、Windows Flip 3D、实时缩略图、新的字体(Segoe UI)、新的图标、新的对话框等一系列新的元素。

  2009 年秋,微软发布 Windows 7,这款操作系统继承了 Windows Vista 的优秀特性,针对各种性能问题进行优化,包含各项新的功能,例如 DirectX 11、库、家庭组、操作中心、移动中心等等,相比之前版本提升了兼容性,是至今为止销售最快的操作系统。

  在用户界面上,它包含了例如 Aero 晃动、Ribbon 界面、跳转列表、Aero 桌面透视、鼠标拖曳操作、全新的任务栏、完善的触控支持等等特性,是对 Aero 界面的一次改进。

  当时,由苹果引发的触控风潮已经蔓延全球,触控已经成了主要输入方式,Windows 已经面临着各派移动系统的威胁。有人预言键盘、鼠标已死。尽管Windows 7 在触控方面有了长足进步,但是如何能够彻底地把 Windows 带入触控时代,仍是一个重要问题。

  展望

  2012 年秋,微软将会发布 Windows 8,这款操作系统主要面向平板电脑设计,另外兼顾传统电脑,支持各种输入设备,包含应用程序商店,全面整合云的技术,提供新的 Internet 体验。它是一次基于 Windows 7 速度和可靠性核心本质的重塑和创新,Windows 从此破茧重生。

  在用户界面上,微软引入 Metro 界面,它的元素包括 Charms、活动磁贴、开始屏幕、Panorama 风格、Pivot 枢纽等等,主要标志是大字体。这个界面非常注重信息排版,如果排版不好,用户将会无法知道哪个可以点击、哪个不能点击、是否还有内容,极大影响用户体验。

  如果你有用过 XboxZuneMediaCenter 这些产品,相信你会觉得 Metro 界面非常亲切,因为 Metro 就是基于这些产品逐步进化而来。Metro 界面灵感来自地铁上的指示牌,强调突出信息本身,它能帮助人们在短时间内快速找到自己所需的信息。Metro 正在逐渐成为微软全线产品的通用界面,将被用于 WindowsOffice 以及 Xbox

  现在,用户希望拥有更强大的连接功能,而且希望通过各种云服务同步数据,这说明了人才是活动的中心。笔记本电脑的发展正在加速,平板电脑的出货量也越来越多。针对以上发展趋势,微软给 Windows 8 定下七大目标,包括更加快速流畅、超长续航时间、强大的Windows 8 应用程序、人性活动磁贴、应用互相协作、用户数据漫游等。

很多人说,Windows 8 是个 Aero 界面以及 Metro 界面的矛盾体。微软为了让 Aero 界面能与 Metro 相协调,于是在简洁明快的设计原则之下,取消开始按钮,圆角变成直角,透明变成白色,任务栏融入了桌面壁纸,取消一些不必要的渐变、阴影效果,常用的控件例如按钮、复选框、滚动条、Ribbon 等都被更新,用户界面变得更加现代和中性。

  这是一次大的变革,它将颠覆人们原有工作方式,尽管它有可能不被用户接受。微软一直希望 PC 能有流畅的用户体验,各项应用程序能够互相协作,能够帮助用户简化日常任务,这是一个美化愿景。

遥想 1993 年,那时的电脑颜色单调、无比笨重、速度缓慢而且价格昂贵。现在,电脑已经走入千家万户,出现在各种不同场所,能够随时移动、随时联网,价格负担得起而且外观漂亮。科技发展日新月异,世界仍在不断前进,Windows 也将不断改变,就让我们一起展望未来美好前景。

1.1.3   Win32平台的背后——Wintel联盟

1.2 Windows的特色

●图形用户界面(GUIGraphicUser Interface的缩写)——Windows最重要的特色。用户摆脱了字符界面操作系统必须死记键盘命令和一头雾水的屏幕提示,改为以鼠标为主可以直接和屏幕上所见即所得的东西进行交流。

●一致的用户界面。

●多任务。

●大量的函数调用

●和设备的无关性

●内存管理——由于内存分页和虚拟内存的使用,每个程序都可以使用4GB的地址空间,Dos编程时必须考虑的64KB内存问题已成为历史。

1.3 必须了解的东西

1.3.1   80x86处理器的工作模式

●实模式

●保护模式

●虚拟86模式

1.32 Windows的内存管理

两个问题:

Win32汇编中,每个程序都可以用4GB的内存吗?

Win32汇编源代码中为什么看不到CSDSESSS等段寄存器的使用?

1.3.3   Windows的特权保护

       Windows的特权保护和处理器硬件的支持是分不开的。优先级的划分、指令的权限检查和超出权限访问的异常处理等都是构成特权保护的基础。

两个问题:

Win32汇编中为什么找不到中断指令的使用呢?

Windows错误的“蓝屏幕”是从哪里来的?


 

第二章    准备编程环境


 

第三章    使用MASM

3.1 Win32汇编源程序的结构

.386

              .modelflat,stdcall

              optioncasemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 文件定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include         windows.inc

include         user32.inc

includelib     user32.lib

include         kernel32.inc

includelib     kernel32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

              .data

szCaption      db   'A MessageBox !',0

szText           db   'Hello, World !',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

              .code

start:

              invoke    MessageBox,NULL,offset szText,offsetszCaption,MB_OK

              invoke    ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

              end start

3.1.1    模式定义

.386

              .modelflat,stdcall

              optioncasemap:none

这些指令定义了程序使用的指令集工作模式格式

1.指定使用的指令集

       .386语句是汇编语言的伪指令,它在低版本的宏汇编中就已经存在,类似的指令还有.8086.186.286.386/.386p.486/.486p.586/.586p等,用于告诉编译器在本程序中使用的指令集。【p的伪指令则表示程序中可以使用特权指令

2. .model语句

.model语句在低版本的宏汇编中已经存在,用来定义程序工作的模式,它的使用方法是:

.model的内存模式   [语言模式]   [其他模式]

内存模式的定义影响最后生成的可执行文件,可执行文件的规模各不相同,在DOS的可执行程序中,有只用到64KB.com文件,也有大大小小的.exe文件。到了Win32环境下,又有了可以用4GB内存的PE格式可执行文件,编写不同类型的可执行文件要用.model语句定义不同的参数。

3. .option语句

option语句定义的选项有很多,如option language定义和option segment定义等,在Win32汇编程序中,需要的只是定义option casemapnone,这个语句定义了程序中的变量和子程序是否对大小写敏感。

3.1.2 段的定义
3.1.3 程序结束和程序入口
3.1.4 注释和换行

3.2 调用API

3.3 标号、变量和数据结构

3.4 使用子程序

3.5 高级语法

3.6 代码风格


 

你可能感兴趣的:(杂七杂八,win32,汇编,编程)