[四十九C-137]

笔记&折腾

今天在分析汇编文件时发现了一个很有趣的问题。

在源程序中有一个 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位得到。

本文采用 BY-NC-SA 协议进行授权,在不违法此协议的前提下,您可以自由转载或改动。

本文链接:关于arm 指令32位立即数用12位表示的方法

仅有一条评论

    e3d e3d

    快递代发, 快递代发,免费提供底单www.uudanhaowang.com

    2021-09-25 11:34 回复

Power By Typecho | Theme FC by Jstar