Ассемблер в Linux для программистов C: различия между версиями

Содержимое удалено Содержимое добавлено
Отмена правки 43126 участника 78.106.86.158 (обсуждение) было правильно
→‎Конструкция switch: всё-таки была ошибка. Спасибо 78.106.86.158! Написал более подробное объяснение
Строка 2799:
ja switch_compare
 
jmp *jump_table-35140(,%eax,4)
 
.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 ====