1
15
由于8086是一个16位处理器,三种不同的版本涵盖了所有选项。
以下是设计师的选择:
否则就意味着
加倍
指令编码或加法的数量
如果只想更改寄存器的较高字节,只需执行以下操作:
在最初的8086中,有8字节大小的寄存器:
索引寄存器、基指针和堆栈寄存器没有字节寄存器。
在x64中,这一点已更改。如果有
是的,这称为“部分寄存器写入”。因为写作
你使用口罩加
真的从来没有
对于
|
2
4
一般的答案是,这种访问在某些意义上是昂贵的,很少需要。
SSA 基于。因此,您永远不会在其输出中看到XCHG指令;如果您在代码中的某个地方找到它,那么它是100%手动编写的程序集插入。RCL、RCR也是如此,即使它们适用于某些特定情况(例如,将uint32除以7),也可能适用于ROL、ROR。如果AMD放弃了其x86-64设计中的RCL、RCR,那么没有人会真正哀悼这些指令。 这不包括基于不同原理建模并与主要原理正交的矢量设施。当编译器决定对XMM寄存器执行4个并行uint32操作时,它可以使用PINS*指令替换此类寄存器的一部分,或使用PEXTR*来提取它,但在这种情况下,它会一次跟踪2-4-8-16…个值。但这种矢量化不适用于主寄存器集,至少在最先进的主ISA中是这样。 register renaming )它们分别(例如,添加2个寄存器源并提供1个寄存器结果)而不是分别提供寄存器的每个部分,并计算(对于同一示例)获得16个单字节源并生成8个单字节结果的指令。(这就是为什么x86-64被设计为32位寄存器写入清除64位寄存器的上32位;但这不是针对8位和16位操作的,因为出于遗留原因,CPU已经需要与以前寄存器值的高位合并。) 在彻底的CPU设计革命之前,有一些机会看到这种情况在未来发生变化,但我认为这种可能性非常小。 如果您当前需要访问部分寄存器,例如RAX的位40-47,则可以通过复制和旋转非常容易地实现。要提取它:
要替换值:
这些代码块是线性的,速度足够快。 |
3
3
历史上还有一个步骤,8086之前的8位8080。尽管它是一个8位处理器,但您可以使用8位寄存器对来执行一些16位操作。 https://en.wikipedia.org/wiki/Intel_8080#Registers 因此,为了更容易地将8080汇编代码转换为8086代码,新的16位寄存器被设计为可选的8位寄存器对,这在当时似乎很重要(英特尔甚至提供了一个程序来自动完成这项工作)。 然而,在8086中,没有使用16位寄存器对进行32位操作的功能,因此当386出现时,似乎不需要将32位寄存器拆分为两个16位寄存器。 如Johan所示,指令集仍然提供了从最低16位获取两个8位寄存器的方法。但该(mis)特征没有扩展到更高的宽度。
|
Tedi · 在保存和检索机制之间包含命令的代码 7 年前 |
Bibrak · 如何从程序集传递堆栈中某个位置的内存地址? 7 年前 |
G. Guidi · 为什么寄存器$v0被保存? 7 年前 |
Vagish · C:通过引用传递自动变量 7 年前 |
St.Antario · 了解cpu寄存器 7 年前 |
Dfarrelly · x86给定AH和AL计算AX? 8 年前 |
CRThaze · 函数中寄存器使用的ARMv6最佳实践 10 年前 |