C 代码点击(此处)折叠或打开unsigned int move(unsigned int i){ return i 1;}arm-linux-gcc move.c -O2 -S点击(此处)折叠或打开move: @ Function supports interworking. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. mov r0, r0, asl #1 @第一个入参左移一位,存入r0(返回值) bx lr 直接返回移位操作在 ARM 指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。逻辑或算术左移(Logical or Arithmetic Shift Left) Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn接受 Rx 的内容并按用‘n’或在寄存器 Rn 中指定的数量向高有效位方向移位。最低有效位用零来填充。除了概念上的第 33位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。考虑下列: MOV R1, #12 MOV R0, R1, LSL#2在退出时,R0 是 48。 这些指令形成的总和是 R0 = #12,LSL#2 等同于 BASIC 的 R0 = 12逻辑右移(Logical Shift Right) Rx, LSR #n or Rx, LSR Rn它在概念上与左移相对。把所有位向更低有效位方向移动。如果逻辑类指令中 S位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的 register = value >>>shift。 算术右移(Arithmetic Shift Right) Rx, ASR #n or Rx, ASR Rn类似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值来填充高位,用来保护补码表示中的符号。如果逻辑类指令中 S位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的 register = value >>shift。 09-04 23:04