Как эффективно реализовать директиву ORIGIN на ассемблере в моем гипотетическом наборе команд? - PullRequest
1 голос
/ 17 апреля 2020

Я строю ассемблер как задание колледжа для реализации гипотетического набора инструкций. В наборе есть директива под названием 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, что, я думаю, невозможно при мысли, которой я следовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...