大家好,又见面了,我是你们的朋友全栈君。
arm指令移位指令
LSL 逻辑左移 ASL 算术左移 LSR 逻辑右移 ASR 算术右移 ROR 循环右移 RRX 带扩展的循环右移ASL
和LSL
是等同的,可以自由互换。
你可以用一个立即值(从 0 到 31)指定移位数量,或用包含在 0 和 31 之间的一个值的寄存器指定移位数量。
逻辑或算术左移(LSL)
MOV R1, #12
MOV R0, R1, LSL#2
R0 是 48。 这些指令形成的总和是R0 = #12, LSL#2
等同于 BASIC 的 R0 = 12 << 2
– – – – – – – – – – – – – – — – – – – — – 参考:
逻辑或算术左移
(Logical or ArithmeticShift Left)
代码语言:javascript复制 Rx, LSL #n or
Rx, ASL #n or
Rx, LSL Rn or
Rx, ASL Rn
接受 Rx 的内容并按用‘n’或在寄存器 Rn 中指定的数量向高有效位方向移位。最低有效位用零来填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
考虑下列:
代码语言:javascript复制 MOV R1, #12
MOV R0, R1, LSL#2
在退出时,R0 是 48。 这些指令形成的总和是 R0 = #12, LSL#2
等同于 BASIC 的R0 = 12 << 2
逻辑右移
(Logical ShiftRight)
代码语言:javascript复制 Rx, LSR #n or
Rx, LSR Rn
它在概念上与左移相对。把所有位向更低有效位方向移动。如果逻辑类指令中 S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的register = value >>> shift
。
算术右移
(Arithmetic ShiftRight)
代码语言:javascript复制 Rx, ASR #n or
Rx, ASR Rn
类似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值来填充高位,用来保护补码表示中的符号。如果逻辑类指令中 S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的register = value >> shift
。
循环右移
(Rotate Right)
代码语言:javascript复制 Rx, ROR #n or
Rx, ROR Rn
循环右移类似于逻辑右移,但是把从右侧移出去的位放置到左侧,如果逻辑类指令中 S 位被设置了,则同时放置到进位标志中,这就是位的‘循环’。一个移位量为 32 的操作将导致输出与输入完全一致,因为所有位都被移位了 32 个位置,又回到了开始时的位置!
带扩展的循环右移
(Rotate Right with extend)
代码语言:javascript复制 Rx, RRX
这是一个 ROR#0 操作,它向右移动一个位置 – 不同之处是,它使用处理器的进位标志来提供一个要被移位的 33 位的数量。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137693.html原文链接:https://javaforall.cn