ARM 汇编指令:ROR(循环右移)

ARM 汇编指令:ROR(循环右移)

本文来自于我关于 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(循环右移)

ROR 是 ARM 汇编中的 循环右移(Rotate Right) 指令。它执行按位右移操作,并将从右侧移出的位重新插入到左侧(高位)。

基本语法

复制代码
ROR{S}{cond} Rd, Rm, #imm
ROR{S}{cond} Rd, Rm, Rs

工作方式

对于 32 位寄存器:

  • 将操作数向右移动指定的位数
  • 从右侧移出的位(低位)重新插入到左侧(高位)
  • 形成循环移位

示例

复制代码
MOV R0, #0x0000000F    ; R0 = 0000 0000 0000 0000 0000 0000 0000 1111
ROR R1, R0, #4         ; R1 = 1111 0000 0000 0000 0000 0000 0000 0001
                       ; 右移4位,移出的"1111"补到左边

两种形式

1. 立即数移位

复制代码
ROR R1, R0, #8     ; 将 R0 循环右移 8 位,结果存入 R1
  • 移位位数:1-31(0 相当于 ROR #32)

2. 寄存器移位

复制代码
ROR R1, R0, R2     ; 将 R0 循环右移 R2 中指定的位数
  • R2 的低 8 位指定移位位数(0-255)

特殊标志位影响(使用 S 后缀时)

复制代码
RORS R1, R0, #4    ; 循环右移并更新标志位
  • C 标志(Carry):设置为最后移出的位(原始的最低位)
  • N 标志(Negative):设置结果最高位的值
  • Z 标志(Zero):结果为 0 时设置

常见用途

1. 位操作

assembly 复制代码
; 交换字节顺序的另一种方法
MOV R0, #0x12345678
ROR R0, R0, #16     ; R0 = 0x56781234

2. 加密算法

assembly 复制代码
; 在轮函数中使用(如某些哈希函数)
EOR R0, R0, R1
ROR R0, R0, #7

3. 数据重组

assembly 复制代码
; 重新排列位模式
MOV R0, #0b10110011
ROR R0, R0, #3      ; 得到 0b01110110

与相关指令对比

指令 名称 操作 示例
ROR 循环右移 右移,移出的位补到左边 0b1001 ROR 2 = 0b0110
RRX 带扩展循环右移 右移1位,C标志移入最高位 R1, R0, RRX
ASR 算术右移 右移,符号位填充 0b1001 ASR 2 = 0b1110
LSR 逻辑右移 右移,0填充 0b1001 LSR 2 = 0b0010
LSL 逻辑左移 左移,0填充 0b1001 LSL 2 = 0b0100

注意事项

  1. 当移位位数为 0 时,实际上执行 ROR #32
  2. 循环移位常用于实现某些算法的轮函数
  3. 在 ARMv6T2 及以上架构中,移位位数可以是任何立即数
  4. ROR 常用于位域提取或循环缓冲区实现

ROR 指令在密码学算法、哈希函数、数据编码/解码和位操作中特别有用,因为它能保持所有位的信息(不丢失任何位)。

相关推荐
Horn Still Sounds15 分钟前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
AC赳赳老秦4 小时前
数据采集全链路审计留痕:用 OpenClaw 实现合规审计与追溯
开发语言·汇编·python·php·swift·deepseek·openclaw
女神下凡4 小时前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
AOI小白新手上路7 小时前
韦东山 3-5 I.MX6ULL 的 LED 编程 · 学习笔记
arm开发·笔记·单片机·学习·架构·硬件架构
M78佐菲7 小时前
ARM学习笔记(9)
linux·arm开发·笔记·嵌入式硬件·学习
女神下凡1 天前
芯参谋(29):UFS UMCP 软件设计规范
arm开发·单片机·嵌入式硬件
Horn Still Sounds1 天前
IMX6ULL裸机|SPI、LCD、PWM脉冲调制、电容触控屏学习笔记
arm开发·笔记·嵌入式硬件·嵌入式裸机
SKH.1 天前
ARM-pwm脉冲宽度调制、ADC模数转换
arm开发
an12321212 天前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
CodeFragment2 天前
裸机开发速记:启动流程|GIC 中断|时钟系统|UART 通信
arm开发·单片机·嵌入式硬件