Файл Program.cs:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ASMC
{
class ASM {
public String cmd { get; set; } // Команда, допустим CMP
public String param1 { get; set; } // Первый параметр, допустим REG0
public String param2 { get; set; } // Второй пареметр, допустим 0
public String param3 { get; set; } // Третий параметр (для сравнения, работа с математическими операции)
public ASM()
{
// Инициализация
this.cmd = "";
this.param1 = "";
this.param2 = "";
this.param3 = "";
}
// Возвращает строку
public String to_string()
{
return "cmd=" + this.cmd + ", param1=" + this.param1 + ", param2=" + this.param2 + ", param3=" + this.param3;
}
}
class Program
{
private static IDictionary<String, int> cmd = null; // Ассоциативный массив для команд
private static IDictionary<String, int> reg = null; // Ассоциативный массив для регистров
private static void init()
{
cmd = new Dictionary<String, int>(); // Инициализация
cmd.Add("NOP", 0); // Пустая операция
cmd.Add("MOV0", 1); // mov register, value
cmd.Add("MOV1", 2); // mov register, register
cmd.Add("INC", 3); // increment
cmd.Add("DEC", 4); // decrement
cmd.Add("CMP", 5); // compare
cmd.Add("JMP", 6); // jump
cmd.Add("PUSH", 7); // push
cmd.Add("POP", 8); // pop
cmd.Add("DISPLAY", 250); // display функция
cmd.Add("EXIT", 251); // выход
reg = new Dictionary<String, int>(); // Инициализация
reg.Add("REG0", 0); // Регистры
reg.Add("REG1", 1);
reg.Add("REG2", 2);
reg.Add("REG3", 3);
reg.Add("REG4", 4);
reg.Add("REGB0", 10); // Регистры байт
reg.Add("REGB1", 11);
reg.Add("REGB2", 12);
reg.Add("REGB3", 13);
reg.Add("REGB4", 14);
reg.Add("REGW0", 20); // Регистры слово
reg.Add("REGW1", 21);
reg.Add("REGW2", 22);
reg.Add("REGW3", 23);
reg.Add("REGW4", 24);
reg.Add("REGADR0", 30); // Регистры адреса
reg.Add("REGADR1", 31);
reg.Add("REGADR2", 32);
reg.Add("REGADR3", 33);
reg.Add("REGADR4", 34);
}
//Конвертирует из числа в байт
private static String conv_int_to_chr(int num)
{
return ((char)num).ToString();
}
// Возвращает количество параметров
private static int get_cnt_params(String buf)
{
return buf.Split(new char[] {',', ' '}).Length-1;
}
// Парзит строку
private static ASM parse_string(String buf)
{
int cnt = get_cnt_params(buf); // Получаем количество параметров
ASM a = new ASM();
if (cnt == 0) // Например NOP
{
a.cmd = buf;
return a;
}
else if (cnt == 1) // Например JMP 500
{
String[] arr = buf.Split(' ');
a.cmd = arr[0];
a.param1 = arr[1];
}
else if (cnt == 2) // Например MOV REG0, 5
{
String[] arr1 = buf.Split(',');
String[] arr2 = arr1[0].Split(' ');
a.cmd = arr2[0];
a.param1 = arr2[1];
a.param2 = arr1[1];
return a;
}
else if (cnt == 3) // Например CMP REG0,5,50
{
String[] arr1 = buf.Split(',');
String[] arr2 = arr1[0].Split(' ');
a.cmd = arr2[0];
a.param1 = arr2[1];
a.param2 = arr1[1];
a.param3 = arr1[2];
return a;
}
return a;
}
static void Main(string[] args)
{
int error_num = 1; // Количество ошибок
// Если нет параметров, то выводит подсказку
if (args.Length == 0)
{
Console.WriteLine("(c) 2021 uscheswoi_82");
Console.WriteLine("asmc.exe <input.asm> <output.bin>");
return;
}
try
{
String[] data = System.IO.File.ReadAllLines(args[0]); // Читает файл
String binData = ""; // Бинарные данные
init(); // Инициализация
Console.WriteLine("Compiling " + args[0]); // Отображает Compiling demo.asm
foreach (String dt in data)
{
ASM a = parse_string(dt);
// Console.WriteLine(get_cnt_params(dt));
// Если _DB или _DW то:
if (a.cmd.Equals("_DB") || a.cmd.Equals("_DW"))
{
binData += a.param1;
}
else
{
binData += conv_int_to_chr(cmd[a.cmd]);
if (!a.param1.Equals(""))
{
if (a.param1.StartsWith("REG"))
binData += conv_int_to_chr(reg[a.param1]);
else
binData += conv_int_to_chr(int.Parse(a.param1));
}
if (!a.param2.Equals(""))
{
binData += conv_int_to_chr(int.Parse(a.param2));
}
if (!a.param3.Equals(""))
{
binData += a.param3;
}
}
///Console.WriteLine(a.to_string());
error_num++; // Считает ошибки
}
System.IO.File.WriteAllText(args[1], binData.ToString());
}
catch (Exception ex) {
Console.WriteLine("Error on line: " + error_num); // Показывает ошибку и строка где произошла ошибка
}
}
}
}