news 2026/7/1 22:51:42

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS
7、ARM 汇编指令:BEQ
8、ARM 汇编指令:TST
9、ARM 汇编指令:B
10、ARM 汇编指令:BX
11、ARM 汇编指令:ERET
12、ARM 汇编指令:STP\LDP
13、ARM 汇编指令:UBFX
14、ARM 汇编指令:STM
15、ARM 汇编指令:LDM
16、ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)
17、ARM 汇编指令:ROR(循环右移)

LSLLSR是 ARM 汇编中两个最基础且重要的移位指令。

核心概念:移位操作

在了解具体指令前,首先要明白移位是什么。想象一个二进制数,比如8的 8 位二进制表示是00001000

  • 左移就是将所有位向左移动,空出的低位补 0。00001000左移 1 位变成00010000(即 16)。左移一位通常相当于乘以 2
  • 逻辑右移就是将所有位向右移动,空出的高位补 0。00001000右移 1 位变成00000100(即 4)。逻辑右移一位通常相当于除以 2(向零取整)

在 ARM 中,移位操作不仅可以单独使用,还能与大多数数据处理指令(如ADD,MOV,CMP等)免费结合,这是 ARM 指令集一个非常强大和灵活的特性。但我们先看作为独立指令的LSLLSR


1. LSL - 逻辑左移

功能:将寄存器中的二进制位向左移动指定的位数,右侧空出的低位用 0 填充。
本质:相当于无符号乘法(乘以 2^n)。

语法

LSL{S} <Rd>, <Rm>, <Rs> ; 用寄存器 Rs 的值指定移位位数 LSL{S} <Rd>, <Rm>, #<imm5> ; 用立即数 imm5 (0-31) 指定移位位数
  • {S}:可选的条件标志更新后缀。如果加上S,则根据移位结果更新CPSR中的N(负标志)和Z(零标志)。移位操作也会影响C(进位标志)。
  • <Rd>:目标寄存器。
  • <Rm>:源操作数寄存器。
  • <Rs>:存放移位位数的寄存器(通常只使用低 8 位)。
  • #<imm5>:5 位立即数移位量(0-31)。

工作原理

Before: Rm = [b31 b30 ... b1 b0] After: Rd = [b31-n ... b0 0 ... 0] <-- n 个 0 填入低位 \___________/ 向左移动 n 位

最后移出的那一位(原b31-n+1位)会进入CPSRC(进位)标志。

示例

MOV R1, #5 ; R1 = 5 (二进制 00000101) LSL R0, R1, #2 ; R0 = R1 << 2 ; 计算过程: 00000101 << 2 = 00010100 ; 结果: R0 = 20 (5 * 4)
MOVS R2, #0x80000001 ; R2 = 0x80000001,设置标志 LSLS R3, R2, #1 ; R3 = R2 << 1,并更新标志 ; 计算过程: 1000...0001 << 1 = 0000...0010 ; 结果: R3 = 0x00000002 ; 标志变化:最后移出的 '1' 进入 C 标志,所以 C = 1。结果非零,所以 Z = 0。

2. LSR - 逻辑右移

功能:将寄存器中的二进制位向右移动指定的位数,左侧空出的高位用 0 填充。
本质:相当于无符号除法(除以 2^n)。

语法

LSR{S} <Rd>, <Rm>, <Rs> ; 用寄存器 Rs 的值指定移位位数 LSR{S} <Rd>, <Rm>, #<imm5> ; 用立即数 imm5 (1-32) 指定移位位数

注意:立即数移位范围是1-32。当#imm5为 32 时,结果为 0,且最后移出的位进入C标志。

工作原理

Before: Rm = [b31 b30 ... b1 b0] After: Rd = [0 ... 0 b31 ... bn] <-- n 个 0 填入高位 \___________/ 向右移动 n 位

最后移出的那一位(原bn-1位)会进入CPSRC(进位)标志。

示例

MOV R1, #20 ; R1 = 20 (二进制 00010100) LSR R0, R1, #2 ; R0 = R1 >> 2 ; 计算过程: 00010100 >> 2 = 00000101 ; 结果: R0 = 5 (20 / 4)
MOV R2, #0x80000001 ; R2 = 0x80000001 LSRS R3, R2, #1 ; R3 = R2 >> 1,并更新标志 ; 计算过程: 1000...0001 >> 1 = 0100...0000 ; 结果: R3 = 0x40000000 ; 标志变化:最后移出的 '1' 进入 C 标志,所以 C = 1。结果非负非零,所以 N=0, Z=0。

