arm64的mov指令,简单而不简单

本文通过实例探讨了arm64中mov指令的复杂性,指出mov指令不仅能搬移16位立即数,还可以处理特定形式的大于16位的立即数。当尝试搬移非16位立即数左移后的值时,编译器可能会报错。通过对汇编代码的反汇编分析,揭示了mov指令实际上可能等同于movz或orr指令。文章总结了mov指令的使用场景,并提出使用ldr伪指令解决搬移大立即数的问题。
摘要由CSDN通过智能技术生成

小明同学正在学习笨叔的《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:326: Error: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值