Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Программирование -> Assembler -> Оптимизация для pentium процессора


14. УМЕНЬШЕНИЕ ДЛИНЫ КОДА
=========================
Как объяснялось в разделе 6, размер кеша кода - 8Кб. Если у вас проблемы с
размещением критической части вашего кода в кеше, то вы можете рассмотреть
возможность уменьшения вашего кода.

32 битный код, обычно, длиннее 16 битного, поскольку адресные константы
занимают по 4 байта, а не по 2, как в 16 битном. Тем не менее 16 битный код
имеет другие недостатки, т.н. префиксы (напоминаю, что мы рассматриваем модель
FLAT. - прим. переводчика), или проблемы со смежными словами (см. раздел 10).
Однако далее мы обсудим некоторые другие способы уменьшения кода.

Многие адреса переходов, адреса данных и константы займут меньше места, если
они могут быть представлены как байт со знаком, т.е. они находятся в пределах
от -128 до +127.

Для переходов это будет означать, что инструкция займет на 2 байта меньше, а
ведь инструкции перехода за пределы 127 байт займут 5 байт для условного
перехода и 6 для безусловного.

Подобным образом, адреса данных займут меньший объем, если их можно выразить
как указатель и смещение в пределах -128..+127 байт.
Пример:
MOV EBX,DS:[100000] / ADD EBX,DS:[100004]          ; 12 байт
Уменьшено до:
MOV EAX,100000 / MOV EBX,[EAX] / ADD EBX,[EAX+4]   ; 10 байт

Преимущество использования указателей становиться очевидней, если вы
используете их много раз. Храня данные в стеке и используя EBP или ESP в
качестве указателя, вы сможете во много раз уменьшить размер вашего кода,
чем когда вы использовали статические позиции памяти и абсолютные адреса,
оговаривая конечно, что ваши данные должны быть в пределах 128 байт.
Использование PUSH и POP, для чтения временных данных всегда предпочтительней.

Константы данных, так же займут меньше места, если значение в пределах -128 и
+127 байт. Многие инструкции, с непосредственным значением операнда могут
быть короче, если операнд в пределах 127 байт. Например:
PUSH 200      ; 5 байт
PUSH 100      ; 2 байта

ADD EBX,128   ; 6 байт
SUB EBX,-128  ; 3 байта

Однако наиболее важная инструкция, с непосредственным значением операнда не
имеет такой формы. Пример:
MOV EAX, 1              ; 5 байт
XOR EAX,EAX / INC EAX   ; 3 байта
PUSH 1 / POP EAX        ; 3 байта

Если константа используется много раз, то, конечно, ее лучше загрузить в
регистр. Пример:
MOV DWORD PTR [EBX],0 / MOV DWORD PTR [EBX+4],0   ; 13 байт
XOR EAX,EAX / MOV [EBX],EAX / MOV [EBX+4],EAX     ;  7 байт

Есть и другие инструкции, с разными длинами. Следующие инструкции имеют длину -
1 байт, чем очень привлекательны: PUSH reg, POP reg, INC reg32, DEC reg32.
INC и DEC с 8 битным регистром занимают 2 байта, таким образом INC EAX будет
короче INC AL.

XCHG EAX,reg также однобайтная инструкция, таким образом она займет меньше
места, чем MOV EAX,reg однако она медленная и неспариваемая.

Некоторые инструкции меньше, в том случае, когда они используют регистр
аккумулятор, а не любой другой регистр. Например:
MOV EAX,DS:[100000]  короче чем  MOV EBX,DS:[100000]
ADD EAX,1000         короче чем  ADD EBX,1000

Инструкции с указателем займут на байт меньше, если у них только базовый
регистр (не ESP) и смещение, чем когда у них есть масштабирование индексного
регистра, или указатель и индексный регистр, или ESP в качестве базового
регистра. Пример:
MOV EAX,[array][EBX]  короче чем  MOV EAX,[array][EBX*4]
MOV EAX,[EBP+12]      короче чем  MOV EAX,[ESP+12]

Инструкции с EBP, в качестве базового регистра, без индекса, будут на один
байт больше, чем при использовании других регистров. Пример:
MOV EAX,[EBX]    короче чем  MOV EAX,[EBP],  но
MOV EAX,[EBX+4]  столько же  MOV EAX,[EBP+4].

Дальше



 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.