我一直在为我的 VM 使用 Java 编写汇编程序,但我不知道为什么会发生这种情况,因为提供的字符串是 1。我尝试修剪它,但它仍然抛出此错误。我发现的所有内容都无法解决此问题,错误出现在我设置 tmpa 的第 117 行,请帮助!
汇编.java
package vm;
import java.util.Scanner;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
class asm {
public static int pc = 0;
public static void main(String[] args){
String a = "";
String filename = "prog.asm";
String tmp = "";
try
{
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null)
{
tmp += line;
tmp += " ";
}
reader.close();
}
catch (Exception e)
{
System.err.format("Exception occurred trying to read '%s'.", filename);
e.printStackTrace();
System.exit(1);
}
tmp = tmp.replace(", ", " ");
tmp = tmp.replace(",", " ");
tmp = tmp.replace(" ,", " ");
String[] prog = tmp.split(" ");
for(int i=0;i<prog.length;i++){
System.out.println(
"CURRENT POS: " + i +
", " + prog[i]
);
}
while(pc < prog.length){
String d = prog[pc];
if(!((prog[pc].substring(0, 1)).equals("$")) && !((prog[pc].substring(0, 1)).equals("r"))){
System.out.println("FOUND INSTR " + prog[pc].substring(0, 1));
a += " 0x";
}
if(prog[pc].equals("hlt")) {
a += "00000000";
}else if(prog[pc].equals("mov")){
if(prog[pc].substring(0, 1).equals("r")){
a += "02";
}else{
a += "01";
}
}else if(prog[pc].equals("add")){
if(prog[pc].substring(0, 1).equals("r")){
a += "04";
}else{
a += "03";
}
}
else if(prog[pc].equals("sub")){
if(prog[pc].substring(0, 1).equals("r")){
a += "06";
}else{
a += "05";
}
}
else if(prog[pc].equals("mul")){
if(prog[pc].substring(0, 1).equals("r")){
a += "08";
}else{
a += "07";
}
}
else if(prog[pc].equals("div")){
if(prog[pc].substring(0, 1).equals("r")){
a += "0A";
}else{
a += "09";
}
}else if(prog[pc].equals("psh")){
if(prog[pc].substring(0, 1).equals("r")){
a += "0C";
}else{
a += "0B";
}
}else if(prog[pc].equals("psh")){
if(prog[pc].substring(0, 1).equals("r")){
a += "0E";
}else{
a += "0D";
}
}else if(prog[pc].substring(0, 1).equals("$")){
int tmpa = Integer.parseInt(prog[pc + 1].substring(1, 2)) - 1;
String tmpc="";
char[] tmpd = prog[pc].toCharArray();
for(int i=0;i<tmpd.length;i++) {
if(tmpd[i] == '$') {}
else if(tmpd[i] == '#') break;
else tmpc += tmpd[i];
}
a += tmpa;
a += "0";
if(tmpc.length() > 3) {
a += tmpc;
}else if(tmpc.length() > 2) {
a += "0" + tmpc;
}else if(tmpc.length() > 1) {
a += "00" + tmpc;
}else if(tmpc.length() > 0) {
a += "000" + tmpc;
}
pc++;
}
else if(prog[pc].substring(0, 1).equals("r")) {
System.out.println(prog[pc + 1].substring(1, 2));
int tmpa = Integer.parseInt(prog[pc + 1].substring(1, 2).trim()); << Error
int tmpb = Integer.parseInt(prog[pc].substring(1, 2).trim());
a += tmpb;
a += tmpa;
a += "0000";
pc++;
}
pc++;
}
System.out.println(a);
}
}
程序.asm
mov $1#, r1
mov $1#, r2
add r1, r2
psh r1
hlt
答案 0 :(得分:1)
当您的代码在“hlt”行上运行并且检查的子字符串包含一个不是数字的“l”字母时,因此 Integer.ParseInt 无法将“l”字母转换为整数。