两条mov指令,为啥一条可以,另外一条不行呢?
奔跑吧Linux社区 2023-06-07

小明同学正在学习笨叔的《arm64体系结构与编程》,发现简单的mov指令还真不简单。下面两条mov指令,为啥一条可以,另外一条不行呢?

下面这条指令,可以编译通过。

mov x0, 0xffff0000ffff 

而这条指令,只是前面少了一个f,为啥就编译不过呢?

mov x0, 0xfff0000ffff 

编译出错:

aarch64-linux-gnu-gcc -g -Iinclude  -MMD -c src/asm_test.S -o build/asm_test_s.o
src/asm_test.S: Assembler messages:
src/asm_test.S:326Error: immediate cannot be moved by a single instruction

小明同学百思不骑姐?

其实mov指令是arm64指令集最简单也是不简单的指令,简单的原因是它可以用来搬移16位的立即数,这是它最原始的设计。但是呢,它也可以搬移超过16位的立即数,只不过,这个操作16位的立即数必须是16位立即数左移0,16,32,48位而成。例如,下面这条指令。

mov,x0, 0x12340000 

这条指令是可以编译的,因为他是16位立即数0x1234,左移了16位。

我们可以通过aarch64-linux-gnu-objdump命令来反汇编来查看上面的mov指令究竟是做了那些事情?

aarch64-linux-gnu-objdump -s -d -M no-aliases build/asm_test_s.o

下面是反汇编的代码。

000000000000020c <my_test1>:
 20c:    d2a24680    movz    x0, #0x1234, lsl #16  210:    d65f03c0    ret

我们可以看到上面的mov指令等同于一条movz指令,而且是把0x1234这个立即数,左移了16位,得到了0x12340000.
如果我们把上面的mov指令,去掉一个0.

mov,x0, 0x1234000 

你会发现编译不过了,编译器告诉你“immediate cannot be moved by a single instruction”。
我们可以看一下armv8.6手册的第C6.2.187章里描述了mov指令,它内部使用movz指令来实现的。


MOV <Xd>, #<imm>
等同于:
MOVZ <Xd>, #<imm16>, LSL #<shift>

好,我们来反汇编小明同学遇到的问题。下面是反汇编的结果。

000000000000020c <my_test1>:
 20c:    b2003fe0    orr x0, xzr, #0xffff0000ffff  210:    d65f03c0    ret

从反汇编结果,我们可以知道上述的mov指令等同于一条orr指令。
我们再来看armv8.6手册的第C6.2.188章,讲了mov指令用于bitmask立即数的情况。


MOV <Wd|WSP>, #<imm>
等同于:
ORR <Wd|WSP>, WZR, #<imm>

所以,我们可以看到,arm64指令集里的最简单的mov指令,是不是不简单呢?您会用mov指令了吗?笨叔总结一下mov指令的几个使用场景。

  1. 搬移16位立即数。

  2. 搬移16位立即数左移16,32,48位后形成的立即数。

  3. 可以搬移bitmask的立即数到寄存器里。

可能你会问了,如果我的汇编代码里想搬移一个大于16位的立即数,咋办呢?
其实,我们可以使用ldr伪指令。

ldr x0,=0x123456789 



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 硬件
  • 原理图
  • 信号完整性
  • EMI
  • 应用BK5822设计ETC OBU

      中国的公路不停车收费(ETC)系统应用市场越来越大,为了促进ETC应用的快速发展和成熟,国家相关部门开展了高速公路联网不停车收费的试点工程,比如,京津翼地区和长三角地区,所以对车载单元(OBU)的需求量也随之大幅增加。  目前市场上应用的OBU多数是通过分立元器件设计实现的,存在一致性、稳定性和可靠性的问题。博通(BEKEN)集成电路于2010年年初推出用于ETC系统的射频收发器">射频...

    09-28
  • 一种单芯片GPS接收机的硬件设计

    引言   GPS(全球定位系统)发展到今天,其用途越来越广泛,而技术的进步和用户需求也不断推动GPS系统的增强。目前美国正在致力于GPSBlockII系统的现代化和“GPS - III”计划,旨在全面改善GPS的生命力、精度、可用性、完好性、灵活性和安全性。  GPS用户端设备也处于不断升级和发展之中。从接收机的结构来看,随着VLSI(超大规模集成电路)和DSP技术的发展,单通道序贯式、时分多路复...

    09-28
  • 半刚性电缆是指什么

    半刚性电缆组件的最基本形式为由金属管构成的同轴传输线。其中,所述金属管一般为形成外导体的铜管,沿该铜管的中心线设有金属丝导体。所述中心金属丝导体由介电材料支撑...

    09-27
  • 比Wi-Fi快100倍的网络 真的靠谱吗?

    Wi-Fi 对移动计算的使用产生了巨大的影响,使员工可以在任何地方访问公司网络,咖啡店也能成为独立工作人员的办公地点。但Wi-Fi 也有其缺点,所以诞生了一个新的标准:Li-Fi,如果它可以顺利上市,

    09-26
  • 产品设计共用一款PCB一套软件,如何区分判断?

    在实际的工程项目中,有时候会碰到两款差异不大的产品,设计的时候共用一款PCB,软件也共用一套软件。这个时候,我们可以开辟一个IO口,用于侦测实际应用的是哪款产品

    09-25
  • 探究CDMA网络在MBB时代的发展趋势和应对策略,推动移动通信技术创新

    面对日新月异的移动终端和爆炸式增长的移动应用,移动互联网流量未来10年将迎来数百倍的增长。MBB洪流已然来袭,然而,它们主要来自哪里?

    09-25
  • 数字功放与模拟功放的优缺点对比:深入分析两种功放技术的特点与应用,助您选择适合的音频放大方案

     “数字功放”的基本电路是早已存在的D类放大器(国内称丁类放大器)。以前,由于价格和技术上的原因,这种放大电路只是在实验室或高价位的测试仪器中应用。这几年的技术发展使数字功放的元件集成到一两块芯片中,

    09-25
  • 基于触控屏的无线通信噪声干扰验证研究

    本文所探讨的内容虽然仅是噪声验证的其中一个例子,但我们已可以见微知着的了解到,无线通讯讯号技术的博大精深,以及干扰掌控的技术深度。所有相关厂商业者在开发时,均需透过更深入的研究、更多的技术资源与精力投

    09-25
  • 深入探讨两种常见的比例放大电路设计方案,实现精确信号放大功能

    运算放大器,它有两个输入引脚和一个输出引脚。其中两个输入引脚,一个是正相输入,一个是负相输入。正是因为运算放

    09-25
  • 优化光缆路由:降低光网络时延的关键因素分析与解决方案研究

    中国电信日前发布了《低时延光网络白皮书》,指出了四大需求低时延的业务。第一是金融和电子交易类用户;第二是基于TCP协议的高清视频类业务,包括4K/8K、视频会议、VR等实时性要求极高的大带宽业务;第三

    09-25
  • 浅析915MHz发射/接收模块电路设计

    设计为868MHz和902至928MHz 的AMR解决方案,RFMD的RF6549功能独立的Rx和Tx路径,两个连接多样性的解决方案或一个测试端口的输出端口的端口。PA的部分包括一个标称输出功率为28

    09-25
下载排行榜
更多
评测报告
更多
广告