assembly - 为什么英特尔不提供其 CPU 寄存器的高阶部分?

标签 assembly x86 cpu-registers

在汇编中编程并进行某种字符串操作时,我使用 al , ah有时其他人持有字符,因为这允许我在我的寄存器中保留更多数据。我认为这是一个非常方便的功能,但英特尔的工程师似乎不同意我的观点,因为他们没有使寄存器的两个高位字节可访问(或者我错了吗?)。我不明白为什么。我想了一会儿,我的猜测是:

  • 它们会使 CPU 变得过于复杂
  • 他们没用
  • 也许以上两者

  • 我想出了第二个,因为我从来没有见过一个编译的程序(比如 gcc)使用 albh或其中任何一个。

    最佳答案

    虽然有点笨拙,但你可以用 rol reg,16 交换寄存器的一半。 (或 ror reg,16 ,如果您愿意)。在 Netbust CPU (Pentium IV) 上,这非常低效,但在大多数较新(或较旧)的 CPU 上,您通常有一个桶形移位器可以在一个时钟内完成这项工作。

    至于他们为什么不这样做,很简单:如果他们真的想这样做,他们需要彻底重新设计指令编码。在最初的设计中,他们用完了所有适合他们用来指定寄存器的字段大小的代码。事实上,他们已经使用了一些技巧,其中编码的含义取决于模式,如果您需要使用不同的大小,还有地址大小和操作数大小前缀。例如,要在 32 位模式下运行时使用 AX,指令将在指令本身之前有一个操作数覆盖前缀。如果他们真的非常想要,他们可以扩展这个概念来指定诸如“寄存器 X 的第 16-23 位中的字节”之类的东西,但这会使解码更加复杂,并且解码 x86 指令已经相对痛苦.

    关于assembly - 为什么英特尔不提供其 CPU 寄存器的高阶部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5317928/

    相关文章:

    assembly - 如何强制 NASM 将 [1 + rax*2] 编码为 disp32 + index*2 而不是 disp8 + base + index?

    linux - 在汇编中将用户输入的十六进制转换为十进制

    x86 - PCI I/O BAR 地址 - 32 位还是 16 位?

    assembly - ARM 64 中堆栈指针和帧指针指向同一地址是否有效?

    model - 可以在序言中模拟一个简单的 CPU 吗?

    c - 为什么一些程序员的惯例是使用长位移位而不是直接赋值/将其存储为常量

    从masm 64调用C函数

    assembly - ASM : lock cmpxchg dest, src 中存在非法指令

    windows-phone-7 - x86 和 x64 选项对 Windows Phone 7 应用程序有什么意义吗?

    assembly - 了解 EIP (RIP) 寄存器如何工作?