MENU

关于arm 指令32位立即数用12位表示的方法

June 18, 2021 • 阅读: 2981 • 笔记&折腾

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

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

Leave a Comment

3 Comments
  1. 4h2 4h2

    选快递代发,礼品代发选空包网 选空包代发上爱查快递www.aickd.com

  2. 123 123

    你好

  3. e3d e3d

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