博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
被遗忘的寄存器
阅读量:5272 次
发布时间:2019-06-14

本文共 1872 字,大约阅读时间需要 6 分钟。

  CPU 里有一种名为寄存器的存储电路, 相当于机器语言中的变量. 具有代表性的寄存器有以下 8 个. 各个寄存器本来都是有名字的, 但现在知道这些名字的机会已经不多了, 所以在这里顺便介绍下.

    AX  accumulator, 累加寄存器

    CX  counter, 计数寄存器

    DX  data, 数据寄存器

    BX  base, 基址寄存器

    SP  stack pointer, 栈指针寄存器

    BP  base pointer, 基址指针寄存器

    SI  source index, 源变址寄存器

    DI  destination index, 目的变址寄存器

  这些寄存器全部都是 16 位寄存器, 因此可以存储 16 位的二进制数. 虽然它们都有上面这种正式名称, 但在平常使用的时候, 任命往往用简单的英文字母来代替, 称他们为 "AX寄存器", "SI寄存器" 等.

  关于 AX, CX, DX, BX 这几个寄存器名字的由来, 虽然我们找不到缩写为 X 的单词, 但这个 X 表示扩展 (extend) 的意思. 之所以说扩展是因为在这之前 CPU 的寄存器都是 8 位的, 而现在一下子变成了 16 位, 扩展了一倍.

  这 8 个寄存器全部合起来也只有 16 个字节, 换句话说, 就算我们把这 8 个寄存器都用上, CPU 也只能存储 16 个字节.

  另一方面, CPU 中还有 8 个 8 位寄存器.

    AL  accumulator low, 累加寄存器低位

    CL  counter low, 计数寄存器低位

    DL  data low, 数据寄存器低位

    BL  base low, 基址寄存器低位

    AH  accumulator high, 累加寄存器高位

    CH  counter high, 计数寄存器高位

    DH  data high, 数据寄存器高位

    BH  base high, 基址寄存器高位

  名字看起来有点像, 其实这是有原因的: AX 寄存器共有 16 位, 其中 0 位到 7 位的低 8 位称为 AL, 而 8 位到 15 位的高 8 位称为 AH. 所以, 如果以为 "再加上这 8 个 8 位寄存器, CPU 就又可以多保存 8 个字节了" 就大错特错了, CPU 还是那个 CPU, 依然只能存储区区 16 个字节. CPU 的存储能力实在太有限了.

  而 BP, SP, SI, DI 这几个寄存器不能为为 "L" 和 "H". 如果无论如何都要分别取高位或低位数据的话, 就必须先将值赋到 AX 中去, 然后用 AL, AH 来取值.

  32 位寄存器为:

    EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

  这些就是 32 位寄存器. 在 16 位寄存器的名字前面加上一个 E 就是 32 位寄存器的名字了. 这个字母 E 其实还是来源于 "extend" 这个词. 在当时主流为 16 位的时代里, 能扩展到 32 位算是个飞跃了. 虽说 EAX 是个 32 位寄存器, 但其实跟前面一样, 它有一部分是与 AX 共用的, 32 位中的低 16 位就是 AX, 而高 16 位既没有名字, 也没有寄存器编号, 也就是说, 虽然可以把 EAX 作为 2 个 16 位寄存器来用, 但只有低 16 位用起来方便, 如果我们要用高 16 位的话, 就需要使用位移命令, 把高 16 位移到低 16 位后才能用.

  这么说来, 就是 32 位的 CPU 也只能存储区区 32 字节, 存储能力还真是小的可怜.

  还有段寄存器 (segment register), 这些段寄存器都是 16 位寄存器:

    ES  extra segment, 附加段寄存器

    CS  code segment, 代码段寄存器

    SS  stack segment, 栈段寄存器

    DS  data segment, 数据段寄存器

    FS  segment part 2, 没有名字

    GS  segment part 3, 没有名字

 

  以上摘自《 30 天自制操作系统》, 作者 [日] 川合秀实.

转载于:https://www.cnblogs.com/acat/p/6754157.html

你可能感兴趣的文章
python之GIL release (I/O open(file) socket time.sleep)
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
2019年春季学期第四周作业
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>