只有在“选项”对话框的“调试”节点中启用了地址级调试时,“寄存器”窗口才可用。
寄存器是处理器(CPU)中的特殊位置,用于存储处理器正在积极处理的小型数据片段。 编译或解释源代码会生成指令,以便根据需要将数据从内存移到寄存器中,然后再次返回。 与访问内存中的数据相比,在寄存器中访问数据的速度非常快,因此允许处理器将数据保留在寄存器中并反复访问它往往比要求处理器不断加载和卸载寄存器的代码执行速度更快。 为了使编译器能够更轻松地将数据保留在寄存器中并执行其他优化,应避免使用全局变量并尽可能依赖局部变量。 据说以这种方式编写的代码具有良好的参考位置。 在某些语言(如 C/C++)中,程序员可以声明一个寄存器变量,该变量告知编译器始终尽量将变量保留在寄存器中。 有关详细信息,请参阅 Register Keyword。
寄存器可以分为两种类型:常规用途和特殊用途。 通用寄存器保存一般操作的数据,例如将两个数字相加或引用数组中的元素。 特殊用途寄存器具有特定用途和专用含义。 一个很好的示例是堆栈指针寄存器,处理器用于跟踪程序的调用堆栈。 作为程序员,你可能不会直接操作堆栈指针。 但是,对于程序正常运行至关重要,因为如果没有堆栈指针,处理器将不知道在函数调用结束时返回的位置。
大多数常规用途寄存器只保留单个数据元素。 例如,数组的单个整数、浮点数或元素。 一些较新的处理器具有较大的寄存器,称为矢量寄存器,可以保存少量数据。 由于它们包含这么多数据,矢量寄存器允许非常快速地执行涉及数组的作。 矢量寄存器最初用于昂贵的高性能超级计算机,但现在也在微处理器上变得可用,并且它们在密集图形操作中具有巨大的优势。
处理器通常具有两组常规用途寄存器,一组针对浮点运算进行了优化,另一组针对整数运算进行了优化。 毫不奇怪,这些寄存器称为浮点寄存器和整数寄存器。
托管代码在运行时被编译为本机代码,该代码可以访问微处理器的物理寄存器。 寄存器 窗口显示这些用于通用语言运行时或本机代码的物理寄存器。 “ 寄存器” 窗口不显示脚本或 SQL 应用程序的注册信息,因为脚本和 SQL 是不支持寄存器概念的语言。
有关显示 “寄存器 ”窗口的详细信息,请参阅 “使用寄存器窗口”。
查看 “注册” 窗口时,会看到条目,例如 EAX = 003110D8。
符号左侧的 = 符号是寄存器名称, EAX在本例中。 符号右侧的数字 = 表示寄存器内容。
使用 “寄存器 ”窗口,可以不仅仅是查看寄存器的内容。 在本机代码中处于中断模式时,可以单击寄存器的内容并编辑值。 这不是你应该随意做的事情。 除非你了解正在编辑的寄存器及其包含的数据,否则粗心编辑的结果可能是程序崩溃或其他一些意外的结果。 遗憾的是,各种 Intel 和 Intel 兼容的处理器的寄存器集的详细说明远远超出了本简要介绍的范围。
注册组
为了减少混乱, “寄存器 ”窗口将寄存器组织成组。 如果右键单击“ 注册 ”窗口,你将看到包含组列表的快捷菜单,你可以在看到适合时显示或隐藏这些列表。
注册标志
对于 Intel x86 处理器,你可能会在 “注册 ”窗口中看到以下标志。 在调试会话期间,还可以编辑这些标志。
| Flag | 设置值 |
|---|---|
| 溢出 | OV = 1 |
| 方向 | UP = 1 |
| 中断 | EI = 1 |
| 签名 | PL = 1 |
| 零 | ZR = 1 |
| 辅助携带 | AC = 1 |
| Parity | PE = 1 |
| 携带 | CY = 1 |