滴水三期:day25.1-汇编和C的移位指令

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

一、为什么要位运算

  • 位运算的效率很高
  • 因为计算机处理的都是一些二进制数,计算机不懂我们所说的加减乘除,这些所有的运算,计算机最后都会使用位运算得到结果
  • 位运算还可以用来加密

二、汇编中的移位指令

1.算数移位指令

  • SAL(Shift Arithmetic Left):算术左移(和SHL效果一样)

  • SAR(Shift Arithmetic Right):算术右移

  • 格式:SAL/SAR Reg/Mem, CL/Imm

    即算数移位指令后面的第一个操作数是寄存器或者内存;第二个操作数是寄存器或者立即数

    SAL eax,2
    SAL ax,1
    SAL al,3
    
  • 怎么实现:

    • 如果SAL eax,1,表示将eax中的数(4字节)左移1位,最高位的数移入到CF进位标志位中,最低位补0

    • 如果SAR ax,1,表示将ax中的数(2字节)右移1位,最高位的补原来的ax中的符号位(原来的最高位),最低位移入到CF进位标志位中

      举例:
      SAR al,1         //al:10000001右移一位最高位补原来符号位,最低位移入CF,即11000000 / CF:1
      SAL al,2         //al:10000001左移两位最高位移入CF,最低位补0,即00000100  /  CF:0
      
    • 如果是移动位数大于1,就一个一个依次按照移动1位这样做

  • 特殊:

    SAL al,8    //表示将al寄存器中8位全部变成0
    SAR ax,0x10  //表示将ax寄存器中16位全部原来最高位的符号位
    

    为什么sar/sal eax,0x20有点问题

2.逻辑移位指令

  • SHL(Shift Left):逻辑左移

  • SHR(Shift Right):逻辑右移

  • 格式:SHL/SHR Reg/Mem, CL/Imm

    SHL eax,2
    SHR word ptr es:[ebp],1
    SHL al,1
    
  • 怎么实现:

    • 如果SHL eax,1,表示将eax中的数(4字节)左移1位,最高位的数移入到CF进位标志位中,最低位补0

    • 如果SHR al,1,表示将al中的数(1字节)右移1位,最高位补0,最低位移入到CF进位标志位中

      举例:
      SHR al,1          //al:10000001右移一位最高位补0,最低位移入CF,即01000000  /  CF:1
      SHL al,1          //al:01000001左移一位最高位移入CF,最低位补0,即10000010  /  CF:0
      

3.循环移位指令

  • ROL(Rotate Left):循环左移

  • ROR(Rotate Right):循环右移

  • 格式:ROL/ROR r/m, i8/CL

    ROL eax,3
    ROL cx,1
    ROR cl,2
    
  • 怎么实现:

    • 如果ROL eax,1,表示将eax中的数循环左移1位,最高位的数补到最低位,并且最高位的数移入CF标志位

    • 如果ROR al,1,表示将al中的数循环右移1位,最低位的数补到最高位,并且最低位的数移入CF标志位

      举例
      ROL al,1    //al:10000001循环左移一位最高位补到最低位,最高位移入CF,即00000011  /  CF:1
      ROR al,1    //al:10000001循环右移一位最低位补到最高位,最低位移入CF,即11000000  /  CF:1
      

4.带进位的循环移位指令

  • RCL(Rotate through Carry Left):带进位循环左移

  • RCR(Rotate through Carry Right):带进位循环右移

  • 格式:RCL/RCR r/m, i8/CL

    RCL eax,1
    RCR cx,2
    RCR al,1
    
  • 怎么实现:

    • 如果RCL al,1,表示将al中的数循环左移一位,最高位移入CF标志位,并且CF原来的数补到最低位

    • 如果RCR al,1,表示将al中的数循环右移一位,最低位移入CF标志位,并且CF原来的数补到最高位

      举例:
      RCL al,1  //al:10000001,CF:0循环左移一位最高位移入CF,CF原来的数补到最低位,即al:00000010 / CF:1
      RCR al,1  //al:10000001,CF:0循环右移一位最低位移入CF,CF原来的数补到最高位,即al:01000000 / CF:1
      

