SHL和SAL之间的差异在80x86

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?它们有什么区别?

Mys*_*ial 31

根据,它们是相同的:

移位算术左(SAL)和移位逻辑左(SHL)指令执行相同的操作; 它们将目标操作数中的位向左移动(朝向更重要的位位置).对于每个移位计数,目标操作数的最高有效位被移入CF标志,最低有效位被清除(参见英特尔®64和IA-32架构软件开发人员手册中的图7-7,第1卷) ).

两者都可能只是为了完整性而包括在内,因为右移有区别的.

  • SAL 和 SHL 具有相同的操作码,它只是一个助记符同义词,如 `jne` 和 `jnz`。所以 CPU 不可能知道你写的是哪一个;他们必须表现得一样。 (3认同)

vit*_*oft 6

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被设置,因此它是移位,而不是旋转,低位清零,因此它在左边,而不是右边。在这种情况下,中间位没有任何作用,因为我们是从高位移出,而不是从高位移出。进去。)


有关的:

  • 我认为一个操作码有两个名称与拥有冗余操作码是分开的。Stephen Morse 的书只是说它们是相同的操作,因此可以共享操作码;我认为这只是偶然,有一个未使用的编码,8086 解码与“/4”SHL/SAL 相同。 (4认同)

ARI*_*TOS 5

shl和sal是相同的。它们具有相同的机器代码。
SHR和SAR是不是该same.They具有几乎相同的机器代码。(但不是)
检查这个