2013-07-20 85 views
3

假設有這樣的一個研究所:如何對即時值進行編碼?

add ip, ip, #0x5000 

機器代碼

05 CA 8C E2

E2 8C CA 05 = 11100010100011001100 1010 00000101 
imm = rotate_right(101B, 1010B*2) = 0x5000 

但是,如果我們知道0x5000處,我們怎麼能得到101000000101?這是反向轉換一對一的對應關係嗎?謝謝。

回答

7

從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 
+0

我知道,但我需要一個翻領e convert ... – scvyao

+0

編輯添加一些例子。 –

+0

你介意用C寫你的轉換算法嗎?轉換(0x5000處)= 0xA05,0xB14,... – scvyao