博文

8086/88通用寄存器(2005-09-21 16:05:00)

摘要:8086/88内部有14个寄存器。其中有四个寄存器最常用。这四个寄存器称为通用寄存器。名字分别是AX、BX、CX和DX。它们具有一个通用的功能--保存数据,但每个寄存器还有自己专门的用途,下面分别介绍。 AX  A取自单词Accumulator,所以AX也被称为"累加器"。不过请不要望文生意,它的专门用途可不是作加法。今天我们介绍它的一个专门用途,就是CPU与端口交换数据的唯一通路。除此之外,它还有一系列专门的用途,这些用途以后会陆续谈到。 BX也被称为"基地址寄存器"(Base address)。这也是一个十分重要的寄存器,它可用来作为指针使用。这方面的内容将在第三章介绍。本节的程序不涉及BX的专门用途。 CX也称"计数器"(Counter)。这个寄存器主要用于为循环指令(LOOP)计循环次数,也用于计数据移位的位数。在"串处理"指令中也有应用。后面的程序就是用CX为LOOP指令计数的。 DS称为数据段地址寄存器(Data segment),它保存数据段的段地址。如果在程序中有数据的存取操作时,若不"显式"地指定段寄存器,则将在DS指定的段寻找相应的存储单元。 ES称为附加段地址寄存器(Exterial segment),也可以称为扩展段地址寄存器,它用于指向内存中的任一段。一般情况下我们常使用这个段寄存器取得内存中某个单元的数据而不需修改DS寄存器。 CS是代码段地址寄存器(Code segment),它和IP(指令指针)寄存器一起指向目前正在执行的指令。也就是说,CPU永远在CS:IP指向的内存单元中取得指令机器码并执行。CS寄存器的数值有变化,CPU所取的指令就有变化。 SS是堆栈段地址寄存器(Stack segment),它保存了堆栈存储区的段地址。堆栈是开辟在内存中的一段特殊空间,数据在堆栈中存取不同于在其它内存空间。 以上所讲的所有段寄存器都是16位的,无法拆分成8位使用,同时,段寄存器不能参与任何数学运算和逻辑操作。 指令指针寄存器(Instruction Pointer)
  IP是CPU内部一个16位的寄存器,它用于记录CPU将要执行的指令的偏移地址。指令的段地址由CS保存。IP不同于其它寄存器,它不能随意的修改,不能参与任何运算或逻辑操作。它的唯一用途就是为CPU取得指令提供偏移......

阅读全文(4535) | 评论:2

寄存器简单介绍(2005-09-21 10:49:00)

摘要:储单元就被CPU"选中",那么CPU就可以把这个存储单元所存的数据通过另一组线路(数据总线)取出,或向这个存储单元存入新的数据。  不同的CPU所具有的地址线数量是不一样的,像8086/88只有20根地址线,所能给出的地址范围是0-220-1(1048575),所以8086/88只能配备1MB存储器。而286有24根地址线,当然可配备224个字节的存储器。386/486有32根地址线,所以最多可配备4GB存储器。
  前面所说的存储器都是直接和CPU相联接的,这些存储器和CPU往往安装在同一块电路板上,因此通常把这类存储器称为"内存储器"(内存)。在机器中还有另一类存储器-"外存储器",这类存储器一般指得是软盘、硬盘、磁带和光盘等容量较大的存储设备。
  外存储器和内存相联接而不和CPU直接联接,即CPU无法直接将外存中的数据取到自己内部进行处理,而只能先通过另一部分控制电路将外存中的数据取到内存中,再进行进一步的处理。处理后的数据也是先放在内存中,再传至外存。
  正是由于这个原因,外存的容量并不受CPU地址线数量的限制。其容量可从几百KB直至几个GB不等。而且外存往往是机械--电子结合的设备,其数据存取速度远低于内存。 1.6 寄存器  寄存器又分为内部寄存器与外部寄存器,所谓内部寄存器,其实也是一些小的存储单元,也能存储数据。但同存储器相比,寄存器又有自己独有的特点:
  ① 寄存器位于CPU内部,数量很少,仅十四个;
  ② 寄存器所能存储的数据不一定是8bit,有一些寄存器可以存储16bit数据,对于386/486处理器中的一些寄存器则能存储32bit数据;
  ③ 每个内部寄存器都有一个名字,而没有类似存储器的地址编号。
  寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。关于各个寄存器的具体问题后面会深入讨论。
  外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过"端口"交换数据,所以外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为"端口",这种说法不太严格,但经常这样说。
  外部寄存器虽然也用于存放数据,但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或......

阅读全文(8735) | 评论:8

汇编语言中的数(2005-09-21 10:47:00)

