LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

Добавим безусловных циклов, чтоб пример anonymous-а с зависанием был

#include <cstddef>
#include <cassert>

using Reg = size_t;

enum Op : Reg {
    HLT = 0,
    PLS = 1,
    DBL = 2
};

Op JMP(Reg label) {
    return Op(label + 3);
}

Reg label(Op op) {
    assert(op >= 3);
    return op - 3;
}

Reg run(const Op code[]) {

    for (Reg i = 0, reg = 0;;)
        switch (code[i]) {
        case HLT:
            return reg;
        case PLS:
            ++reg;
            ++i;
            break;
        case DBL:
            reg *= 2;
            ++i;
            break;
        default: // JMP
            i = label(code[i]);
            break;
        }

}

int main() {

    const Op code[] = { PLS, DBL, JMP(5), DBL, HLT, PLS, DBL, JMP(3) };

    return run(code);

}

Теперь трейсинг control flow с накоплением инструкций не прокатит, так как control flow может продолжаться сколько угодно долго.

Исходная версия quasimoto, :

Добавим безусловных циклов, чтоб пример anonymous-а с зависанием был

#include <cstddef>
#include <cassert>

using Reg = size_t;

enum Op : Reg {
    HLT = 0,
    PLS = 1,
    DBL = 2
};

Op JMP(Reg label) {
    return Op(label + 3);
}

Reg label(Op op) {
    assert(op >= 3);
    return op - 3;
}

Reg run(Op code[]) {

    for (Reg i = 0, reg = 0;;)
        switch (code[i]) {
        case HLT:
            return reg;
        case PLS:
            ++reg;
            ++i;
            break;
        case DBL:
            reg *= 2;
            ++i;
            break;
        default: // JMP
            i = label(code[i]);
            break;
        }

}

int main() {

    Op code[] = { PLS, DBL, JMP(5), DBL, HLT, PLS, DBL, JMP(3) };

    return run(code);

}

Теперь трейсинг control flow с накоплением инструкций не прокатит, так как control flow может продолжаться сколько угодно долго.