2011-03-08 1 views
0

기본적으로 두 패스 어셈블러이며 주어진 어셈블리 파일에 진입 점을 구현하려고합니다. 명령의 형식은 다음과 같습니다.(구성된 언어 용) 어셈블러 역할을하는 Java 프로그램 : 루프 도중 종료되지 않습니다.

Prog  .ORIG 
     .ENT some,entry,point 
some  LD  R0,entry 
entry LD  R1,point 
point .FILL #42 
     .END some 

관련 부분은 .ENT 행입니다. 이것이 어셈블러가 사용하고있는 라인입니다.

첫 번째 패스는 .ENTs 처리를 처리하지만 두 개 이상의 인수 (즉, 하나 이상의 쉼표)에는 작동하지 않습니다. 두 개의 피연산자에서 작동합니다. 특정 .ENT 부분에 대한 코드는 다음과 같습니다.

String comma = ","; 
String entry = ""; 
String[] tempEntryArray = new String[2]; 
int indexOfComma = read.indexOf(comma); 
int startingIndex = 17; 
int numOperands = 1; 
while (indexOfComma != -1) { 
    if ((indexOfComma-startingIndex) == 0) { 
     return "An operand must precede the comma."; 
    } 
    if (numOperands > 4) { 
     return "The .ENT psuedo-op on line " + lineCounter 
       + " has more than 4 operands."; 
    } 
    entry = overSubstring(read, startingIndex, indexOfComma); 
    if (entry.contains(" ")) { 
     return "The operand \"" + entry + "\" on line " 
       + lineCounter + " has a space in it."; 
    } 
    if (entry.length() > 6) { 
     return "The operand \"" + entry + "\" on line " 
       + lineCounter + " is longer than 6 characters."; 
    } 
    machineTables.externalSymbolTable.put(entry, tempEntryArray); 
    entry = read.substring(indexOfComma + 1); 
    startingIndex = indexOfComma + 1; 
    indexOfComma = entry.indexOf(comma); 
    if (indexOfComma != -1) { 
     indexOfComma += (startingIndex - 1); 
    } 
    numOperands++; 
} 
entry = overSubstring(read, startingIndex, read.length()); 
if (entry.contains(" ")) { 
    return "The operand \"" + entry + "\" on line " 
      + lineCounter + " has a space in it."; 
} 
if (entry.length() > 6) { 
    return "The operand \"" + entry + "\" on line " 
      + lineCounter + " is longer than 6 characters."; 
} 
machineTables.externalSymbolTable.put(entry, tempEntryArray); 

읽기는 입력 파일의 한 줄을 포함하는 문자열입니다. overSubstring은 부분 문자열과 비슷하게 수행되지만 null 문자열을 읽는 경우 공백 문자를 반환하는 메서드입니다.

엄청난 양의 코드를 사용하여 죄송합니다. 오류 메시지가 훨씬 더 잘 처리 될 수 있다는 것을 알고 있습니다 만, 현재는이 특정 코드가 두 개 이상의 피연산자가있을 때마다 어셈블러에 매달려 있습니다. 하나의 쉼표).

누군가가이 문제에 대해 도움을 주시면 감사하겠습니다.

감사합니다.

+1

디버거를 사용하여 단계별 실행을 시도 했습니까? –

답변

1

난 당신이 무한히 같은 indexOfComma 값을 읽고 있다고 생각합니다. 대신 모든 startingIndexsubstring() 사업으로, 단지 제대로 당신이 이미 발견했습니다 선행 지수를 건너 String#indexOf(String, int) 대신 String#indexOf(String)를 사용합니다.

indexOfComma을 꾸준히 얻으십시오. 다음과 같음 :

int indexOfComma = -1; 
int numOperands = 1; 
while ((indexOfComma = read.indexOf(comma, indexOfComma+1)) != -1) { 
    // snip... 
    machineTables.externalSymbolTable.put(entry, tempEntryArray); 
    numOperands++; 
} 
+0

성스러운 sh **, 고마워. 젠투! 내가해야 할 일을했을 모든 indexOfComma = read.indexOf (쉼표, startingIndex) – RBurgundy

+0

@user와 indexOfComma = entry.indexOf (쉼표)를 교체했다 : 그게 해결 되었습니까? –

+0

예, 그것은 작동합니다. – RBurgundy

관련 문제