我現在正在學習匯編語言,但對直接值的編碼方式有些困惑。有人可以解釋為什么以下值有效:0xff00ff00、0xffffffff、0x007f8000?另外為什么值 0xff0000ff, 0x007f9000 無效?
根據我的理解,12 位立即數被分成 4 個高位旋轉和 8 個低位常量。所以我認為我上面列出的所有值都是無效的,因為它需要超過 12 位。
關于這個主題的一些澄清會很有幫助,謝謝!
uj5u.com熱心網友回復:
(此答案適用于 ARM32 模式,而不是 Thumb2 或 AArch64。那里的情況有所不同,允許的立即數取決于指令。)
您一定是在談論 12 位編碼。它實際上是 4 8 位編碼。位置為 4,模式為 8,因此旋轉計數必須是偶數。
- 0 到 255 之間的任何值都是有效的。位置 0 處的 0x00 ~ 0xff 模式
- 256 和 N 的任意兩個冪都有效。因為它們都是 1bit 模式。
- 257 無效,因為 0x101 需要 9 位模式
- 258 無效,因為即使模式適合 8 位,它的位置也是奇數。(129<<1)
- 260 有效 (65<<2)
并且有諸如, 等指令mvn,cmn如果您的指令是mov或cmp,則很難判斷一個數字是否作為立即數有效,或者另一個具有在使用之前對立即數執行某些操作的版本的指令。
PS:2^4 = 16,暫存器為32bit。這就是為什么位置必須是均勻的。
uj5u.com熱心網友回復:
.thumb
ldr r0,=0xFF00FF00
0: f04f 20ff mov.w r0, #4278255360 ; 0xff00ff00
.thumb
.cpu cortex-m0
ldr r0,=0xFF00FF00
00000000 <.text>:
0: 4800 ldr r0, [pc, #0] ; (4 <.text 0x4>)
2: 0000 .short 0x0000
4: ff00ff00 .word 0xff00ff00
查看 ARM 檔案,它清楚地記錄了直接編碼的作業方式。而且基本上是你不能做的。各種 thumb2 擴展添加了更多功能,如上所示(armv6-m 與 armv7-m(或 -a))。
正如 Jake 指出的那樣,32 位 arm 指令基本上是 8 個有效位由偶數(0、2、4、6)移位。
ldr r0,=0x00000081
ldr r0,=0x00000101
ldr r0,=0x00000102
ldr r0,=0x00000204
ldr r0,=0x10000008
ldr r0,=0xEFFFFFF7
ldr r0,=0xFFFFF00F
00000000 <.text>:
0: e3a00081 mov r0, #129 ; 0x81
4: e59f0010 ldr r0, [pc, #16] ; 1c <.text 0x1c>
8: e59f0010 ldr r0, [pc, #16] ; 20 <.text 0x20>
c: e3a00f81 mov r0, #516 ; 0x204
10: e3a00281 mov r0, #268435464 ; 0x10000008
14: e3e00281 mvn r0, #268435464 ; 0x10000008
18: e3e00eff mvn r0, #4080 ; 0xff0
1c: 00000101 .word 0x00000101
20: 00000102 .word 0x00000102
arm 編碼比拇指編碼更容易理解,但 arm 檔案中有更容易理解的示例。
既然你提到了 0xFF00FF00 這意味著你在問 armv7-a 或 armv7-m 是嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326211.html
