/
dashytka
/
HackTranslator
Обзор
Документация
Войти
/
dashytka
/
HackTranslator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cs
106 строк
3 KB
dashytka
create cs
09 дек 2025, 00:09
09 дек 2025, 00:09
e7dd44d
Код
Авторство
О чём код?
using System.Collections.Generic; using System.Linq; using System; namespace Assembler { public class HackTranslator { private int VariableCounter = 16; public string[] TranslateAsmToHack(string[] instructions, Dictionary<string, int> symbolTable) { var result = new string[instructions.Length]; for (int i = 0; i < instructions.Length; i++) result[i] = instructions[i].StartsWith('@') ? AInstructionToCode(instructions[i], symbolTable) : CInstructionToCode(instructions[i]); return result; } public string AInstructionToCode(string aInstruction, Dictionary<string, int> symbolTable) { int addressInDecimal; var address = aInstruction[1..]; if (char.IsDigit(aInstruction[1])) addressInDecimal = int.Parse(address); else { if (!symbolTable.ContainsKey(address)) symbolTable.Add(address, VariableCounter++); addressInDecimal = symbolTable[address]; } var addressInBin = Convert.ToString(addressInDecimal, 2).PadLeft(15, '0'); return "0" + addressInBin; } public string CInstructionToCode(string cInstruction) { var instructionAndJump = cInstruction.Split(';'); var compAndDest = instructionAndJump[0].Split('='); var jump = instructionAndJump.Length == 1 ? "000" : JumpInstructions[instructionAndJump[1]]; var destination = ""; string competition; if (compAndDest.Length == 1) { destination = "000"; competition = compAndDest[0]; } else { competition = compAndDest[1]; foreach (var register in "ADM") destination += compAndDest[0].Contains(register) ? "1" : "0"; } string useMRegister = competition.Contains('M') ? "1" : "0"; string compDictKey = competition.Replace("A", "R").Replace("M", "R"); competition = CompInstructions[compDictKey]; return "111" + useMRegister + competition + destination + jump; } private static readonly Dictionary<string, string> JumpInstructions = new() { { "JGT", "001" }, { "JEQ", "010" }, { "JGE", "011" }, { "JLT", "100" }, { "JNE", "101" }, { "JLE", "110" }, { "JMP", "111" }, }; private static readonly Dictionary<string, string> CompInstructions = new() { { "0", "101010"}, { "1", "111111"}, { "-1", "111010"}, { "D", "001100"}, { "R", "110000"}, { "!D", "001101"}, { "!R", "110001"}, { "-D", "001111"}, { "-R", "110011"}, { "D+1", "011111"}, { "R+1", "110111"}, { "D-1", "001110"}, { "R-1", "110010"}, { "D+R", "000010"}, { "D-R", "010011"}, { "R-D", "000111"}, { "D&R", "000000"}, { "D|R", "010101"} }; } }