补码是什么?

用[x]表示机器数(原码),x是真值(二进制)
   x=+0.1001,则[x]原=0.1001
x=-0.1001,则[x]原=1.1001

对于0,原码中有“+0”、“-0”之分,故有两种形式:
[+0]原=0.000…0
[-0]原=1.000…0

采用原码表示法简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时还要比较绝对值的大小,然后大数减去小数,最后还要给结果选择符号。

为了解决这些矛盾,人们找到了补码表示法。机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。

负数用补码表示时,可以把减法转化为加法。这样,在计算机中实现起来就比较方便
[x]补= {   x       1>x≥0
      {   2+x=2-|x| 0≥x≥-1

   x=+0.1011,则[x]补=0.1011
x=-0.1011,则[x]补=10+x=10.0000-0.1011=1.0101

对于0,[+0]补=[-0]补=0.0000              (mod 2)

例子中是以定点小数为例。

补码的原理可以用钟表来描述

如设标准时间为4点正;一只表已经7点了,为了校准时间,可以采用两种方法:一是将时针退 7-4=3 格;一是将时针向前拨12-3=9格。即7-3和7+9(mod12)等价,因此,把负数用补码表示的mod2操作,可以把减法转化为加法。

Read: 958

计算机寄存器

寄存器是中央处理器内的其中组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
寄存器(Register)

寄存器是内存阶层 中的最顶端,也是系统操作资料的最快速途径。寄存器通常都是以他们可以保存的 位元 数量来估量,举例来说,一个 "8 位元寄存器" 或 "32 位元 寄存器"。寄存器现在都以寄存器档案 的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存 以及在数种机器上的其他方式来实作出来。

寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 "架构寄存器"。

例如,x86 指令及定义八个 32 位元寄存器的集合,但一个实作 x86 指令集的 CPU 可以包含比八个更多的寄存器。

寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

寄存器的用途:

1.可将寄存器内的数据执行算术及逻辑运算。

2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。

3.可以用来读写数据到电脑的周边设备。

8086 有8个8位数据寄存器,

这些8位寄存器可分别组成16位寄存器:

AH&AL=AX:累加寄存器,常用于运算;

BH&BL=BX:基址寄存器,常用于地址索引;

CH&CL=CX:计数寄存器,常用于计数;

DH&DL=DX:数据寄存器,常用于数据传递。

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

CS(Code Segment):代码段寄存器;

DS(Data Segment):数据段寄存器;

SS(Stack Segment):堆栈段寄存器;

ES(Extra Segment):附加段寄存器。

当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。

除了前面所提的寄存器外,还有一些特殊功能的寄存器:

IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;

SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。

BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;

SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;

DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。

还有一个标志寄存器FR(Flag Register),有九个有意义的标志(

OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0.

DF: 方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

IF: 中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:

(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;

(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

TF: 状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变

SF: 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

ZF: 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

AF: 下列情况下,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;

(2)、在字节操作时,发生低4位向高4位进位或借位时。

PF: 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

CF: 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。)

以上是8086寄存器的整体概况, 自80386开始,PC进入

32bit时代,其寻址方式,寄存器大小, 功能等都发生了变化, 要想学习这方面知识请参考相应资料.

Read: 846

磁芯大战 — 计算机病毒起源?


大约在1959年,磁芯大战在贝尔实验室中诞生。它是三个年轻人在工余时的产物。他们是麦耀莱、维索斯基以及莫里斯。其中莫里斯就是后来制造了“莫里斯蠕虫”的罗特·莫里斯的父亲。当时三人年纪都只有二十多岁。
磁芯大战的玩法是游戏双方各写一套程序,输入同一部电脑中,这两套程序在电脑的存储系统内互相追杀。因为它们都在电脑的存储磁芯中运行,因此得到了磁芯大 战之名。这个游戏的特点在于双方的程序进入电脑之后,玩游戏的人只能看着屏幕上显示的战况,而不能做任何更改,一直到某一方的程序被另一方的程序完全“吃 掉”为止,所以磁芯大战只能算是程序员们的一个玩具。由于用于游戏的程序具有很强的破坏性,因此长久以来,懂得玩“磁芯大战”的人都严守一项不成文的规 定:不对大众公开这些程序的内容。然而1983年,这项规定被打破了。科恩·汤普逊在当年一项杰出电脑奖得奖人颁奖典礼上,作了一个演讲,不但公开证实了 电脑病毒的存在,而且还告诉所有听众怎样去写自己的病毒程序。他的同行全都吓坏了,然而这个秘密已经流传出去了。1984年,情况更复杂了。这一年,《科 学美国人》月刊的专栏作家在5月刊写了第一篇讨论磁芯大战的文章,并且只要寄上两美元,任何读者都可以收到有关如何编写程序的提纲,在自己家的电脑中开辟 战场。就这样,潘多拉之盒被打开了,许多程序员都了解了病毒的原理,进而开始尝试编制这种具有隐蔽性、攻击性和传染性的特殊程序。到了今天,电脑病毒已经 成为了电脑世界最大的瘟疫。磁芯大战的作者们万万不会想到:它们的玩具竟然会给世界带来如此大的麻烦

Read: 1124

What is Atlas?

阿特拉斯,希腊神话中的巨神,以肩膀扛顶着天。后代,也引伸有能担负重责大任的人,有人也因之称他为宇宙神。

VeriSign通过它的一个崭新的技术平台—高级交易查询信令系统(ATLAS)来提供服务,ATLAS是一个综合性的处理平台,其设计宗旨是扩展 其Internet的核心基础设施、域名系统(DNS),支持迅速发展中的通过Internet提供的语音、数据和多媒体服务。通过Solaris 10 OS和Sun Fire x64服务器的采用,ATLAS每天管理着数以百亿计的处理业务,且提供高于99.999%的数据完整性和服务,阻止如“拒绝服务”等来自 Internet的恶意攻击。

ATLAS 是欧洲核子中心(cern)大型强子对撞机(LHC)上的四个大型探测器之一.

微软目前目前对于通过Ajax风格的编程在浏览器中实现日益流行的富客户端应用比较感兴趣。今后的IE中将拥有Ajax的所有东西——DHTMLJScriptXmlHttp。实际上Outlook Web Acces从1998年开始就已经提供了这种伟大的浏览体验了。在ASP.NET 2.0中,微软使用异步回调及舒适的Ajax风格的应用程序的编写更加简单,并且,微软为此提供了内建的控件。

最近,几乎所有的浏览器都提供了Ajax所需的技术,使用这种模式的富客户端应用程序也不断出现。今天,世界上出现了不计其数的Ajax风格的站点,包括 Google的很多站点、A9和Flickr。微软的很多站点也使用了这项技术,如Start.com和MSN虚拟地球。

Ajax的风行说明用户对于丰富的Web体验的需求日益增长。然而,开发和调试Ajax风格的Web应用程序是一项非常艰难的工作。要编写一个丰富的 Web UI,开发者需要详细地掌握DHTML和JavaScript,并且还要掌握各种浏览器之间在设计细节上的不同。然而没有那些工具能够简化这些应用程序的 设计和开发。最后,调试和测试这些应用程序会变得异常困难。

微软致力于简化Ajax风格Web应用的开发,并提供丰富的、可交互的和个性化的用户体验。开发者可以对客户端脚本不甚了解;但他们可以很容易地开发和调试这种应用程序。

出于这一目的,微软启动了一个新的项目,研发代号“Atlas”。Atlas为开发这带来了如下特性:

Atlas客户端脚本框架
Atlas的ASP.NET服务器控件
ASP.NET Web Services集成
Atlas的ASP.NET构建块
客户端构建块服务
你可能会问的一个问题是,Atlas如何在Avalon和智能客户端上使用?

我们可以看到,Atlas是编写丰富的、可交互的和个性化的Web浏览器应用程序的最好方式。而Avalon是微软的下一代表现层模型,可以在 Windows平台上提供最丰富的用户体验。Avalon将使用最新的媒体集成功能和硬件加速设备,提供卓越的视觉体验。Avalon将带来超越浏览器的 体验。

当然,当你构建Avalon应用程序的时候,你依然可以重用ASP.NET和Atlas中的编程模型。例如,Avalon客户端上依然可以使用ASP.NET构建块服务和客户端构建块服务。这种模型可以使你平滑地过渡到下一代应用程序上。

Atlas:客户端脚本框架

Atlas客户端脚本框架是可扩展的,100%面向对象的JavaScript客户端脚本框架,允许开发这很容易地构建拥有丰富的UI工能并且可以连接 Web Services的Ajax风格浏览器应用程序。使用Atlas,开发者可以使用DHTML、JavaScript和XMLHTTP来编写Web应用程 序,而无须掌握这些技术的细节。

Atlas客户端脚本框架可以在所有的现代浏览器上运行,而不需要Web服务器。它还完全不需要安装,只要在页面中引用正确的脚本文件即可。

Atlas客户端脚本框架包含下列组件:

一个可扩展的和新框架,其中为JavaScript添加了很多新特性,如生存期管理、集成、多播事件处理器和接口
一个基础类库,提供了通用特性,如丰富的字符串操作功能、计时器和运行任务等
一个UI框架,可以跨浏览器实现动态行为
一个网络栈,用于简化对服务器的连接和对Web Services的访问
Atlas:ASP.NET服务器控件

微软为ASP.NET应用程序专门设计了一组Ajax风格的服务器控件,并且加强了现有的ASP.NET页面框架和控件,以便支持Atlas客户端脚本框架。

ASP.NET 2.0中有一项称作异步客户端回调的新特性,使得构建无中断的页面变得很容易。异步客户端回调包装了XMLHTTP,能够在很多浏览器上工作。 ASP.NET本身包括了很多使用回调的控件,包括具有客户端分页和排序功能的GridView和DetalsView控件,以及TreeView空间的 虚拟列表支持。

Atlas客户端脚本框架将完全支持ASP.NET 2.0回调,但微软希望进一步增强浏览器和服务器之间的集成性。例如,你可以将Atlas客户端控件的数据绑定指定为服务器上的ASP.NET数据源控件,并且可以从客户端异步地控制Web页面的个性化特征。

Atlas:ASP.NET Web Services集成

和任何客户端应用程序一样,一个Ajax风格的Web应用程序通常也需要访问Web服务器的一些功能。Atlas应用程序连接服务器的模型和其他平台类似,都是使用Web Services来实现。

通过ASP.NET Web Services集成,Atlas应用程序将可以在任何支持XMLHTTP的浏览器上通过Atlas客户端将本框架来直接访问任何宿主于ASP.NET的 asmx或Indigo服务。该框架将会自动处理代理和脚本到对象、对象到脚本的序列化问题。通过使用Web Services集成,开发者可以使用单一的编程模型来编写Web Services,并且在任何应用程序中使用它们,不论是基于浏览器的站点上还是智能客户端应用程序中。

Atlas:ASP.NET构建块服务

在ASP.NET 2.0中,微软构建了一组丰富的构建块服务(Building Block Services),这使得构建强大、个性化的Web应用程序变得不可思议的简单。这些构建块极大地降低了在开发通用的Web应用程序过程中需要编写的代 码数量,比如管理用户、通过角色验证用户和存储用户的个性化设置信息等。

使用Atlas,我们可以在任何浏览器上的任何客户端应用程序中向访问Web Services那样访问这些功能。例如,如果你正在开发一个站点,来显示用户的TO-DO项目,你可以使用ASP.NET的Profile服务来将他们 存放在服务器上的用户自定义配置文件中。这样即使用户从一台机器上转移到另一台机器上,也同样可以访问这些项目。

微软将提供的服务包括(全部是基于ASP.NET 2.0的):

– Profile:在服务器上存放每个用户特有的数据

– UI个性化:在服务器上存放个性化的UI设置信息

– 验证:验证用户

– 角色:基于用户的角色验证用户任务和提供不同的UI

由于这些构建块是服务器端的,开发者需要对他们应用和其他站点一样的安全模型。这些服务不需要客户端下在任何东西——只要在浏览器中引用脚本代理即可。

所有的ASP.NET 2.0构建块服务都是可插拔的,这使用一种通用的提供者模型可扩展模式在后台实现。微软提供的内建提供程序允许开发这使用SQL Server数据库或Active Directory作为存储容器,开发者也可以很容易地插接自己的提供程序。例如,你可能希望使用集群而不是数据库服务器来存放用户的配置文件,这时你只 需将你的提供程序插接近来即可。

Atlas:客户端构建块服务

除了DHTML、JScript和XMLHTTP,微软还提供了一组附加的服务来加强客户端的功能并提供增强的体验。

对于这样的服务,本地浏览器缓存就是一个很好的例子。当启用了本地浏览器缓存时,Web站点就可以将内容存储到患从中,并在需要的时候很快地取出。但浏览器并未提供向缓存中存放数据的API,而且象Google Map或OWA这样的应用程序不得不通过很多工作产生一个唯一的URL才能使浏览器缓存它。在Atlas中,微软提供了可编程的本地存储/缓存,因此应用程序可以很方便、有效并且安全在本地缓存数据。

同其他应用程序的集成是检验Web体验是否丰富的另一个新的标准。例如,当一个用户浏览一个拍卖网站并对一件商品出价时,他可能想随时知道这个拍卖什么时 候结束,但他如何才能将这个事件添加到他们个人的日历程序中?Atlas带来了一系列客户端构建块服务,当用于选择“添加到日历”时,浏览器将调用接驳点 来获取日历数据,并将其传递到本地的日历程序中。此时页面上无须下载或运行任何特殊的代码或执行任何初始化动作,因此,这比ActiveX要安全得多。

Read: 234

[转]Windows API

1.什么是Windows API?

Windows 这个多作业系统除了协调应用程式的执行、分配内存、管理系统资源…之外, 她同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备…等目的, 由於这些函数服务的对象是应用程式(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口。

凡是在 Windows 工作环境底下执行的应用程式, 都可以调用Windows API。

2.Windows API的历史与现状

当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。而在WINDOWS程序设计领域处于发展的初 期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭 建出各种界面丰富,功能灵活的应用程序。所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS的操作系统核心,而它的 上面则是所有的华丽的WINDOWS应用程序。

但是,没有合适的Windows编程平台,程序员想编写具有Windows风格的软件,必须借助API,API也因此被赋予至高无上的地位。那时的 WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。然而随着软件技术的 不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程 序。

这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC++、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神 秘功能,事实上这些类库和控件都是构架在WIN32 API函数基础之上的,是封装了的API函数的集合。它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了 WINDOWS应用程序开发的过程。有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。

实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提 供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。

这也是API函数使用的场合,所以我们对待API函数不必刻意去研究每一个函数的用法,那也是不现实的(能用得到的API函数有几千个呢)。正如某位 大虾所说:API不要去学,在需要的时候去查API帮助就足够了。但是,许多API函数令人难以理解,易于误用,还会导致出错,这一切都阻碍了它的推广。 本专题就是想帮助那些想快速掌握API函数用法的同志们。通过对API函数的分类,结合一些有趣的实例,应该可以达到快速掌握的目的。

Read: 745