为什么SHL和SAL相同

PLC移位与循环移位指令 左移位指令(SHL)、右移位(SHR)是指将输入单元IN的值左移或者右移N位,移位结果保存到OUT单元中,对于移位操作,ENO总是TURE。无符号数:无论左移还是右移空位均填0有符号数:左移出现空位填0;右移出现空位用符号位填空,正数符号为0、负数符号为1。N表示移动的位数,当N=0,无须移位直接将N赋值给OUT即可当N大于目标值中的位数,所有原始值将被移出,最终OUT被赋值为0循环左移指令(ROL)、循环右移指令(ROR)将参数IN循环左移或右移N位,结果保存至OUT中,其中N位移动位数。 阅读详情

1 移位指令简介

1.1 左移

SAL		OPD, OPS               ; 算术左移,操作数左移,最低位补0,最高位进CF
SHL		OPD, OPS               ; 逻辑左移,操作数左移,最低位补0,最高位进CF

1.2 右移

SAR		OPD, OPS			   ; 算术右移,操作数右移,最高位不变,最低位进CF
SHR		OPD, OPS			   ; 逻辑右移,操作数右移,最高位补0,最低位进CF

我们会发现,左移指令 SAL 和SHL是进行同样的操作
而右移指令 SAR和SHR 进行的是不同的操作

2 为什么两者会有不同呢?

先来看一段C语言代码:

#include <stdio.h>
int main(void)
{
    char n = 64;
    unsigned char m = 64;
    n = n << 1;
    m = m << 1;
    printf("n = %d\n", n);
    printf("m = %d", m);
    return 0;
}

运行结果:

n = -128
m = 128

我们知道C语言中移位操作常用于快速乘除(左移为乘,右移为除)
但是64为什么左移1位(*2)后变成了一个负数呢?
十进制数64的二进制码为01000000,当它左移后变成10000000
n为一个有符号数,所以10000000就是 -128
m为一个无符号数,所以10000000就是128

2.1 对于左移操作

可以发现,左移操作相当于乘法操作,它是会让操作数变大的,也就是说,它随时存在着溢出的风险

若左移操作保留符号位的话,那么左移会出现越来越小的情况,但是你的本意是让这个数变大这里写图片描述

最后却发现左移后的数变小了,为了规避这种溢出带来的问题,统一了左移操作,也就是说,在左移操作中,寄存器只负责储存这个数(不管是否合乎人意,它只要是个数就行),若没有溢出的时候,则原样存储。所以说左移操作是会改变符号位的(也就是上述C语言的例子)。

2.2 对于右移操作

我们知道右移操作的算术操作是除法,那么在计算机中是肯定让这个数变小的,所以不存在溢出的风险,那么设计者就把是否保留符号位的权力交给了程序编写人员,所以 SAR 和SHR 是两个不同的操作。

2.3 这样就能说明SHL和SAL是相同的吗?

2.3.1 对于左移操作:

这里写图片描述

这里写图片描述

可以明显发现,两者对应操作的机器码是完全相同的,由此可以断定, SHL 和 SAL是不同名的同种操作,下面再来看右移操作。

2.3.2 对于右移操作

这里写图片描述

这里写图片描述

可以发现他们对应的机器码是不同的,所以 SAR和 SHR是两个不同的操作。

3 其他

关于这两者,维基百科提到:

Logical shifts are best used with unsigned numbers
逻辑移位最好用于无符号数

In an arithmetic shift, the spaces are filled in such a way to preserve the sign of the number being slid. For this reason, arithmetic shifts are better suited for signed numbers in two’s complement format
在算术移位中,移位空间被补0或者保留高位(即符号位)的方式处理,因此,算术移位操作更适用于两个有符号数的补码操作


参考:
x86 Assembly - wikibooks
SAL/SAR/SHL/SHR - 移位操作码表


汇编移位指令SHR,SAR,SAL/SHL,ROR,ROL,RCR,RCL 汇编移位指令汇编循环移位指令汇编shl指令用法汇编sal指令汇编移位运算 阅读详情

相关推荐

基于FPGA的DDS信号发生器

之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk...

qq_43534451的博客 9949

汇编指令--移位操作SHL、SHR、SAL、SAR以及它们的区别

逻辑移位: SHL、SHR 算术移位: CAL、CAR 12 无符号数的乘法和除法可以用逻辑移位; 有符号数的乘法和除法可以用算...

deniece1的博客 4万+

PyBioMed学习

PyProtein。

weixin_63016274的博客 1401

x86移位SHL、SHR、SAL、ROL、RCR等指令

