回答
等效,而不必重复相同的指令:
shl cx, 1
add si, cx
不是很多点,但。
我想我可以在LEA中执行一个insn ... –
@PeterCordes:不在x8086上 –
在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
依赖关系链的等待时间。
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指令集是在汇编语言课上也很流行,至少从我经常看到的问题来看。 –
这是我以前试过的东西之一,我不工作。我正在使用8086. –
@Ira:问题没有说8086,所以我给出了一个对16位实模式,32位模式或64位模式有效的答案,不是出于混淆。我希望它能在8086上工作,但我并不惊讶它没有。我不知道8086还是相关的,所以谢谢你的链接。我认为它只是被教导,因为它“更简单”。它有很多奇怪的限制,哪些寄存器可以做什么,所以学习8086只有当你想要写8086而不是现代的CPU。我不希望看到asm代码没有利用movzx和寻址模式等新功能。 –
- 1. 使用添加一个空的注册?
- 2. Spray.io指令不注册?
- 3. 如何使用“注册添加”来编写此注册表?
- 4. 查找注册表父文件夹以添加注册表
- 5. Firebase中的未注册注册令牌
- 6. 在angular2全局注册一个指令
- 7. 组装指令mov寄存器,[注册] [注册]
- 8. 注册后注册用户
- 9. 在Node.JS中使用Passport注册(注册)
- 10. C++添加注册表项
- 11. C++添加到注册表
- 12. 添加注册成员
- 13. 以注册形式添加复选框
- 14. FCM注册令牌
- 15. 向注册表添加条目以启动应用程序
- 16. 使用'RegisterWindowMessage'注册的消息是否可以取消注册?
- 17. 在Windows注册表项顶部添加注册表项#
- 18. 注册与注册邮箱
- 19. 用PHP注册MySQL的用户注册
- 20. 注册用户和未注册用户
- 21. 用Javascript注册用户注册登录
- 22. ASP.NET - @ Register注册指令的放置
- 23. x86汇编指令:CALL *注册
- 24. 如何以注册方式向asp:RadioButton控件添加注册商标符号(R)?
- 25. 如何注册一个接口并使用QtDbus注册方法?
- 26. 注册使用ScriptManager.RegisterClientScriptBlock
- 27. 使用Unity注册
- 28. 注册使用Unity
- 29. 使用AngularJS注册
- 30. 注册页面没有注册用户
添加两个寄存器就像我们可以得到的“有效”一样。您将很难找到任何更快或更短的指令。 –