從ARM公司:
ADD
兩個值相加。第一個值來自一個寄存器。第二個值可以是立即數或寄存器中的值,並且可以在添加之前進行移位。
你看到眼前的價值正在被移動。位11:你的指令的0是移位操作 - 在你的情況:0xA05
。
在後來的文檔,所述尋址模式被描述:
的<shifter_operand>
值由旋轉(右側)是一個32位字的8位立即值到任何偶數位位置處形成。
因此,您的特定移位操作數表示0x05
右移(2 * 10)
位。
您有幾種選擇,如果你正在做的指令編碼。例如:
0xA05 // rotate 0x05 right by 20
0xB14 // rotate 0x14 right by 22
0xC50 // rotate 0x50 right by 24
我的手編碼它們拆卸:
$ xxd -r > example
00 05 CA 8C E2 14 CB 8C E2 50 CC 8C E2
$ arm-none-eabi-objdump -m arm -b binary -D example
example: file format binary
Disassembly of section .data:
00000000 <.data>:
0: e28cca05 add ip, ip, #20480 ; 0x5000
4: e28ccb14 add ip, ip, #20480 ; 0x5000
8: e28ccc50 add ip, ip, #20480 ; 0x5000
這裏有一個簡單的程序,可以找到編碼:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(int argc, char **argv)
{
uint32_t encode = strtoul(argv[1], NULL, 0);
int rotate;
for (rotate = 0; rotate < 32; rotate += 2)
{
// print an encoding if the only significant bits
// fit into an 8-bit immediate
if (!(encode & ~0xffU))
{
printf("0x%X%02X\n", rotate/2, encode);
}
// rotate left by two
encode = (encode << 2) | (encode >> 30);
}
return 0;
}
和實例運行你的情況:
$ ./example 0x5000
0xA05
0xB14
0xC50
我知道,但我需要一個翻領e convert ... – scvyao
編輯添加一些例子。 –
你介意用C寫你的轉換算法嗎?轉換(0x5000處)= 0xA05,0xB14,... – scvyao