MDSP Assembler (in Russian)

advertisement
Ассемблер для 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
Спасибо за внимание!
Download