Ассемблер в Linux для программистов C: различия между версиями
Содержимое удалено Содержимое добавлено
Gribozavr (обсуждение | вклад) Отмена правки 43126 участника 78.106.86.158 (обсуждение) было правильно |
Gribozavr (обсуждение | вклад) →Конструкция switch: всё-таки была ошибка. Спасибо 78.106.86.158! Написал более подробное объяснение |
||
Строка 2799:
ja switch_compare
jmp *jump_table-
.section .rodata
Строка 2833:
</pre>
Заметьте, что промежуток начинается с числа 35, а не с 0. Для того, чтобы не производить вычитание 35 отдельной командой и не создавать массив, в котором от 0 до 34 идёт адреса метки default, сначала проверяется принадлежность числа промежутку [35; 39], а затем производится переход, но массив адресов считается размещённым на 35 двойных слов «ниже» в памяти (35 × 4 = 140). В результате получается, что адрес перехода считывается из памяти по адреса <code>jump_table - 35*4 + %eax*4 = jump_table + (%eax - 35)*4</code>. Выиграли одно вычитание.
Снова-таки, имеет смысл переставить некоторые части этого кода, если вы заранее знаете, какие значения вам придётся обрабатывать чаще всего.▼
▲
==== Пример: интерпретатор языка Brainfuck ====
|