关键点与进阶用法

  1. 移位量为 0:对于LSL #0,操作数不变,但可能影响C标志(C标志会被设置为ALU的进位输出,在移位量为0的特定情况下,其行为有详细规定,通常编程时可忽略此边界情况)。对于LSR #0,在 ARM 中实际表示LSR #32,这是一个特例。

  2. 桶形移位器:ARM 处理器有一个称为“桶形移位器”的硬件单元,这使得移位操作可以在一个时钟周期内完成,并且可以与其他指令结合而无额外开销。这是 ARM 指令集高效的关键之一。

  3. 与其他指令结合(灵活的第二操作数)
    这是 ARM 汇编最常用的特性之一。几乎所有的数据处理指令(ADD,SUB,MOV,CMP,AND,ORR等)的第二个操作数都可以先进行移位,然后再参与运算。

    ADD R0, R1, R2, LSL #2 ; R0 = R1 + (R2 * 4) CMP R3, R4, LSR #3 ; 比较 R3 和 (R4 / 8) MOV R5, R6, ROR #4 ; R5 = 将 R6 循环右移 4 位后的值 (ROR是另一种移位)

    这种结合极大地增强了指令的表达能力,一条指令完成了“移位+运算”。

  4. 与算术右移 ASR 的区别

    • LSR是逻辑右移,高位补0。用于处理无符号数
    • ASR(算术右移)高位用原最高位(符号位)填充。用于保持有符号数的符号,相当于有符号除法。

总结

指令全称方向填充值主要数学意义典型用途
LSLLogical Shift Left向左低位补 0乘以 2^n快速乘法、位组装、掩码生成
LSRLogical Shift Right向右高位补 0无符号除以 2^n快速无符号除法、位提取、无符号数处理

掌握LSLLSR是理解 ARM 高效编程和位操作的基础。务必通过实践来熟悉它们的行为,尤其是与条件标志和与其他指令结合使用的方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 20:23:48

提升团队效能的5个必备IDEA插件开发案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个面向微服务架构的IDEA插件&#xff0c;功能包括&#xff1a;1) 可视化展示服务依赖关系图 2) 一键跳转到接口定义 3) 模拟服务调用。要求使用Java语言&#xff0c;集成Spr…

作者头像 李华
网站建设 2026/6/29 4:34:33

传统PING检测 vs 现代化工具效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个PING检测效率对比工具&#xff0c;左侧模拟传统命令行PING操作流程&#xff0c;右侧展示现代化批量检测界面。自动统计并对比两种方式的&#xff1a;1) 完成时间 2) 准确率…

作者头像 李华
网站建设 2026/7/1 17:43:19

零基础学做十二生肖买马网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个适合新手学习的简化版十二生肖买马网站&#xff0c;要求&#xff1a;1. 使用最基础的HTML/CSS/JavaScript 2. 包含简单的生肖展示和选择功能 3. 模拟开奖动画效果 4. 提供…

作者头像 李华
网站建设 2026/6/25 6:57:20

智能客服预演测试:模拟多角色沟通场景

智能客服预演测试&#xff1a;模拟多角色沟通场景 在智能客服系统日益复杂的今天&#xff0c;企业面临一个共性难题&#xff1a;如何在不依赖真人演员的情况下&#xff0c;真实还原一场长达数十分钟、涉及多个角色的客户沟通过程&#xff1f;传统的文本朗读工具早已无法满足需求…

作者头像 李华
网站建设 2026/6/22 7:23:32

1小时上线:CORS解决方案原型开发实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个可立即部署的CORS解决方案原型&#xff0c;要求&#xff1a;1. 包含前端demo页面和后端API服务 2. 预设触发CORS错误的场景 3. 集成三种解决方案切换功能 4. 自带Postman测…

作者头像 李华
网站建设 2026/6/28 19:25:29

如何用Miniconda优化AI开发环境配置

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python脚本&#xff0c;使用Miniconda配置一个独立的AI开发环境&#xff0c;包含TensorFlow 2.0和PyTorch 1.8&#xff0c;并自动安装常用数据科学库如numpy、pandas和mat…

作者头像 李华