130 likes | 300 Views
Ассемблер для MDSP. Александр Поташев ноябрь, 2009 г. Цели и задачи. Создание ассемблера для микропроцессора MDSP: на входе – исходный код на ассемблере на выходе – образ программной памяти МП Синтаксис в стиле AT&T Использование по возможности общего с funcsim исходного кода. План.
E N D
Ассемблер для MDSP Александр Поташев ноябрь, 2009 г.
Цели и задачи Создание ассемблера для микропроцессора MDSP: на входе – исходный код на ассемблере на выходе – образ программной памяти МП Синтаксис в стиле AT&T Использование по возможности общего с funcsim исходного кода
План Общий алгоритм работы Лексический анализатор Семантический анализатор Структура кода class Token class SemanticUnit class Operand class TokenAn class SemanticAn class Assembler
Лексический анализатор (class TokenAn) label: brm%r0,(%r1) ld$100,%r0 label : EOS brm %r0 , ( %r1 ) EOS ld 100 , %r0 EOS jmp label Tokens
Семантический анализатор (class SemanticAn) label: label : EOS brm %r0 , ( %r1 ) EOS brm %r0 m(%r1) ld 100 , %r0 EOS ld 100 %r0 SemanticUnits
classToken переменные класса tokenType std::string sVal int iVal type() str() integer() getter getter getter TOKEN_ID TOKEN_CONST_INT createId(string id_string) TOKEN_COLON TOKEN_COMMA createConstInt(int iVal) TOKEN_LBRACKET createScalar(tokenType) TOKEN_RBRACKET TOKEN_EOS createEos() методы значения
classSemanticUnit unitType std::string sVal vector<Operand *> operands type() str() nOperands() operator[] UNIT_LABEL UNIT_OPERATION createLabel(string id_string) createOperation(string opcode, operands) bool operator== (string str) Нет привязки к контексту
classOperand type std::string sVal int iVal str() integer() OPERAND_GPR OPERAND_CUSTOM_ID OPERAND_CONST_INT isConstInt() createConstInt(int iVal) createId(string id_string) createIdInd(string id_string) indirect false isDirectGpr() %r0 true isIndirectGpr() (%r0)
classTokenAn TokenAn(const char *filename) char *data readFileContents(const char *filename) long filelength initFileLength(const char *filename) char *ptr vector<Token *> run() skipSpaces()
classSemanticAn vector<Token *> tokens SemanticAn(vector<Token *> tokens) vector<Token *>::iterator tok vector<SemanticUnit *> run() vector<Operand *> parseOperandList() Operand *parseOperand() isOpcode(string s)
classAssembler vector<SemanticUnit *> units Assembler(vector<SemanticUnit *> units) map<unsigned int, hostUInt8> run() ByteLine *encodeOperation(SemanticUnit *op, pc) int getGprNum(string id) classOperation funcsim set(...) encode()
Результаты Реализованы команды пересылки данных Для генерации образа памяти используется код funcsim исходный код образ памяти 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