關於ARM立即數的理解

2021-09-06 14:35:59 字數 727 閱讀 2644

**:

一、立即數指令碼的組成

arm公司將32bit指令碼分為如下兩部分:

32bit立即數通過imm8值迴圈右移ror值*2bit得到。即:shifter_operand = immed_8 rotate_right (rotate_imm * 2)。

二、如何判斷乙個數是否是合法立即數?

首先將這個數轉換為32bit16進製制形式,例如218=0xda=0x000000da

除零外,僅有一位數為合法立即數。

除零外,僅有二位數,並且相鄰(包括首尾相鄰,如0x1000000a)的為合法立即數。

除零外,僅有三位數,並且相鄰(包括中間有0相間,例如0x10800000,包括首尾相鄰,如:0x14000003),這三位數中,最高位取值僅能為1、2、3,最低位取值僅能為4、8、c,中間位0x0~0xf。這種組合的為合法立即數。

除了以上三種,其他基本是非法立即數。

三、非法立即數如何輸入?

利用ldr偽指令可將任意32bit的立即數賦給暫存器。

格式:ldr rd,=#imm32

編譯時,編譯器會優先使用mov或者mvn指令來載入立即數,以便提高**執行效率,如不行,則一般編譯成如下形式:

ldr rd,[pc,#offset]

pc+offset:.word imm32

ARM立即數問題

最近學習彙編,遇到乙個問題,我把截圖貼在下面 上面可以看出,相信應該有人感到鬱悶吧,為啥oxffffffff可以識別,而ox1ff卻不行,網上查了好多資料,所以總結一下,immed 8迴圈右移 2 rotate imm immediate 立即數 immed 8 8位的常數 rotate imm 4...

關於立即數

在彙編時,我們常會用到立即數。但是立即數是有條件限定的 當乙個數小於255不用判斷,它是立即數。當大於255時 把資料轉換成二進位制形式,從低位到高位寫成4位 1組的形式。if count of 1 8 isnotimmediate else 解決老是需要判斷的方案 我們在arm彙編中如何規避立即數...

ARM立即數,LDR和MOV的區別

mov 是把立即數賦給乙個暫存器,但對立即數的範圍有要求。只能是由8bit連續有效位通過偶數次移位能得到的數。如果立即數超出這個範圍,就沒辦法用一條mov指令給暫存器賦值。ldr除了普通的讀數之外,也有給暫存器賦立即數的功能。你只要寫 ldr r0,0xabcdef 它沒有立即數範圍的限制。因為這是...