分享

linux内核编程入门(二) —— 计算机体系结构及汇编

 nbxming 2011-05-25
昨天晚上CSDN博客一直down了,不能写,早上来公司发。
先来看一下计算机体系结构 :
 
CPU是由算术逻辑部件ALU、控制器、寄存器组成的。
ALU:是运算器的核心部件,执行算术运算、逻辑运算、移位、比较等各种数据处理的操作。
控制逻辑:处理程序指令,并协调各逻辑部件按一定时序工作。包括:从存储器中读取程序指令、指令译码、从存储器中取得操作数,执行指令,把结果存入存储器,以及对总线和I/O的传送控制等。
工作寄存器:每一个寄存器相当于运算器中的一个存储单元,但速度比存储器快,用来存放计算过程中所需要的或得到的各种信息。
 
寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。
寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C++语言)中,也有定义变量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。
另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。
由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。
80X86寄存器组:
 
 
16位寄存器组:
4个数据寄存器(AX、BX、CX和DX)
2个变址和指针寄存器(SI和DI)
2个指针寄存器(SP和BP)
个段寄存器(ES、CS、SS和DS)
1个指令指针寄存器(IP)
1个标志寄存器(Flags)
 
32位寄存器组:
 

 
通用寄存器组:
(1)数据寄存器
数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。
AX(Accumulator)寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。
BX(Base Register)寄存器称为基址寄存器。常用于存放存储器地址。
CX(Count Register)寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。在位操作中,当移多位时,要用CL来指明移位的位数;
DX(Data Register)寄存器称为数据寄存器。常用来存放双字数据的高16位,在进行乘、除运算时,它可作为默认的操作数参与运算,亦可存放外设端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
 
(2) 变址寄存器
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),主要用于存放某个存储单元的偏移地址。
 
SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。它们主要用于存放存储单元段内的偏移量,用它们可实现多种存储器操作数的寻址方式,以为不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
(3)指针寄存器
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
SP(Stack Pointer)为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP (Base Pointer)为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
 
专用寄存器:    IP、SP、FLAGS
(1)指令指针寄存器 IP( Instruction Pointer )
指 令指针寄存器:8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目 标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。    32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
(2)堆栈指针寄存器SP
用于存放当前堆栈段中栈顶的偏移地址
(3)标志寄存器 ( FLAGS / PSW )
 
 
注:指令的执行与标志有很大关系。
状态标志               用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。
控制标志               可由程序根据需要用指令设置,用于控制处理器执行指令的方式。
 
零标志ZF(Zero Flag)
若运算结果为0,则ZF = 1,否则ZF = 0。
例如:
3AH + 7CH=B6H,结果不是零:ZF = 0
86H + 7CH=(1)00H,结果是零:ZF = 1
注意:ZF为1表示的结果是0
符号标志SF(Sign Flag)
运算结果最高位为1,则SF = 1;否则SF = 0。
例如:
3AH + 7CH=B6H,最高位D7=1:SF = 1
86H + 7CH=(1)00H,最高位D7=0:SF = 0
 
有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。
奇偶标志PF(Parity Flag)
当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0。
例如:
3AH + 7CH=B6H=10110110B,
结果中有5个1,是奇数:PF = 0
 
注意:PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。
溢出标志OF(Overflow Flag)
若算术运算的结果有溢出,则OF=1;否则 OF=0。例如:
3AH + 7CH=B6H,产生溢出:OF = 1
AAH + 7CH=(1)26H,没有溢出:OF = 0
辅助进位标志AF(Auxiliary Carry Flag)
运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
例如:
3AH + 7CH=B6H,D3有进位:AF = 1
这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心
方向标志DF(Direction Flag)
用于串操作指令中,控制地址的变化方向:
设置DF=0,串操作的存储器地址自动增加;
设置DF=1,串操作的存储器地址自动减少。
CLD指令复位方向标志:DF=0
STD指令置位方向标志:DF=1
中断允许标志IF(Interrupt-enable Flag)
用于控制外部可屏蔽中断是否可以被处理器响应:
设置IF=1,则允许中断;
设置IF=0,则禁止中断。
CLI指令复位中断标志:IF=0
STI指令置位中断标志:IF=1
陷阱标志TF(Trap Flag)
用于控制处理器是否进入单步操作方式:
设置TF=0,处理器正常工作;
设置TF=1,处理器单步执行指令。
单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断。这种内部中断称为单步中断,所以TF也称为单步标志。
利用单步中断可对程序进行逐条指令的调试。
这种逐条指令调试程序的方法就是单步调试

 段寄存器:
