我想为 IBM360 汇编语言设计一个简单的汇编器。所以我首先实现符号表。我将我的符号/标签存储在一个单独的文件中,以便在生成符号表时对其进行比较。我面临的问题是,由于不需要的比较,位置计数器 (LC) 值不正确。我能够检测到这些符号但 LC 值错误。谁能指导我修改我的代码?
这是我的程序:
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;
}
}
}
}
程序.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
标签.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