2011-02-23 80 views
2

是否有其他(更快)的方式獲取它? x86架構 這是我寫到目前爲止。指令中的操作碼數

#include <cstdio> 
#include <cstdlib> 

typedef unsigned int UINT; 
typedef unsigned char BYTE; 

BYTE getInstructionLength(BYTE * data); 

int main() 
{ 

    //get mod 
    //hex:bin 0x00:00 0xC0:11 0x40:01 0x80:10 
    //printf("opcode 0x%X mod: 0x%X\n", opcode, opcode&0xC0); 
    //get r 
    //hex:bin 0x28:101 0x30:110 0x8:001 
    //printf("opcode 0x%X reg: 0x%X\n", opcode, opcode&0x38); 
    //get m 
    //hex:bin 0x07:111 0x2:010 0x1:001 0x6:110 0x0:000 0x3:011 0x4:100 0x5 101 
    //printf("opcode 0x%X R/M: 0x%X\n", opcode, opcode&0x07); 

    for(BYTE opcode=0x0; opcode < 255; opcode++) 
    { 
     printf("opcode 0x%X mod: 0x%X reg:0x%X M:0x%X\n", opcode, opcode&0xC0, opcode&0x38, opcode&0x07); 
    } 
    return 0; 
} 

BYTE getInstructionLength(BYTE * data) 
{ 
    if(data[0] >= 0x3F && data[0] <= 0x61) return 1; //one opcode instructions 
    switch(data[0]) 
    { 
    case 0x00: 
     switch(data[1]) 
     { 
     case 0x00: return 2; //ADD BYTE PTR DS:[EAX],AL 
     case 0x01: return 2; //ADD BYTE PTR DS:[ECX],AL 
     case 0x02: return 2; //ADD BYTE PTR DS:[EDX],AL 
     case 0x03: return 2; //ADD BYTE PTR DS:[EBX],AL 
     case 0x04: if(data[2]&0x07 == 0x5) return 7; else return 3; //always 7 if R/M = 101 
     case 0x05: return 6; 
     case 0x06: return 2; 
     case 0x07: return 2; 
     case 0x08: return 2; 
     case 0x09: return 2; 
     case 0x0A: return 2; 
     case 0x0B: return 2; 
     case 0x0C: if(data[2]&0x07 == 0x5) return 7; else return 3; 
     } 
     case 0x06: return 1; //push es 
     case 0x07: return 1; //pop es 
     case 0x16: return 1; //push ss 
     case 0x17: return 1; //pop ss 
     case 0x90: return 1; //nop 
    } 
} 
+0

如果你只是想單操作碼說明,這裏是x86上的信息http://home.comcast.net/~fbui/intel.html其他指令集應該有類似的規格。 – 2011-02-23 21:05:37

+0

你知道如何在C/C++中計算它的大小嗎? – Yulo 2011-02-23 21:09:59

+0

看起來像嵌套的'switch'可以縮小 - 爲了可讀性,如果沒有別的。 – 2011-02-24 17:30:47

回答

2

如果您需要能夠計算爲86個字節的指令長度,那麼你可以找
長度反彙編 Z0mbie頁面上:http://z0mbie.daemonlab.org/

+0

這就是我一直在尋找的。謝謝! – Yulo 2011-02-23 22:06:26