Hos*_*her 26 assembly bit-shift x86-16
我已经学会了如何使用80x86汇编程序,所以在逐位移位操作中,我遇到了SAL和SHL使用的问题.我的意思是代码行之间的区别如下:
MOV X, 0AAH
SAL X, 4
MOV X, 0AAH
SHL X, 4
Run Code Online (Sandbox Code Playgroud)
什么时候应该使用SHL和使用SAL?它们有什么区别?
SHL 和 SAL 在功能上是等效的,但在概念上并不相同。D3x86 架构为移位/循环指令保留的操作码在格式上r/m32, CL有 8 个位置,按Reg/Opcode字节字段区分ModR/M:
D3 /0 ROL
D3 /1 ROR
D3 /2 RCL
D3 /3 RCR
D3 /4 SHL
D3 /5 SHR
D3 /6 SAL # not officially documented
D3 /7 SAR
Run Code Online (Sandbox Code Playgroud)
由于 SAL 和 SHL 的工作方式相同,Intel 官方文档
保留了
该位置D3 /6 SAL,但其编码有效。一些汇编器允许通过未记录的助记符 SAL2 选择此编码。
SHL/SAL 并不是此类冗余的唯一案例。TEST reg, imm编码的F7 /0工作方式与未记录的编码相同F7 /1。
Stephen Morse,8086 的 ISA/机器代码架构师,写了一本书《8086 Primer》,目前可以在他的网站上免费阅读;第 65、66 页描述了移位/旋转机器代码,但他没有提及未使用的/6编码,而是说 SHL 和 SAL 是相同的操作并使用D0 /4操作码。(这本书是针对使用 8086 的程序员,而不是直接分析设计决策,所以这并不完全令人惊讶。)
8086 没有 #UD 非法指令异常:所有内容都被解码为某种东西,并且很可能最容易安排/6运行相同的内容/4,以便它们都可以左移而不是使其成为 NOP。(3 位字段的高位/r被设置,因此它是移位,而不是旋转,低位清零,因此它在左边,而不是右边。在这种情况下,中间位没有任何作用,因为我们是从高位移出,而不是从高位移出。进去。)
有关的: