2016-03-02 56 views
-3

我試圖將程序集轉換爲機器代碼。我有一個MINGW編譯器,如果我輸入./convert.exe mov%a,那麼它應該輸出0x01 0xc0。我正在考慮使用一個結構列出每個彙編代碼及其相應的機器值。此刻,我不斷收到類似於「請求會員操作碼而不是結構」的錯誤。任何幫助,將不勝感激。將單個程序集轉換爲機器代碼

#include <stdio.h> 
#include <string.h> 

struct _Instruction { 
char mnemonic[10]; 
unsigned char opcode;} typedef Instruction; 

Instruction instruction_list[] = { 
{"mov", 0x01}, 
{"add", 0x04}, 
{"sub", 0x05}, 
{"mul",0x06}, 
{"div", 0x07}, 
{"and",0x08}, 
{"or",0x09}, 
{"xor",0x0a}, 
{"cmp",0x0b}, 
{"",-1}, 
}; 

Instruction get_inst(char mnemonic[]); 

int main2(int argc, char *argv[]) 
{ 

char* instruction = argv[1]; 
Instruction get_inst = get_Instruction(instruction); 

printf("%s ; %s",instruction_list.mnemonic,instruction_list.opcode); 
return 0; 
} 

Instruction get_inst(char mnemonic[]) 
{ 
int i; 

for(i=0; instruction_list[i].opcode != -1; i++) 
{ 
    if(!strcmp(instruction_list[i].mnemonic, mnemonic)) 
    { 
    return instruction_list[i]; 
    } 
} 
return instruction_list[i]; 
} 
+0

從閱讀[問]開始。然後正確格式化這個混亂。在類型說明符之後加入'typedef'已被棄用。 – Olaf

+0

'instruction_list.opcode'應該是'get_inst.opcode'不應該嗎? 'instruction_list.mnemonic'也一樣。 – immibis

+0

'struct _Instruction {...} typedef指令;' - >'typedef struct _Instruction {...}指令;' –

回答

1

一方面,您的結構被錯誤地聲明。你應該這樣,而不是將其格式化:

typedef struct _Instruction { 
    .... 
} Instruction; 

我不知道爲什麼,這不是觸發語法錯誤,但它肯定沒有幫助。

另外,你有一個變量和一個名爲get_inst的函數。您調用名爲get_Instruction()的不存在的函數。你可能打算命名你的功能get_Instruction()

另外,您的結構的.opcode成員是單個char。您的printf聲明使用「%s」格式說明符來打印它。這需要一個字符串,這將導致printf繼續讀取.opcode成員的末尾,顯示不可預知的垃圾並訪問它應該不會觸及的內存。

+0

嗨,非常感謝您的幫助,但是一個簡單的問題是如何打印操作碼呢?你會建議%c嗎? – Jim

+0

@ Jim-「'%c'」將會打印一個字符,但是您在這裏不使用ASCII字符,因此您可能會得到某些不可打印的內容。使用「0x%02x」來打印十六進制格式的單字節數字。 – bta

+0

不幸的是在獲得「未定義的WinMain @ 16引用」的錯誤,但沒有人能做到這一點,所以感謝您的幫助! – Jim