Chinaunix首页 | 论坛 | 博客
  • 博客访问: 995015
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 216
  • 用 户 组: 普通用户
  • 注册时间: 2018-11-27 17:55
文章分类
文章存档

2019年(21)

我的朋友

分类: C/C++

2019-06-29 07:55:41

C 代码

点击(此处)折叠或打开

  1. unsigned int move(unsigned int i)
  2. {
  3.     return i << 1;
  4. }

arm-linux-gcc move.c -O2 -S


点击(此处)折叠或打开

  1. move:
  2.     @ Function supports interworking.
  3.     @ args = 0, pretend = 0, frame = 0
  4.     @ frame_needed = 0, uses_anonymous_args = 0
  5.     @ link register save eliminated.
  6.     mov    r0, r0, asl #1   @第一个入参左移一位,存入r0(返回值)
  7.     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 << 2

逻辑右移

(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。 
阅读(6870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~