小明同学正在学习笨叔的《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