Ассемблер для MDSP Александр Поташев ноябрь, 2009 г. Цели и задачи ● ● ● Создание ассемблера для микропроцессора MDSP: ● на входе – исходный код на ассемблере ● на выходе – образ программной памяти МП Синтаксис в стиле AT&T Использование по возможности общего с funcsim исходного кода План ● ● Общий алгоритм работы ● Лексический анализатор ● Семантический анализатор Структура кода ● class Token ● class SemanticUnit ● class Operand ● class TokenAn ● class SemanticAn ● class Assembler Лексический анализатор (class TokenAn) label: brm %r0, (%r1) label : EOS ld $100, %r0 brm ld %r 0 100 , %r 1 ( , %r 0 jmp label Token s ) EOS EOS Семантический анализатор (class SemanticAn) label brm ld : %r 0 100 EOS , label: %r 1 ( , %r 0 ) EOS EOS brm %r0 m(%r1 ) ld 100 %r0 SemanticUnits class Token переменные к лtokenType а с с а std::string sVal int iVal type() str() integer() getter getter getter TOKEN_ID TOKEN_CONST_IN T TOKEN_COLON TOKEN_COMMA TOKEN_LBRACKET TOKEN_RBRACKET TOKEN_EOS createId(string id_string) createConstInt(int iVal) createScalar(tokenType) createEos() метод ы значен class SemanticUnit unitType type() UNIT_LABEL std::string sVal str() vector<Operand *> operands nOperands( ) operator[] UNIT_OPERATION createLabel(string id_string) createOperation(string opcode, operands) bool operator== (string str) Нет привязки к контексту class Operand type std::string sVal int iVal str() OPERAND_GPR OPERAND_CUSTOM_I D OPERAND_CONST_IN T isConstInt() integer() createConstInt(int iVal) createId(string id_string) createIdInd(string id_string) indirect false isDirectGpr() %r0 true isIndirectGpr() (%r0) class TokenAn TokenAn(const char *filename) char *data readFileContents(const char *filename) long filelength initFileLength(const char *filename) char *ptr vector<Token *> run() skipSpaces() class SemanticAn vector<Token *> tokens SemanticAn(vector<Token *> tokens) vector<Token *>::iterator tok vector<SemanticUnit *> run() vector<Operand *> parseOperandList() Operand *parseOperand() isOpcode(string s) class Assembler vector<SemanticUnit *> units Assembler(vector<SemanticUnit *> units) map<unsigned int, hostUInt8> run() ByteLine *encodeOperation(SemanticUnit *op, pc) int getGprNum(string id) funcsi m class Operation set(...) encode() Результаты исходный код brm %r0, (%r1) brm (%r0), %r1 brr %r0, %r1 ld $100, %r0 ld $100, (%r0) ● ● образ памяти 24 00 00 01 24 20 00 01 2C 00 00 01 38 00 0C 80 38 00 0C 80 Реализованы команды пересылки данных Для генерации образа памяти используется код funcsim Спасибо за внимание!