三、C语言中的移位运算

  • 与运算 &

    printf("%d",2&3);  //2(写成二进制,按位做即可)
    
  • 或运算 |

    printf("%d",2|3);  //3
    
  • 非运算 ~

    printf("%d",~2); //-3,因为%d打印的是有符号的整数
    
  • 异或运算 ^

    printf("%d",2^3);  //1
    
  • 移位运算 << >>

    • 左移运算,有符号和无符号是无区别的

      int a = 8;
      printf("%d",a<<1);  //16
      unsigned int b = 8;
      printf("%d",b<<1);  //16
      

      查看反汇编:生成的汇编指令都是shl,逻辑左移

      屏幕截图 2021-12-18 105543
    • 右移运算,有符号对应SAR即算数右移,无符号对应SHR即逻辑右移

      int a = 0xF0000000;
      printf("%d",a>>1);  //-134217728
      unsigned int b = 0xF0000000;
      printf("%d",b>>1);  //2013265920
      

      查看反汇编:有符号右移生成的指令为SAR,无符号右移生成的指令为SHR

      屏幕截图 2021-12-18 110345

四、作业

  • 定义一个unsiged char 类型,通过程序为第3、5、7位赋值,赋值时不能影响到其它位原来的值(使用位操作指令)

    #include "stdafx.h"
    #include "stdlib.h"
    void Func(unsigned char a){//假设第3,5,7位要赋的值1,0,1
        a = a | 0x44;  //0100 0100
        a = a & 0xef;  //1110 1111
        printf("%x",a); //0110 0100
    }
    int main(int argc,char* argv){
        unsigned char a = 0x34;  //0011 0000
        Func(a);
    	system("pause");
    	return 0;
    }
    
  • 判断某个位的值是否为1

    #include "stdafx.h"
    #include "stdlib.h"
    void Func(unsigned char a){//假设要判断第三位的值是否是1 
        if((a & 0x04) == 0){  //0000 0100   这里一定要大括号,因为位运算优先级很低
            printf("不是1");
        }else{
            printf("是1");
        }
    }
    int main(int argc,char* argv){
        unsigned char a = 0x34;  //0011 0100
        Func(a);
    	system("pause");
    	return 0;
    } 
    
  • 读取第7、6、5位的值,以十进制显示(unsigned)

    #include "stdafx.h"
    #include "stdlib.h"
    void Func(unsigned char a){
        a = a & 0x70;  //0111 0000
        a = a >> 4;
        printf("%d",a);
    }
    int main(int argc,char* argv){
        unsigned char a = 0x54;  //0101 0100
        Func(a);
    	system("pause");
    	return 0;
    } 
    
  • 用十六进制文本编辑器分别打开一个.exe、.dll、.sys、.txt、.doc、.jpg、.pdf等将前两个字节写在下面

    • .exe:内存中显式为4D 5A,我们读作0x5A4D
    • .dll:同样是4D 5A
    • .sys:4D 5A开头,但也有25 75
    • .txt:0A 66,读作0x660A
    • .doc:D0 CF,读作0xCFD0
    • .jpg:FF D8
    • .pdf:25 50,读作0x5025
  • 将一个在十六进制编辑器中打开的.exe文件,拖拽到最后,观察文件中的大小和硬盘上的大小

    屏幕截图 2021-12-18 130127

    可以发现用十六进制编辑器打开一个.exe文件,它的最大地址0x0829CDFF,换算成10进制等于136957439字节,我们发现该文件是从地址0x00000000开始算的,所以算大小还要加1字节,即136957439+1=136957440字节

    小提示:winhexoffset栏单击一下,可以在十进制和十六进制之间转换显示

H3C防火墙旁路部署实战:网关迁移到防火墙后,如何配置DHCP和VLAN间隔离策略? 本文详细介绍了H3C防火墙旁路部署实战,重点讲解网关迁移到防火墙后的DHCP配置和VLAN间隔离策略。通过实际案例和配置示例,帮助网络工程师解决传统核心交换机架构的性能瓶颈和安全管控问题,实现精细化访问控制。 阅读详情

相关推荐

点云处理工具——pclpy安装