SHL指令使dest左移count位,低位用0补充,高位的值移位到CF位(覆盖原CF位)SHL指令的可用操作类型如下代码示例如下 关于OF位的实验数据 SHR指令 SHR指令使dest右移count位,高位用0补充,低位的值移位到CF位(覆盖原CF位)SHR指令的操作类型和SHL一致代码示例如下 关于OF位的实验数据 SAL指令(算术左移)的操作和SHL一致 SAR指令(算术右移) SAR指令使dest右移count位,高位用dest的最高位补充,低位的值移位到CF位(覆盖原CF

13岁的少年相当白帽子的博客 1万+

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 718

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 79

汇编语言SAL SHL的比较

SHL逻辑左移、SAL算术左移的指令完全相同; 格式:SHL d,count 操作:SHL指令可将目标操作数的内容向左移位,移位的位数由count给定,每左移一位,操作数最高位的状态移入CF标志位,末位补0;

weixin_45604914的博客 1746

一个代码循环计算水在石墨烯表面的接触角

石墨烯接触角

Rockyoung 2574

汇编学习之《移位指令》

当我们执行SAL EAX 1语句后, 最高位放入二零EFL标志寄存器的CF位,通过OD也可以看到C位是1,同时最低位1向左移动1位后,十六进制的结果就是2;备注: 无论左移还是右移,是将对应的最高或最低位放入到CF中,也就是说放入前是0,CF是1,放入后CF就是0,反之亦然。通过上面我可以看到,我们设置MOV EAX, 80000001后, 其实32位最高位就是1,最低位也是1,右移一次,最高位不变,然后向右移动,最低位移入EFL 标志寄存器的CF位中。OllyDbg查看执行查看。

u011374344的专栏 1464

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5404

汇编SHR、SHL、SAR、SAL、ROL、ROR、RCL、RCR指令

SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left): 逻辑左移 ;SHR(Shift Right): 逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Arithmetic Right): 算术右移 ;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同. ;SH...

include的博客 1万+

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型

在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。

盼小辉丶的博客 3507

汇编移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR

SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Arithmetic Right): 算术右移 ;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同

richerg85的专栏 6万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汇编_指令_SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR

;SHL(Shift Left): 逻辑左移 ;SHR(Shift Right): 逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Arithmetic Right): 算术右移 ;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同. ;SHL、SAL: 每位左移, ...

weixin_30271335的博客 2774

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汇编语言shl/shr与sal/sar的使用

移位指令分为逻辑移位指令和算术移位指令 shl 与 shr 属于逻辑移位指令 shl逻辑左移指令 将寄存器或内存单元的数据左移 最低位用 0 补充 最高位进入 CF 例子: mov ax,8fh ;mov ax,1000 1111b shl ax,1 ;将ax左移一位 执行后 (ax) = 0001 1110b ;1eh CF = 1 如果我们需要移动的位数大于1时,需要...

weixin_43853811的博客 7530

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汇编移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR 汇编移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR

转自http://blog.youkuaiyun.com/richerg85/article/details/27558005 SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移

xbgprogrammer的专栏 6760

Win32ASM学习[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD

一. SHL、SHR、SAL、SAR: 移位指令 ---------------------------------------------------------------------------------------------------- ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift

bingghost 6570

Win32 汇编 - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD

SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Arithmetic Right): 算术右移 ;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同

BetaBin 1万+

学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD

SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL(Shift Arithmetic Left): 算术左移 ;SAR(Shift Arithmetic Right): 算术右移 ;其中的 SHL 和 SAL 相同, 但 SHR 和 S...

zzc1684的博客 329

汇编语言——逻辑运算和移位指令

逻辑运算和移位指令 逻辑运算指令 逻辑与AND 格式 AND reg, imm/reg/mem ;reg←reg^imm/reg/mem AND mem, imm/reg ; mem←-mem ^ imm/reg 功能:对两个操作数执行按位的逻辑与运算,结果送到目的操作数 说明: (1)按位的逻辑与运算; (2)操作数不能同时为存储器操作数; (3)注意对标志位的影响; (OF,CF==0) 思...

olivia12344321的博客 8456

C语言逻辑左移指令shl怎么用,汇编语言SHL(左移)指令:将操作数逻辑左移一位...

SHL(左移)指令使目的操作数逻辑左移一位,最低位用 0 填充。最高位移入进位标志位,而进位标志位中原来的数值被丢弃:若将 1100 1111 左移 1 位,该数就变为 1001 1110:SHL 的第一个操作数是目的操作数,第二个操作数是移位次数:SHL destination,count该指令可用的操作数类型如下所示:SHL reg, imm8SHL mem, imm8SHL reg, CLS...

weixin_27102543的博客 4696

SHL SHR, SAL SAR, ROL ROR

//____逻辑移动是针对无符号数的______________________________________________ 逻辑左移SHL 逻辑右移SHR: unsigned int i = 0x1234; unsigned int j = 0; j = i >> 8; //右移,执行后 j= 0x12; j = i <...

weixin_30677073的博客 212

算术移位操作和逻辑移位操作的区别和联系(转)

移位操作有很多种,一般知道算术移位操作(2个),逻辑移位(2个)这四个,一般的程序就够用了。 移位操作都会引起被移位方向的一些数据丢失,所以需控制好。逻辑移位是连标志位(正负号)一起操作的,所以可能会改变正负号。而算术移位是固定好标志位,移动其他的位,不会改变正负号,但前面被移动的位是补0还是补1,如果标志位是1,则都补1,是0,则都补0。 1.逻辑移位(不管是左移位还是右移位)...

对酒当歌,人生几何 1539
上一篇: Java中对象的储存区
下一篇: 什么是补码,怎么求补码
syzdev
博客等级 码龄9年 852粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值