В C убедитесь, что количество инструкций по сборке фиксировано для нескольких разделов кода - PullRequest
0 голосов
/ 18 июля 2011

В виртуальной машине, которую я пишу, я хочу иметь возможность отправлять команды способом, подобным следующему псевдокоду.

add: reg[memory[pc+1]] =  reg[memory[pc+1]] + reg[memory[pc+2]]; pc += 2; goto done;
sub: reg[memory[pc+1]] =  reg[memory[pc+1]] - reg[memory[pc+2]]; pc += 2; goto done;
cmp: /* Would take more space than simply x = x + y; */ goto done;

for(int pc = 0; memory[pc] != END; pc++) {
    goto currentPositionInMemorySomehow + (memory[pc] * lengthOfInstruction);
    done:
}

Где память - это массив, содержащий байт-код, и pcсчетчик программ.Однако для этого требуется, чтобы каждая из этих позиций, к которой мы переходим, имела одинаковое количество инструкций перед следующим блоком.Переход к сборке невозможен, если только не существует замечательного кода сборки, независимого от платформы, который позволяет взять один и тот же код и скомпилировать его для Linux, Mac и Windows.Независимо от процессора каждый сидит на вершине.Любая помощь будет высоко ценится.

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Хотя я не знаю способа достижения именно того, что вам нужно (и единственный известный мне компилятор, который позволяет вычисляемые переходы, это gcc), я предлагаю вам просто использовать switch, который преобразует большинство приличных оптимизирующих компиляторов.либо в таблицу переходов, либо в вычисленный переход, правильно обрабатывая выравнивание инструкций способом, подходящим для вашей платформы.

2 голосов
/ 18 июля 2011

Вы, кажется, хотите написать некоторый код на C, который будет компилироваться в исполняемый код размера, который не зависит от целевой платформы. Это просто нереальная цель.

...