我对 32 位和 64 位系统的处理器架构有疑问。
当您使用 64 位系统时,我认为这意味着您拥有一个 64 位宽的字节可寻址内存地址总线和 CPU 本身中的 64 位宽寄存器。
其中一个寄存器是指令寄存器,用于保存当前执行的指令。该寄存器也是 64 位宽。
我的问题是
64 位宽的指令如何能够包含对 64 位地址的引用,并将其加载到 CPU 的寄存器中?指令寄存器只有 64 位宽,因此不再有操作码的位置了?
另外,当内存地址指的是内存的一个字节(最大整数为 2^8 - 1)时,如何表达 64 位整数?
当 ALU 将 2 个 64 位整数相加,而结果无法用 64 位整数表示时,它会做什么?
答案1
64 位宽的指令如何可以包含对 64 位地址的引用以将其加载到 CPU 的寄存器中?
当我进行汇编编程时,通常一条指令会进入与包含其他数据(如内存地址)的寄存器不同的内存(不同的寄存器)。
指令寄存器只有 64 位宽,所以没有地方存放操作码了?
通常,完整的汇编指令类似于:“ADD AX,BX”。(具体细节可能因所使用的汇编程序而异。)在这种情况下,CPU 将获取 AX 寄存器的值,将其添加到 BX 寄存器的值,然后存储结果。例如,如果 AX 存储 2,而 BX 存储 7,则结果可能是 AX 存储 9。(这是 16 位:对于 64 位,您可能使用 RAX 而不仅仅是 AX。)
另外,当内存地址指的是内存的一个字节(最大整数为 2^8 - 1)时,如何表达 64 位整数?
内存地址,就像房子所在的物理地址一样,仅指内存的位置。64 位整数不会完全存储在 1 个字节中;那将占用 8 个字节。
当 ALU 将 2 个 64 位整数相加,而结果无法用 64 位整数表示时,它会做什么?
它只是将结果存储在它认为可用的 64 位内。但是,它还会翻转“溢出”标志。程序员可以检查“溢出”标志是否被翻转,并意识到结果超出了 64 位,因此结果没有完全存储在寄存器中。