Я строю ассемблер как задание колледжа для реализации гипотетического набора инструкций. В наборе есть директива под названием ORIGIN [address]
. Эта директива просто изменяет счетчик местоположения на указанный [адрес] точно так же, как this . Директива может принимать адрес либо как непосредственный операнд, либо как смещение относительно Label
. Я не могу эффективно закодировать это в мой ассемблер . Пожалуйста, помогите.
Я представлял, что это что-то в следующих строках:
1. It searches for the + sign
std::find(statement.back().begin(), statement.back().end(), '+')); //put it in if condition and compare
it with statement.back().end()
2. If the sign is present, then it gets 2 tokens:
auto line = const_cast<char*>(statement.back());
auto tok1 = strtok(line, "+");
auto tok2 = strtok(NULL, "\n");
long val1 = 0;
long val2 = 0;
for (const auto& row : SYMTAB) {
if(row.name == tok1) {
val1 = row.LC_val;
}
if(row.name == tok2) {
val2 = row.LC_val;
}
}
LOCCTR = va1 + val2;
3. If the sign is not present, then it searches the SYMTAB for the Label and gets the LC
auto tok = strtok(line,"\n");
for(const auto& row : SYMTAB) {
if(row.name == tok) {
LOCCTR = row.LC_val;
}
}
Что меня удивляет, так это то, как я буду различать непосредственный операнд и Метку с числом в нем.
Код также должен распознавать цепочку +
, такую как Label1+Label2+Label3+4
, что, я думаю, невозможно при мысли, которой я следовал.