Заставка

Программирование на старых и современных языках, а так-же дизайн

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Мой ассемблер на C# 3.5

Сообщений 1 страница 2 из 2

1

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

0

2

Пример count.asm:

Код:
NOP
MOV0 REG0,0
INC REG0
DISPLAY REG0
CMP REG0,10,13
JMP 3
EXIT

Запуск:

Код:
C:\asmc>ASMC.exe count.asm count.bin
Compiling count.asm

0