pclpy介绍及详细安装过程 文章目录pclpy简介下载:安装测试 pclpy简介 pclpy是点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。 这个库正在积极开发中,api可能会发生变化。所包含的模块确实可以工作,但测试还不完整。目前只支持Windows和python 3.6 x64。 许多其他python库尝试绑定PCL。最流行的是python-pcl,它使用Cython。虽然Cython非常强大,但绑定c++模板并不是它的强项(PCL大量使用模.

图像处理、SLAM、PCL、OpenCV爱好者 1万+

汇编指令sar与shr

首先说下理论: 汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。 两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。 例如10000000算数右移(SAR)一位是11000000,而逻辑右移(SHR)一位是01000000...

xingke的专栏 2万+

如何在软件复位后保留指定RAM区域的数据

本文主要介绍S32K144的RAM retention功能

北极熊的脖子(16605192620@163.com) 1万+

【汇编】32位汇编常用的指令

1、普通指令mov:传送字或字节add:加法sub:减法inc:加1 dec:减1and:与运算,都为1才为1or:或运算,都为0才为0xor:异或运算,多用于加密解密,相同为0不同为1not:按位取反,单目运算符(只有一个操作数)SAL:算术左移、SHL:逻辑左移SAR:算术右移、SHR:逻辑右移2、JMP指令3、MOVS指令4、STOS指令5、PUSH、POP指令6、REP指令7、CALL与RETN指令。

Innocence_0的博客 5627

【大唐杯学习超快速入门】5G技术原理仿真教学——5G网络开通调测与车联网

自用笔记,比较乱。

qq_41224270的博客 1万+

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1965

汇编指令汇总

汇编语言的大部分指令功能,源操作数和目的操作数

xht2403267701的博客 1万+

STM32H743IIT6上LVGL移植实战:从零到触摸屏驱动的完整配置流程

本文详细记录了在STM32H743IIT6高性能MCU上,从零开始移植LVGL图形库到7寸RGB触摸屏的完整实战流程。内容涵盖工程搭建、显示与触摸驱动配置、LVGL核心优化及常见问题排查,重点讲解了如何利用STM32H743的硬件特性(如DMA2D、LTDC)提升GUI性能,为嵌入式GUI开发提供了一份详实的配置指南。

spark7igniter的博客 549

5.4 汇编语言:算数运算指令集

算术运算指令集是计算机中的一组基本操作,用于对数字执行常见的算术运算操作。这些指令都是计算机中非常基础的运算指令,可以用于实现所有常见的算术运算操作,并可以通过组合使用实现更加复杂的数学运算。在实际编程中,程序员可以根据具体需求选择合适的运算指令,实现程序中的算术运算操作。

微软技术分享 1万+

cesium 综合教程200+【目录】(已包含186篇文章)

cesium示例教程100+旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。目录中有链接的为已有文章,没链接的为目标文章,不断更新中…

大剑师兰特的GIS世界 8893

潜望式长焦模组全解析:结构构造、光路设计与工程实战挑战

随着移动影像能力的不断进化,潜望式长焦模组成为旗舰手机实现 5x 甚至 10x 光学变焦的关键配置。相比传统横向堆叠镜组,潜望式结构通过反射棱镜实现纵向空间上的光路折叠,有效解决了模组厚度与变焦行程的矛盾问题。然而,高倍变焦模组不仅面临复杂的光学路径设计,还涉及反射损耗控制、防抖马达配合、模组热应力管控与 ISP 畸变校正等一系列工程难点。本文将结合主流机型的实战经验,深入解析潜望式长焦模组的结构构造与调试路径,为影像系统工程师提供完整的实战参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3138

SHR和SAR移位指令

1、SHR(shift logical right):逻辑右移指令 、SAR(shift arithmetic right):算数右移指令

gentlebreeze_ws的博客 7199

YOLO26涨点改进 | 细节涨点篇 | 源自SCI一区 | YOLO26引入HWD小波下采样模块,而不会显著增加计算开销,(适合小目标分割任务、小目标检测任务)

本文提出了一种基于Haar小波变换的下采样模块HWD,用于改进YOLO26目标检测性能。HWD模块通过小波变换降低特征图分辨率,同时将空间信息编码到通道维度,有效保留了关键信息。相比传统下采样方法,HWD能显著减少信息不确定性,提升小目标检测精度。实验表明,该模块可无缝集成到CNN架构中,不增加计算开销。文章详细介绍了HWD的实现原理、代码结构以及在YOLO26中的集成方法,并提供了两种改进版yaml配置文件。该创新模块已在多种数据集上验证有效,特别适合语义分割和目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 401

【计算机组成原理】汇编语言指令

INC:将指定的操作数的内容加1,再将结果送回到该操作数。 例子: MOV AX,BX NOT AX ADD AX,BX INC AX (AX)=0000H, CF=0 ax是bx的非,因此按位相加时ax加上bx必定等于1。(当ax某位=1,则bx某位=0;当ax某位=0,则bx某位=1,相加永远是1) 全1就是F。 然后inc, 自增1, ax溢出, 值为0。 没有进位, cf=0。 ...

weixin_43508546的博客 1782

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汇编移位: 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万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

8086算术移位指令SAL和SAR

SAL算术左移指令同逻辑左移指令进行相同动作,机器指令一样,只是为了方便记忆而提供的两个助记符 SAR算术右移指令 SAR OPRD,M ;该指令使操作数右移M位,每移动1位左边的符号保持不变,移出的最低位进入CF mov al,26H ;00100110B 右移1位 = 00010011B sar al,1   ;26H/2H=13H mov ax,0F0H  mov cl,4 ;11

Relaxpeng 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汇编位移

shl 左移位 shr右移位 shl 是按位左移,右边补零shr 是按位右移,左边补零 左移一位等于乘2,右移一位等于除2。 左移2位等于乘2的2次方,右移一位等于除2的2次方。 左移n位等于乘2的n次方,右移n位等于除2的n次方。 例如: 二进制一共8位 0000 1100 – 10进制12 左移一位 0001 1000 – 10进制24 右移一位 0000 0110 – 10进制6 二进制数左移n位后面加n个0, 十进制数左移n位乘以2的n次方 二进制数右移n位,从右边开始去掉n位 例如1100右

hutao1101175783的专栏 1095

汇编指令(四)移位指令

学习概要 格式 移位指令主要分四种 一、逻辑移位指令 1.逻辑左移指令SHL 2.逻辑右移指令SHR 3.逻辑移位指令的功能 二、算术移位指令 1.算术左移指令SAL 2.算术右移指令SAR 最高位不变的意思就是,最高位原来是1(0),右移过后最高位就补1(0)。 3.算术移位指令的功能 三、循环移位指令 1.循环左移指令ROL 2.循环右移指令ROR 四、带进位的循环移位指令 1.带进位的循环左移指令RCL 2.带进位的循环右移指令 移位指令对标志位的影响 1

weirdo_cy的博客 2万+

汇编指令之移位指令

    移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。    格式为:xxx oper1,CL/1         ;移位次数只能是1或者存放在CL里面。一、算术移位指令1、算术左移指令SAL功能:左移一次,最低位补0,最高位送入CF标志位,如图:意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。2、算术右移指令SAR功能:右移一次,最高位保持不变,最低位送入...

Ninen_Choi的博客 2万+

【汇编】逻辑指令

TEST 指令与AND运算的工作原理相同,但与AND指令不同的是,它不会更改第一个操作数。因此,如果我们需要检查寄存器中的数字是偶数还是奇数,我们也可以使用TEST指令执行此操作,而无需更改原始数字(的不同数值执行的操作 (以 SHL 为例)不影响 SF、ZF、PF(奇偶)、AF。可用除立即数以外的任何寻址方式。

m0_74209563的博客 2116

SAR指令详解

【代码】SAR指令详解。

weixin_43588305的博客 219

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

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

deniece1的博客 4万+

汇编语言---移位指令

移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位; 移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在其后的CPU中,该立即数可以是定义域[1,31]之内的数; 一、算数移位指令: 算数移位指令分为:算数左移SAL(Shift Algebraic Left)和算数右移S

fivedoumi的专栏 2万+

乘法、除法汇编指令总结

乘法指令的反汇编 a*5:imul eax,dword ptr [a],5 ==>(当变量与不是2的平方的数相乘时,三变量) a*b :mov  eax,dword  ptr [a]      imul  eax,dword  ptr [b] ==>(当两个都是变量相乘时,两变量) a*8 :mov  eax,dword ptr [a] ==>(当变量与2的平方相乘时(2^3=8))

k0bin的博客 5943

汇编:shl, shr 逻辑移动指令

shl al, 1 往左边移动1位  bit位 1。将1个寄存器或者内存单元中的数据向左移位(bit位) 2。将移除的这一位,放到CF中 3。最低位用0补充     shl al, 1 shl al, 1 shl al, 1 shl al, 1 相当于下面语句 mov cl,4 shl al, cl    ...

m0_37564426的博客 1859

汇编_指令_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
上一篇: 滴水三期:day24.2-函数指针
下一篇: 滴水三期:day26.1-宏定义,头文件,malloc
EdimadeZhou
博客等级 码龄5年 241粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值