1.基本概念

原创 2001年06月17日 14:35:00

第一课 基本概念


我们先假设您已知道了如何使用MASM。如果您还不知道的话,请下载 win32asm.exe ,并请仔细研读其中所附带的文档资料。好,如果您已准备就绪,我们这就开始吧!

理论:

WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而只是说能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范,否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。
和 16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,这对于程序员来说是非常方便的,这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程,有许多重要的规则需要遵守。有一条很重要的是:Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,这样当您要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们,一个最显著的应用例子就是 Windows 的 CallBack 函数中。

内容:

下面的程序段是一个框架, 若您现在还不知道这些指令的确切意义的话,没关系, 随后我就会给大家详细解释。

.386
.MODEL Flat, STDCALL
.DATA
    <Your initialized data>
    ......
.DATA?
   <Your uninitialized data>
   ......
.CONST
   <Your constants>
   ......
.CODE
   <label>
    <Your code>
   .....
    end <label>

框架就这么简单,好,我现在就给您解释:

.386
这是一个汇编语言伪指令,他告诉编译器我们的程序是使用80386指令集编写的。您还可以使用 .486、.586, 但最安全的还是使用.386。对于每一种CPU有两套几乎功能相同伪指令: .386/.386P、 486/.486P、 586/.586P。 带P的指令标明您的程序中可以用特权级指令。特权级指令是保留给操作系统的,如虚拟设备驱动程序。在大多数时间,您的程序都无须运行在RING0层,故用不带后缀P的伪指令已足够了。

.MODEL FLAT,STDCALL
.MODEL 是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是FLAT。 STDCALL 告诉编译器参数的传递约定。参数的传递约定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和 PASCAL。C 约定规定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。

例如:为调用函数 foo ( int first_param, int second_param, int third_param ); 按C约定的汇编代码应该是这样的:

push [third_param]
push [second_param]
push [first_param]
call foo
add esp, 3 * 4 ;调用者自己恢复堆栈指针

PASCAL约定和C约定正好相反,它规定参数是从左向右传递,由被调用者恢复堆栈。Win16采用了PASCAL约定, 因为PASCAL约定产生的代码量要小。当不知道参数的个数时,C约定特别有用。如在函数wsprintf () 中, wsprintf预先并不知道要传递几个参数,所以它不知道如何恢复堆栈。STDCALL是C约定和PASCAL约定的混合体,它规定参数的传递是从右到左,恢复堆栈的工作交由被调用者。Win32只用STDCALL约定,但除了一个特例,即:wsprintf。

.DATA .DATA? .CONST .CODE
上面的四个伪指令是"分段"(SECTION)伪指令。我们上面刚讲过Win32下没有"段"(SEGMENT)的概念,但是您可以把您的程序分成不同的"分段", 一个"分段"的开始即是上一个"分段"的结束。WIN32中只有两种性质的"分段":DATA和CODE。
其中DATA"分段"又分为三种:
.DATA 其中包括已初始化的数据。
.DATA? 其中包括未初始化的数据。比如有时您仅想预先分配一些内存但并不想指定初始值。使用未初始化的数据的优点是它不占据可执行文件的大小,如:若您要在 .DATA? 段中分配10,000字节的空间,您的可执行文件的大小无须增加10,000字节,而仅仅是要告诉编译器在装载可执行文件时分配所需字节。
.CONST 其中包括常量定义。这些常量在程序运行过程中是不能更改的。 应用程序并不需要以上所有的三个"分段", 可以根据需要进行定义。
.CODE 这是代码"分段"。
<译者注:实际上,分段并不是象在 Dos 下一样,为不同的段分别指出不同的段寄存器,因为 Windows 下只有一个 4GB 的段,Windows 程序中的分段表现在当程序装载时,赋予不同的分段不同的属性,比如说当你的程序加载时,对于 Ring3 程序来说,.code 段是不可写的,而 .data 段是可写的,如果你尝试象在 Dos 下一样写自己的代码部分,你会得到一个蓝屏错误>

<label>
end <label>

是用来唯一标识您的代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。

1、线程的基本概念

多线程线程与进程 进程: 一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进...
  • L_Sail
  • L_Sail
  • 2017年12月21日 21:47
  • 43

1. 基本概念

网站和商店(website and store)Magento最强大的特点之一是可以从一个后台管理多个网站和商店。这使得店主可以管理不同网址的商店,在一个网址上可以用不同语言显示相同的产品,以及其它各...
  • enlyhua
  • enlyhua
  • 2015年06月02日 23:19
  • 331

JQuery基本概念

1.简介 jQuery = javascript Query(查询)。辅助javascript的开发库。jQuery是一个快速的简介的javascript库。也算是javascript的一个框架 ...
  • xiao_tommy
  • xiao_tommy
  • 2016年11月16日 15:06
  • 605

go学习笔记:1.基本概念

参考文献列表: http://tour.golang.org/ 安装 Golang 在 http://golang.org/dl/ 可以下载到 Golang。安装文档:http://go...
  • qdx411324962
  • qdx411324962
  • 2015年06月02日 08:52
  • 578

1.入侵检测/防护基本概念

1. 入侵和检测基本概念 2. 安全设备的作用及缺点 3. IDS/IPS的简单分类 4. 入侵检测/防护面临的问题 5. 入侵检测/防护技术发展趋势...
  • njwxbmu
  • njwxbmu
  • 2017年07月04日 23:38
  • 69

[WCF 学习笔记] 1. 基本概念

[WCF 学习笔记] 1. 基本概念WCF 被关注的时间已经很长了,全名 "Windows Communication Foundation",它还有另外一个名字叫 Indigo,这应该是微软迈向 S...
  • zhengtj123456
  • zhengtj123456
  • 2008年04月14日 13:57
  • 212

cloudstack基本概念(1.结构)

本文基于Cloudstack 4.2.1 (2014.1.10发布) 1. cloudstack的组织单元分级 Region: 我翻译为“区划”,这是Cloudstack最大的组织单元,一个区划包含...
  • yuanchao99
  • yuanchao99
  • 2014年01月13日 11:01
  • 2258

UML学习笔记1.基本概念

UML 作者:Thatway 保留所有权利 为什么重要 您应该使用UML吗?一个字:是!……新的书、文章等等将会全部以UML作为符号。……如果你正要开始使用建模符号,您就应该直接学习UML。 —— M...
  • marcoleung
  • marcoleung
  • 2004年07月26日 15:39
  • 1261

1.数据库基本概念知识

数据库 存储数据的仓库 描述一个事物的基本信息   优点: 持久化存储 读写速度极高 保证数据的有效性   RDBMS 当前主要使用两种类型的数据库:关系型数据库、非关系型数据库 ...
  • xun527
  • xun527
  • 2017年09月19日 22:26
  • 209

1.机器学习基本概念

所谓学习:本质就是找到特征和标签间的关系。 监督学习: (1)就是常说的分类,通过已有的训练样本去训练一个最优模型。再利用模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类...
  • u014774781
  • u014774781
  • 2017年09月03日 13:11
  • 261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1.基本概念
举报原因:
原因补充:

(最多只允许输入30个字)