XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog

寄存器

CPU主要由运算器、控制器以及多个寄存器组成,寄存器是CPU内部的信息存储单元,不同架构CPU之间寄存器类型有所区别。有很多寄存器如IR、MAR、MDR等是CPU内部使用的,对程序员而言是透明的,我们无法直接对其进行操作,而我们需要关注的是编程可以直接操作的寄存器,这类寄存器主要包括通用寄存器、段寄存器、指令指针寄存器和标志寄存器,这里先以8086寄存器为基础对x86系列寄存器进行介绍。

1.8086 寄存器

8086 CPU是8086系列CPU的基础,它有16根数据线和20根地址线,可寻址空间为1MB,虽然后续出现32、64位的高性能CPU,但其寄存器主要都是在8086寄存器上的扩展,向下兼容。8086 CPU中对程序员可见的寄存器分为通用寄存器、段寄存器、指令指针和标志寄存器4类共14个,均为16位,具体如下:

(1) 通用寄存器 (8个)

通用功能为传送和暂存数据,也可参与算术逻辑运算,并保存运算结果,除此之外每个寄存器还有一些特殊用途。

① 数据寄存器

  • AX (Accumulator):累加寄存器,可分为两个独立的8位寄存器,高8位AH,低8位AL。在除法运算中,AX存储被除数,乘法运算中,AX存储被乘数,如果运算数或运算结果是32位,则低16位存在AX中,高16位存在DX中
  • BX (Base):基地址寄存器,可分为两个独立的8位寄存器,高8位BH,低8位BL,用于寻址,存放某个存储单元地址的偏移,格式为:段:[偏移],不指明段则默认为DS,如:MOV AH,DS:[BX]MOV AH,[BX]等效
  • CX (Count):计数器寄存器,可分为两个独立的8位寄存器,高8位CH,低8位CL,用于循环计数
  • DX (Data):数据寄存器,可分为两个独立的8位寄存器,高8位DH,低8位DL。在运算中,如果运算数或运算结果是32位,则低16位存在AX中,高16位存在DX中

② 指针寄存器

  • SP (Stack Pointer):堆栈指针寄存器,SS:SP 指向栈顶元素,使用PUSH指令压栈时 SP=SP-1,使用POP指令弹栈时 SP=SP+1 (栈向下增长)
  • BP (Base Pointer):基指指针寄存器,用于栈寻址,不指明则使用SS作为默认段基地址

③ 变址寄存器

  • SI (Source Index):源变址寄存器,用于寻址,可存放源操作数的偏移地址,不指明则使用DS作为默认段基地址
  • DI (Destination Index):目的变址寄存器,用于寻址,可存放目的操作数的偏移地址,不指明则使用DS作为默认段基地址

(2) 段寄存器 (4个)

因为8086 CPU数据总线宽度为16位 (寻址64Kb),但是地址总线宽度为20位 (寻址1Mb),因此采用 [段地址*16+偏移地址] 的方式进行寻址,即段地址左移4位 (空缺补0) 后加上偏移地址,段寄存器的意义就在于为不同的段提供段地址。

  • CS (Code Segment):代码段寄存器,存放代码段基地址,CS:IP 指向CPU当前将要读取的指令的地址,当一个可执行文件加载到内存中以后,CS:IP 便指向了这个可执行文件的起始地址
  • DS (Data Segment):数据段寄存器,存放数据段基地址,除了BP寄存器外,其余寄存器都默认使用DS寄存器的值作为默认段基地址
  • SS (Stack Segment):堆栈段寄存器,存放堆栈段基地址,SS:SP 指向栈顶元素,使用PUSH指令压栈时 SP=SP-1,使用POP指令弹栈时 SP=SP+1
  • ES (Extra Segment):附加段寄存器,存附加段基地址

32/64位CPU地址总线和数据总线宽度保持一致,直接使用寄存器就可以寻址整个内存空间,因此 WIN32及之后汇编中不再通过段寄存器将内存进行分段,也无需再使用段寄存器进行寻址。

(3) 指令指针和标志寄存器: (2个)

  • IP (Instruction Pointer):指令指针寄存器,CS:IP 指向CPU当前将要读取的指令的地址,当一个可执行文件加载到内存中以后,CS:IP 便指向了这个可执行文件的起始地址
  • FLAG:标志寄存器,每一个位都表示不同的状态,存储的信息通常又被称作程序状态字 (PSW)
    在这里插入图片描述
    CF:进位标志,运算结果最高位进位时置1
    PF:奇偶标志,运算结果低8位中“1”的个数为偶数时置1
    AF:辅助进位标志,运算结果低4位产生进位时置1
    ZF:零标志,运算结果为0时置1
    SF:符号标志,运算结果为负时置1
    TF:跟踪标志,置1时进入单步调试状态
    IF:中断标志,置1时开中断,置0时关中断,缺省值为1
    DF:方向标志,置1时串操作为减地址方式,置0时为增地址方式,缺省值为0
    OF:溢出标志,运算结果超出范围时置1

2.32/64位CPU寄存器

第一款应用于桌面计算机的32位CPU是Intel公司的80386,这也是x86系列中第一个32位CPU,采用IA-32架构,80386除了包含8086所有的寄存器,并把通用寄存器、指令指针寄存器、标志寄存器从16位扩充成32位之外 (名字变为EAX、EBX、ECX…),还增加了两个16位的段寄存器FS和GS:

  • FS (Flag Segment):标志段寄存器
  • GS (Global Segment):全局段寄存器

32位之后又发展出64位的CPU,第一款应用于桌面计算机的64位CPU是AMD公司的Athlon64,其寄存器在80386基础上把通用寄存器、指令指针寄存器、标志寄存器从32位扩充成64位 (名字变为RAX、RBX、RCX…),同时又增加了8个通用寄存器R8-R15 (因为通用寄存器原先有8个0-7,所以新增加的从编号8开始),x86系列寄存器对比如下图所示:
请添加图片描述

 
posted on 2022-12-04 12:10  不及格的程序员-八神  阅读(102)  评论(0编辑  收藏  举报