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