Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 组件8086中的SAL/SAR与SHR/SAR_Assembly_X86 16_Opcode - Fatal编程技术网

Assembly 组件8086中的SAL/SAR与SHR/SAR

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的功能保持相似 因为在左移的情况下没有什么可以保留的。在左移位改变符号的情况下(您可能希望以某种方式防止),没有溢出的结果将不适合寄存器(这是自动的-如果它适合,那么它一开始就不会溢出)。所以你无论如何也无能为力 但右移不会溢出,它会使数字

我正在学习汇编语言(特定于x86)。我知道
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所以这就是一个好的架构师和一个蠢货之间的区别。