我正在将x86 Assembly转换为C代码,并且无法弄清楚为什么这两行在下面等于C代码。
汇编代码:
sall $31, %eax
sarl $31, %eax
等效C代码:
int t = t & 0x7FFF;
其次,C代码的等效表达式是:
t = t << 31;
t = t >> 31;
答案 0 :(得分:0)
sall / sarl组合不等同于AND 0x7FFF。由于它是算术移位(与逻辑相反),当向右移位时,它会使用符号位的副本填充这些位。因此,如果eax在最左边的位中为零,则它变为零,如果它有一个,则变为0xffffffff。
SALL线将寄存器几乎一直移到左边。最右边(第0)位成为最左边(第31位,AKA是符号位)。然后向右移动将最左边的位移回最右边的位置,用其副本填充移入的位。
<<
/ >>
右侧组合 等效,只要将t声明为有符号数据类型(默认情况下int
已签名)。移位无符号数据类型不会签名扩展;在汇编级别,这是SHRL命令。