摘要: 汇编语言中的数
  高级语言中也多用十进制数。十进制数由0-9十个数字组合而成,逢10进1。但由于汇编语言是面向硬件的,因此,在汇编语言中使用的数字也是和硬件结合紧密的二进制数。
  二进制数只由0和1而个数字组成,逢2进1,也就是说,在十进制数中计算1+1时将得到一位数字的结果--2,而在二进制数中计算时将得到一个二位二进制数--10,表1-1列出了四位二进制数与十进制数间的对应关系。
  在十进制数字中还有"数位"之分,个位,十位,百位......,在二进制数中也分各个数位。以四位二进制数1010为例,从右数第一位,称为bit0,第二位称bit1,以此类推。因此,1010的bit3,bit1位是1,bit2,bit0位是0。与十进制数一样,二进制数自右向左数位逐渐升高。最左端的数位为最高位,1010的最高位为1。 表1-1 四位二进制数与十进制数对照表 二进制数 0000 0001 0010 0011 0100 0101 0110 0111 十进制数 0 1 2 3 4 5 6 7 二进制数 1000 1001 1010 1011 1100 1101 1110 1111 十进制数 8 9 10 11 12 13 14 15   我们知道,计算机利用电路来记忆1和0,那么1和0究竟和电路的工作状态有什么关系呢?通俗的讲,1,0反应了电路输出(入)电压的高和低。如果电路输出(入)的电压高,比如达到了电源电压的幅度,此时电路的输出(入)就为1。如果电路输出(入)的电压很低,比如接近0V,那么这时电路的输出(入)就为0。
  二进制数字在实际应用中还有一些缺点,比如不便于书写,难于记忆等。为此,在汇编语言中还常用另一种数制--十六进制。十六进制数字由十六个数组成,逢16进1。前十个数字和十进制一样,是0-9,后六个数字用英文字母A-F来表示。表1-2列出了十六进制与十进制数间的对应关系。 表1-2 十六进制数与十进制数对照表 十进制 0 1 2 3 4 5 6 7 ......

阅读全文(3284) | 评论:1

汇编语言基础知识(2005-09-21 10:46:00)

摘要: 所谓汇编语言,其实质就是机器语言的一个高级的形式。我们知道,机器语言是CPU唯一可以真正"理解"的语言,它是用一些由"0"和"1"两个数字组成的一组数字来表示的。例如:1011000000000001(意思是将数字1放入累加器)。
  这样的一组数字非常难以理解和记忆,毕竟程序员不是一块CPU。为了使程序设计人员能够很好地记忆这些机器指令,简化程序设计工作,技术人员将这些怪异的数字用一些取自人类语言的简短的文字符号来表示,于是就产生了汇编语言。这些简短的文字符号称为指令助记符。例如上面的那个机器指令用汇编语言表达出来,就是"MOV AL,1"。
  同高级语言相比,汇编语言具有一些极其突出的特点:   ① 汇编语言是一种完全面向硬件的语言,这同BASIC,C之类的高级语言截然不同。多数高级语言都是面向问题的,例如:如果需要在屏幕上显示一串文字时,我们可以直接应用BASIC语言中的PRINT语句,或用C语言中的PRINTF函数,这个问题就迎刃而解了。而使用汇编语言编程,解决这个问题的最终操作是"将这些文字的ASCII码写入显示缓冲存储器中"。可见,汇编语言将这个问题转化成了对硬件(显示缓冲存储器)的操作(写入)。这是汇编语言的一个极其突出的特点,也是汇编语言同高级语言的最显著的差别;
  ② 同高级语言相比,汇编语言编写的程序结构十分紧凑,运行速度很快。汇编语言同机器指令直接对应,编译速度快,同时,CPU"理解"其"母语"的速度远高于"翻译"高级语言的速度。因此,汇编语言是所有程序设计语言中运行效率最高的。这是汇编语言的一个最为突出的优点。当需要编写高速运行的软件时,例如编写图像处理程序,就往往使用汇编语言编写软件中的关键部分;
  ③ 用汇编语言编制程序十分费时,而且程序的质量直接受到程序员技术水平的影响,程序的可读性也很差。就象前面所举的输出文字的例子,用高级语言编程只需写一条语句,简单明了,极其直观。而用汇编语言编程则需写出一系列指令,这些指令都是些对硬件的操作,同"文字输出"这个问题没有明显的直接联系,因此程序的可读性很差。
  ④ 由于汇编语言是面向硬件的,所以用汇编语言编制的程序可移植性很差。显而易见,不同的CPU都有相互独立的指令系统,相互间无任何关系,就算是使用同一系列CPU的机器,......

阅读全文(4228) | 评论:6

基本概念(2005-09-21 10:43:00)

摘要:理论: 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
   
    ......
.DATA?
  
   ......
.CONST
  
 &n......

阅读全文(2290) | 评论:0