2015-10-20 80 views
1

有没有办法完成以下等价物,而不用重复执行相同的指令两次?希望更有效率。添加注册以使用同一条指令注册

add si, cx 
add si, cx 
+0

添加两个寄存器就像我们可以得到的“有效”一样。您将很难找到任何更快或更短的指令。 –

回答

3

等效,而不必重复相同的指令:

shl cx, 1 
    add si, cx 

不是很多点,但。

+0

我想我可以在LEA中执行一个insn ... –

+0

@PeterCordes:不在x8086上 –

1

在16,32或386或更高版本的64位模式:

lea esi, [esi + ecx*2] ; shortest in 32bit mode. (one prefix in 64b mode: address size) 

lea esi, [rsi + rcx*2] ; shortest encoding in 64bit mode (no prefixes) 

lea si, [esi + ecx*2] ; shortest encoding in 16bit mode (one prefix: address size) 

它如果任一寄存器的高位为零,因为我们没有乘在一起无所谓。 进位/借位只向左传播(从LSB到MSB),并且缩放2也不是问题。 (从高部分无位回落到较低的部分)


通过有益的评论者多校后,我发现,16位寻址模式不允许使用cx作为寻址模式的一部分,在所有。即使在带有地址大小前缀的32位模式下也适用此限制。这就排除了在不支持32位寻址模式的CPU上使用LEA,但在现代CPU上的16位DOS或引导时代码应该没问题。

;; invalid even in 32bit mode (with address-size prefix) 
lea si, [si + cx*2] ; invalid 
lea si, [cx]   ; invalid 

实际8086个内核仍旧获得微控制器使用,但除此之外,学习的x86的版本残缺将会导致学习不理想的成语在32位和64位汇编做的事情。 Pre-386缺少几个重要功能,如movzx


另一种方法计算将是:

add cx, cx ; can run on more execution ports than shift-by-one on most CPUs 
add si, cx 

如果事后又没有必要的cx原值这不仅有助于。

如果计算si是关键路径上,但cx不是,这缩短了由一个add(一切1个循环,甚至P4)涉及si依赖关系链的等待时间。

+2

8086确实有LEA,但其索引寻址模式不允许cx作为寄存器之一,也不允许缩放其中一个寄存器。您将32位x386指令集的16位x8086弄混了。是的,8086内核可用作微控制器;你仍然可以得到它们:http://www.jameco.com/1/1/1111-8086-2-microprocessor-16-bit-32-io-8mhz-dip-40.html我认为8086指令集是在汇编语言课上也很流行,至少从我经常看到的问题来看。 –

+0

这是我以前试过的东西之一,我不工作。我正在使用8086. –

+0

@Ira:问题没有说8086,所以我给出了一个对16位实模式,32位模式或64位模式有效的答案,不是出于混淆。我希望它能在8086上工作,但我并不惊讶它没有。我不知道8086还是相关的,所以谢谢你的链接。我认为它只是被教导,因为它“更简单”。它有很多奇怪的限制,哪些寄存器可以做什么,所以学习8086只有当你想要写8086而不是现代的CPU。我不希望看到asm代码没有利用movzx和寻址模式等新功能。 –