2012-06-04 50 views
1

我在嘗試使用C創建程序集仿真程序時出現問題。有5個寄存器:REGA,REGB,REGC,REGX和INSP以及10條指令:NOP,SET和AND SHR(>>),JMP。),OR(逐位),ADD,SUB,SHL(< <左),SHR(>>),JMP。在指針值上添加操作C

程序從文件讀取指令;包含指令和2個參數的行。在大多數情況下,第一個參數是一個寄存器名稱(例如REGA),第二個參數可以是一個寄存器名稱或一個整數。

我使用sscanf從文件中獲取指令。

我遇到了ADD,SUB,SHL和SHR函數的問題。我的外接功能是:如果2個寄存器參數傳遞

int opcode_add(char* opcode, char *arg1, char *arg2){ 
    int i, j; 
    for(i = 0; i < MAX_REGISTER; i++){ 
     if (strcmp(register_str[i],arg1) == 0){ 
      for(j = 0; j <=MAX_REGISTER; j++){ 
       if(strcmp(register_str[j],arg2) == 0){ 
        *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
        break; 
       }else { 
        *register_ptr[i] = *register_ptr[i] + atoi(arg2); 
       }  
      } 

     } 
    } 
    INSP++; 
    return (0); 
} 

的功能工作。例如:

SET REGA 1 
SET REGB 2 
ADD REGA REGB 

但是,如果傳遞一個寄存器和一個整數,則不適用。例如:

SET REGA 2 
ADD REGA 1 

的問題是在這條線:

*register_ptr[i] = *register_ptr[i] + atoi(arg2); 

我試着這樣做:

int y = *register_ptr[i]; 
int k = atoi(arg2); 
int result = y+k; 
*register_ptr[i] = result; 

,但沒有奏效。

+0

什麼錯誤訊息您收到? –

+3

這看起來很可疑:'for(j = 0; j <= MAX_REGISTER; j ++)'外部'for'的終止條件是'i hmjd

回答

1

你沒有說什麼沒有工作 - 但是,沒有在你的結構內環和if的方式至少有一個錯誤。每當內部循環看到與第二個操作數不匹配的寄存器時,將執行else塊 - 因此全部爲寄存器,然後第二個操作數指定的寄存器將被添加到(如果第二個操作數是int,則爲所有寄存器將被添加到)。在循環之後,必須將else塊的內容移動,並且只有在內部循環未找到寄存器時才必須執行它們。

+0

對不起。我沒有收到任何錯誤消息。問題是計算不正確。例如,如果我:SET REGA 1;然後ADD REGA 1 - 應執行else語句(因爲arg2不是寄存器,它是一個int)。它這樣做;但是,計算結果是錯誤的。在這個例子中,我收到的結果是不正確的。 – Maj

+0

@Maj:是的,因爲'else'會因爲我描述的錯誤而被執行多次。確保你理解爲什麼會發生這種情況(無論是通過調試或者插入'cout'語句來顯示'if部分'和'else'部分被執行的時間),然後再嘗試修復它。 –

+0

感謝您的幫助。我沒有使用調試器;我還沒有嘗試過。我設法通過在第一個if後面移動else語句的內容來解決它。 – Maj

0

的問題在這裏:

所有的
for(j = 0; j <=MAX_REGISTER; j++){ 
    if(strcmp(register_str[j],arg2) == 0){ 
     *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
     break; 
    }else { 
     *register_ptr[i] = *register_ptr[i] + atoi(arg2); 
    }  
} 

首先,你應該檢查j < MAX_REGISTER因爲你的陣列(顯然)不包括MAX_REGISTER本身。但更重要的是,只要一個註冊名稱不匹配就不應嘗試atoi

你現在所做的是,如果第二個參數不是REGA,你立即去else並嘗試atoi。你應該是檢查所有的寄存器,如果arg2是沒有人,然後再嘗試atoi

bool found = false; 
for(j = 0; j < MAX_REGISTER; j++){ 
    if(strcmp(register_str[j],arg2) == 0){ 
     *register_ptr[i] = *register_ptr[i] + *register_ptr[j]; 
     found = true 
     break; 
    }  
} 
if (!found) 
    *register_ptr[i] = *register_ptr[i] + atoi(arg2);