Assembly 有没有可能;“合并”;两个寄存器?

Assembly 有没有可能;“合并”;两个寄存器?,assembly,x86,cpu-registers,Assembly,X86,Cpu Registers,我是一名学生,今年——第一年——我们必须学习一些编程语言。其中之一是汇编x86 我想知道我是否可以“合并”两个寄存器,并“将它们作为一个使用”。 我需要存储一个64位密钥来破译文本,但教授希望我们的工作主要使用寄存器 键将“移动”,最小有效位将用于解密文本中的一个字母,一位(键中位的某些逻辑操作的结果)将添加到键的“末尾” 很抱歉问了一个愚蠢的问题,我的英语也是如此。处理器不具备这种功能,但x86确实具有这种功能,al、ah、ax、eax和rax是您所说的“组合”的。您可以访问部分寄存器 对于大

我是一名学生,今年——第一年——我们必须学习一些编程语言。其中之一是汇编x86

我想知道我是否可以“合并”两个寄存器,并“将它们作为一个使用”。 我需要存储一个64位密钥来破译文本,但教授希望我们的工作主要使用寄存器

键将“移动”,最小有效位将用于解密文本中的一个字母,一位(键中位的某些逻辑操作的结果)将添加到键的“末尾”


很抱歉问了一个愚蠢的问题,我的英语也是如此。

处理器不具备这种功能,但x86确实具有这种功能,al、ah、ax、eax和rax是您所说的“组合”的。您可以访问部分寄存器


对于大多数/任何有用的指令集,您可以屏蔽、移位和访问寄存器的部分…

在汇编中,您并不真正“组合”寄存器;它们是独立的存储,就像高级语言中不相关的独立变量一样。有一些指令可以一起使用某些寄存器,但在大多数情况下,它们是独立使用的

这意味着你不需要“组合”寄存器;您只需将寄存器一起使用。因此,如果您需要复制64位,而您只有32位寄存器,您只需同时复制这两个部分:

; Copy both halves of the key, the low part into eax, the high part into edx.
mov eax, [src]
mov edx, [src+4]

; Copy both halves out to memory somewhere.
mov [dest], eax
mov [dest+4], edx
如果需要移位“较大”值,可以同时移位两个寄存器。有两种方法可以做到这一点:您可以巧妙地使用shift和rotate指令,也可以使用“组合”特殊的
shld
shrd
指令

让我们看一下如何将64位组合键移动一位位置,使用老式方法:

shl eax, 1    ; Shift eax up one bit, putting its top bit into the carry flag.
rcl edx, 1    ; Rotate edx up by one bit, bringing in the carry flag at the bottom.

shr edx, 1    ; Shift edx down by one bit, putting its bottom bit into the carry flag.
rcr eax, 1    ; Rotate eax down by one bit, bringing in the carry flag at the top.
现在让我们看看如何使用“更新的”
shrd
shld
指令:

shrd edx, eax, 1   ; Consider edx+eax together as a single register, and shift right by one bit.

shld edx, eax, 1   ; Consider edx+eax together as a single register, and shift left by one bit.
shrd
shld
指令按照“高寄存器”和“低寄存器”的顺序写入

请注意,虽然没有128位等效于
shrd
shld
,但多指令表单可以处理您需要的任意多个位。例如,如果edx+ecx+ebx+eax形成一个“大”寄存器,您可以将它们一次上下移动一位,如下所示:

; Move everything up by one bit.
shl eax, 1
rcl ebx, 1
rcl ecx, 1
rcl edx, 1

; Move everything down by one bit.
shr edx, 1
rcr ecx, 1
rcr ebx, 1
rcr eax, 1

有更有效的方法可以将更大的构造移动到更大的大小,但这很容易理解,而且很有效。

查找
shld
指令。还可以使用进位标志将多个寄存器作为一个寄存器使用。例如,要添加两个寄存器对,对低半部分使用
add
,对高半部分使用
adc