0
我想爲IBM360彙編語言設計一個簡單的彙編程序。因此,我首先實現了符號表。我將我的符號/標籤存儲在一個單獨的文件中,以便在生成符號表時進行比較。我面臨的問題是,由於不必要的比較導致錯誤的位置計數器(LC)值。我能夠檢測符號但是LC值錯誤。任何人都可以指導我修改我的代碼?pass1彙編程序的符號表
這裏是我的程序:
import java.io.*;
import java.lang.*;
class SymbolTable
{
public static void main(String args[]) throws Exception
{
FileReader fr = new FileReader("program.asm");
BufferedReader br = new BufferedReader(fr);
String s,l;
String code[]=new String[100];
String label[]=new String[100];
int N=0,i,LOC=0,n=0,j;
System.out.println("Assembly lang program :\n--------------------------");
while((s = br.readLine()) != null)
{
code[N++]=s;
System.out.println(s);
}
fr.close();
FileReader labels = new FileReader("label.txt");
BufferedReader buff = new BufferedReader(labels);
while((s = buff.readLine()) != null)
{
label[n++]=s;
}
labels.close();
System.out.println("\n\n SYMBOL TABLE :\n-------------------------------------------\nLABEL\tLC\tLENGTH\tRELATIVE/ABSOLUTE\n-------------------------------------------");
for(i=0;i<N;i++)
{
for(j=0;j<n;j++)
{
char codearr[]=new char[15];
codearr=code[i].toCharArray();
if(code[i].startsWith("USING"))
{
break;
}
else if(code[i].startsWith(label[j]))
{
System.out.println(label[j]+"\t"+LOC+"\t4\tR");
if(i==0)
{}
else
LOC=LOC+4;
break;
}
else if(codearr[1]=='R') // for register addressing mode
LOC=LOC+2;
else
LOC=LOC+4;
}
}
}
}
program.asm:
JOHN START
USING *,15
L 1,FIVE
A 1,FOUR
ST 1,TEMP
FOUR DC F '4'
FIVE DC F '5'
TEMP DS 1F
END
label.txt
JOHN
FOUR
FIVE
TEMP
輸出:
G:\programs>javac SymbolTable.java
G:\programs>java SymbolTable
Assembly lang program :
--------------------------
JOHN START
USING *,15
LR 1,FIVE
A 1,FOUR
ST 1,TEMP
FOUR DC F '4'
FIVE DC F '5'
TEMP DS 1F
END
SYMBOL TABLE :
-------------------------------------------
LABEL LC LENGTH RELATIVE/ABSOLUTE
-------------------------------------------
JOHN 0 4 R
FOUR 44 4 R
FIVE 56 4 R
TEMP 72 4 R
我建議你搬出內部循環的一切,是不依賴於'j'的。 –
@ PM77-1如果我將移出內部循環,那我怎麼能做剩下的比較? – chinu
如果我理解正確,只有一個條件需要使用內部循環。所以把循環放在那個'else if'裏面。它有意義還是我在這裏錯過了什麼? –