今天在分析汇编文件时发现了一个很有趣的问题。
在源程序中有一个 x=-x 计算,ARMGCC 和 RISCV-GCC 给出了两种不同的解决方案。
ARMGCC 汇编:
add r6,r0,#-2147483648
RISCV-GCC 汇编:
li s1,-2147483648
xor s1,s1,a0
而根据ARM指令集的介绍,arm 指令中立即数范围应该只有12位,但是为什么在这里却可以使用 32 的立即数 -2147483648 ?
翻阅资料得知,ARM 指令可以将一些 32 位的立即数用 12 位表示。
ARM 指令将原来的立即数 12 位 4-8 分,分成两份。右边8位依然表示立即数 imme,左边4位表示循环右移偶数位数 rotate。即,可以将 8 位的立即数循环右移 rotate * 2 位 从而将原来只能表示 12 位立即数的范围扩展到 32 位。但是,由于只能循环右移偶数位,所以只能表示一些特定的 32 位数。比如本案例中的立即数 #-2147483648(1000 0000 0000 0000 0000 0000 0000 0000) 可以用 128(0000 0000 0000 0000 0000 0000 1000 0000) 循环右移8位得到。
选快递代发,礼品代发选空包网 选空包代发上爱查快递www.aickd.com
你好
快递代发, 快递代发,免费提供底单www.uudanhaowang.com