기본적으로 두 패스 어셈블러이며 주어진 어셈블리 파일에 진입 점을 구현하려고합니다. 명령의 형식은 다음과 같습니다.(구성된 언어 용) 어셈블러 역할을하는 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 문자열을 읽는 경우 공백 문자를 반환하는 메서드입니다.
엄청난 양의 코드를 사용하여 죄송합니다. 오류 메시지가 훨씬 더 잘 처리 될 수 있다는 것을 알고 있습니다 만, 현재는이 특정 코드가 두 개 이상의 피연산자가있을 때마다 어셈블러에 매달려 있습니다. 하나의 쉼표).
누군가가이 문제에 대해 도움을 주시면 감사하겠습니다.
감사합니다.
디버거를 사용하여 단계별 실행을 시도 했습니까? –