Файл 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); // Показывает ошибку и строка где произошла ошибка } } } }