对于这个难以理解的标题,我很抱歉——我无法编出更好的标题。
我正在尝试学习汇编(AT&T)并且对寄存器有疑问:
每个寄存器名称都访问完全不同且独立的内存吗?或者它们是否允许访问一个寄存器的特定较小部分,从而寻址相同的内存?例如: al 是否寻址 ax、eax 和 rax 的最低 8 位,以便修改 ah 修改 ax、eax 和 rax 的第 9-16 位?还是 ah, al, ax, eax & rax 都是不同的独立寄存器?
在此先感
谢莫里茨
3 回答
需要明确的是:寄存器不驻留在内存中,也没有地址。
是的,是寄存AX
器的低 16 位。是 的高位和低位 8 位。这都是一个具有不同名称的单一寄存器,用于不同的访问方式。这是针对 x86 的:EAX
AH
AL
AX
图片来自:http ://www.c-jump.com/CIS77/CPU/x86/lecture.html#X77_0070_gp_registers
寄存器使用某种称为触发器的电子周期,触发器是一个存储 0 或 1 并保持存储的周期。一个 N 大小的寄存器是一个由 N 个触发器组成的块。触发器如下所示:
- 时钟:是一个触发器,当它激活时,数据被传递,所以没有数据,0或1,由上升存储。它由 CPU 中的控制单元控制。
- 输入:是 1 位的输入,细线,在触发器中存储 0 或 1。
- 输出:是可以读取数据的输出。
在 32 位寄存器中,其中 32 个对齐在一个块中,具有 32 位输入和 32 位输出:
注意,在这个寄存器中没有子寄存器,比如eax
, ax
, ah
, al
。我猜英特尔家伙必须使用 4 位时钟而不是 1 作为:
- 第一个时钟,激活所有 32 位触发器,
eax
. - 第二个时钟,仅激活低 16 位触发器,
ax
. - 第三个时钟,仅激活第二个 8 位,
ah
. - 第四个时钟,仅激活前 8 位,
al
.
类似于(8 FF,8 个触发器,这些点表示线路已连接在那里):
现在,当处理器对指令进行解码时,它可以使用指令的操作码来判断您想要哪条指令、目标寄存器、触发哪个时钟:
[b0] ff mov $0xff, %al
[b4] ff mov $0xff, %ah
[66 b8] ff ff mov $0xffff, %ax
[b8] ff ff ff ff mov $0xffffffff, %eax
实物可能不同,但原理是一样的。您可以在任何逻辑设计或计算机体系结构书籍中阅读有关这些内容的更多信息,但您不需要它来启动汇编程序,但它会帮助您了解这些内容是如何工作的。
除了通用寄存器部分之间的重叠之外,mm
寄存器别名为 x87 堆栈,并且xmm
寄存器重叠ymm
寄存器(如果适用)。