我是学生,今年 - 第一年 - 我们必须学习一些编程语言。其中一个是Assembly x86。
我想知道我是否可以“合并”两个寄存器,并“将它们用作一个”。 我需要存储64位密钥来破译文本,但教授希望我们主要使用寄存器来完成工作。
密钥将“移动”,最不显着的位将用于解密文本中的一个字母,并且一个位(一些逻辑操作的结果与密钥中的位)将添加到“结束”的“结束”。键。
很抱歉提出一个愚蠢的问题和我的英语。
答案 0 :(得分:0)
对于具有此功能的处理器来说并不典型,但x86确实具有此功能,al,ah,ax,eax,rax是"组合"正如你所说的那样。您可以访问寄存器的部分内容。
使用大多数/任何有用的指令集,您可以屏蔽和移位并访问寄存器的某些部分......
答案 1 :(得分:0)
在汇编中,你并没有真正“组合”寄存器;它们是独立存储,就像高级语言中不相关的自变量一样。有一些指令可以将某些寄存器一起使用,但在大多数情况下,它们是独立使用的。
这意味着你没有“合并”寄存器;你只需将寄存器一起使用。因此,如果您需要复制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
有更有效的方法可以通过更大的尺寸来移动更大的构造,但这很容易理解,并且有效。