Конструкция
A switch легче преобразовать в таблицу jump (or branch) . Это может сделать операторы переключения намного более эффективными, чем if-else , когда метки регистра находятся близко друг к другу. Идея состоит в том, чтобы последовательно поместить в память несколько инструкций перехода, а затем добавить значение в счетчик программ. Это заменяет последовательность инструкций сравнения операцией добавления.
Ниже приведены несколько чрезвычайно упрощенных примеров псевдо-сборки. Во-первых, версия if-else:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
Следующая версия коммутатора:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
Вы можете видеть, что полученный ассемблерный код гораздо более компактен. Обратите внимание, что значение должно быть преобразовано каким-либо образом для обработки значений, отличных от 1, 2 и 3. Однако это должно иллюстрировать концепцию.