8086CPU的4个16位的段寄存器分别称为:代码段寄存器CS,数据段寄存器DS,堆栈段寄 存器SS,附加数据段寄存器ES。段寄存器用来确定该段在内存中的起始地址。段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的 值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
CS——代码段寄存器(Code Segment Register),其值为代码段的段值;代码段用来存放程序的指令序列。CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。
DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
实方式:
前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式:
在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。段寄存器的具体作用在此不作进一步介绍了,有兴趣的读者可参阅其它科技资料。
寄存器与存储器的比较:寄存器在CPU内部 ,访问速度快 ,容量小成本高,用名字表示,没有地址
存储器 在CPU外部,访问速度慢,容量大,成本低,用地址表示,地址可用各种方式形成.
 
存储器
存储单元地址 :8086系统中,为了标识和存取每一个存储单元,给每个存储单元规定一个编号,这就是存储单元地址。
存储单元的内容 :一个存储单元中存放的信息称为该存储单元的内容。
注意:
*    存储器以字节(8 bit)为编程单位
*    每个字节单元都有唯一的地址编码
*    地址用无符号整数来表示(编程用十六进制表示)
*    一个字要占用相继的两个字节
*    低位字节存入低地址,高位字节存入高地址
*    字单元地址用它的低地址来表示
*    机器以偶地址访问(读 / 写)存储器
 
二进制位:存储一位二进制数:0或1。
字节:8个二进制位,D7~D0。
字:16位,2个字节,D15~D0。
双字:32位,4个字节,D31~D0。
最低有效位LSB(Least Significant Bit):指数据的最低位,即D0位;
最高有效位MSB(Most Significant Bit):指数据的最高位,对应字节、字、双字分别指D7、D15、D31位。
 
 

存储单元中所存放的二进制信息通常称为该存储单元的内容或值,并且规定:
一个字节的内容是该字节单元内存放的二进制信息;
一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;
一个双字的内容是该字地址所指向的单元及其后继三个单元的内容拼接而成。
 
在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。
 
实模式存储器寻址:
实模式实际上是为8088/8086而设计的工作方式,目的是解决在16位字长的机器中如何提供20位地址的问题。80286及其后微处理器除可在实模式下工作外,还可在保护模式下工作。
下面,我们将首先介绍一下实模式下的存储器寻址方法    ——    存储器地址的分段。
1、存储器的分段
我们知道:计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。
存储单元的物理地址是一个无符号的二进制数。但为了书写的简化,物理地址通常用十六进制来表示。
16位CPU内部有20根地址线,其编码区间为:00000H~0FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。而16位CPU内部 存放存储单元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX等)都是16位,它们的编码范围仅为:00000H~0FFFFH。这样,如果用 16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将无法访问。为了能用16位寄存器来有效地访问1M的存储空间,16位CPU采 用了内存分段的管理模式,并引用段寄存器的概念。
16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。
按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。图为内存各逻辑段之间的分布情况示意图,其中有相连的段(如:C和D段)、不相连的段(如:A和B段)以及相互重叠的段(如:B和C段)。
 
(1)存储器地址的分段
20 根地址线:     地址范围    00000H ~ FFFFFH (1MB)
机器字长16位:仅能表示地址范围    0000H ~ FFFFH(64KB)
小段:每16个字节为一小段,共有64K个小段
              小段的首地址
                       00000 H      ~      0000F H
                       00010 H      ~      0001F H
                       00020 H      ~      0002F H
                              …
                       FFFF0 H      ~     FFFFF H
