Assembly 组件8086中的SAL/SAR与SHR/SAR
我正在学习汇编语言(特定于x86)。我知道Assembly 组件8086中的SAL/SAR与SHR/SAR,assembly,x86-16,opcode,Assembly,X86 16,Opcode,我正在学习汇编语言(特定于x86)。我知道 SAL和SHL的工作方式类似(清除lsb并将msb携带到CF) 考虑到SHR和SAR的运行方式不同(后者保持msb不变) 我想清楚地了解一下为什么移位算术右键SAR的功能定义不同于移位右键SHR,但同时SHL和SAL的功能保持相似 因为在左移的情况下没有什么可以保留的。在左移位改变符号的情况下(您可能希望以某种方式防止),没有溢出的结果将不适合寄存器(这是自动的-如果它适合,那么它一开始就不会溢出)。所以你无论如何也无能为力 但右移不会溢出,它会使数字
SAL
和SHL
的工作方式类似(清除lsb并将msb携带到CF)
考虑到SHR
和SAR
的运行方式不同(后者保持msb不变)
我想清楚地了解一下为什么移位算术右键
SAR
的功能定义不同于移位右键SHR
,但同时SHL
和SAL
的功能保持相似 因为在左移的情况下没有什么可以保留的。在左移位改变符号的情况下(您可能希望以某种方式防止),没有溢出的结果将不适合寄存器(这是自动的-如果它适合,那么它一开始就不会溢出)。所以你无论如何也无能为力
但右移不会溢出,它会使数字变小(或保持不变)。因此,现在您可以选择,是否保持顶部位不变。右移对于有符号和无符号值是不同的。左移并不重要。我相信SHL和SAL实际上是一条有两个名称的单指令。“我相信SHL和SAL实际上是一条有两个名称的单指令。”正确。就像
JE
和JZ
@user3528438:这并不能真正解释这一点,除非您打算以与其他平台类似的方式实现C。C标准特别保留了符号值的右移实现定义的行为。它可能会也可能不会对extend进行签名,使用shr
将是一个非常有效的C实现。由于sar
存在,因此使用它更有意义。有可能使一个符合标准的C实现非常不友好地使用,并且违反了许多代码中的许多假设。@PeterCordes所以这就是一个好的架构师和一个蠢货之间的区别。