段起始地址:小段首地址
段的大小:      64K 范围内的任意字节
 
物理地址的形成方式:
由于规定段地址必须是16的倍数,所以,其值的一般形式为:XXXX0H,即:前16位二进制位是变化的,后四位是固定为0。鉴于段地址的这种特性,我们可以仅保存其前16位二进制来达到保存整个段地址,其后四位可通过“左移补0”来获得。
在确定了某个存储单元所属的内存段后,我们也只知道其所处内存位置的范围,还不能确定其具体位置。要想确定内存单元的具体位置,还必须知道该单元离该段地 址有多远。我们通常把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。有了段地址和偏移量,就能唯一地确定某一内存单元在存储器内的具体位置。
 
由此可见,存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PA—Physical Address)的计算方法如下:物理地址PA=段地址×16 + 偏移量
计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。图是物理地址的计算示意图。
 
存储器分段:段起始地址必须是某一小段的首地址,段的大小可以是64K范围内的任意字节。
物理地址:每个存储单元的唯一的20位地址
段地址:段起始地址的高16位,低4位为0000B
偏移地址(有效地址EA):段内相对于段起始地址的偏移值(16位)
物理地址 = 16d * 段地址 + 偏移地址
 
对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。如图所示。
 
物理地址和逻辑地址之间的关系
 
 
在汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用其逻辑地址标识的。逻辑地址的段地址由段寄存器给出,偏移量可由寄存器(SI、DI、BP和BX等)给出,也可用符号地址或具体的数值给出。
段寄存器
8086有4个16位段寄存器:
CS(代码段寄存器)指明代码段的起始地址
SS(堆栈段寄存器)指明堆栈段的起始地址
DS(数据段寄存器)指明数据段的起始地址
ES(附加段寄存器)指明附加段的起始地址
每个段寄存器用来确定一个段的起始地址,每种段均有各自的用途。
 
段寄存器的引用

段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。
 
段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
 
 
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。
通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器。
 一般情况下,段寄存器及其指针寄存器的引用关系如下表所示。表中的“可选用的段寄存器”即是可以用强置说明这些段寄存器的值来作为其操作数地址的段地址。

由上表可以看出16位CPU在段寄存器的引用方面有如下规定:
取指令所用的段寄存器和偏移量一定是用CS和IP;
堆栈操作所用的段寄存器和偏移量一定是SS和SP;
串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。
 
存储器的逻辑分段:
 
 
保护模式存储器寻址:
80286及其后机器采用保护模式的存储寻址的原因
(1)80286及其后机器提供了16MB、4GB以及更多的存储空间,那么如何寻址呢?
(2)解决了多任务处理的问题,同时支持虚拟存储器特性(程序运行时,只需把需要执行的代码从外存调入内存即可)。
保护模式的存储寻址的管理方法
(1)逻辑地址由选择器和偏移地址(32位、4GB)两部分组成,选择器放在段寄存器中,由操作系统管理计算段基址,再加上偏移地址,找到相应的存储单元。
(2)用户设计程序时,和8086实模式存储寻址一样,只需要设置段寄存器的内容即可。
 

外部设备
外部设备与主机的通信是通过外设接口(Interface)进行的,每个接口包括一组寄存器。
数据寄存器:存放外设和主机间传送的数据
状态寄存器:保存外设或接口的状态信息
命令寄存器:保存CPU发给外设或接口的控制命令
外设中每个寄存器都分配一个端口(Port)地址(端口号),80x86允许有65535个8位或16位端口,构成一个独立于内存的 I / O 地址空间:0000H ~ FFFFH。386以后有32位端口.
便于用户使用外设,80x86提供了两种类型的例行程序共用户调用:BIOS 和DOS功能调用。
 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wfwd/archive/2008/02/27/2124043.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多