IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Приемы уменьшения размера ассемблерного кода
сообщение
Сообщение #1


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Несколько примеров под x86/real mode...

Примечание: далее под словосочетанием "регистр общего назначения" подразумевается один из регистров: ax, bx, cx, dx, si, di, sp, bp.

(1) Классика:
mov r,0 ; -> xor r,r

где r - регистр общего назначения;

Примечание: "бородатый" прием, получивший распространение в том или ином виде на многих архитектурах; в AVR он даже заслужил дополнительную мнемонику - "clr".

(2)
mov d,s ; -> xchg d,s

где d, s - регистры общего назначения;
замена применима в том случае, если значением s можно пожертвовать.

Примечание: на младших членах семейства x86 (I8088/I8086) инструкция "xchg" выполняется медленнее "mov".

(3)
mov r,a ; -> lea d,[a+b]
add r,b |

где
a - bx,bp или константа;
b - si, di или константа;
r - любой регистр общего назначения.

Примечание: кстати, многие ассемблеры автоматически заменяют "lea r,label" на "mov r,offset label" исходя из соображений, что настоящая инструкция "lea" в данном случае займет 4 байта, а "mov" - только 3.

(4) Загрузка константы в сегментный регистр:
mov ax,0A000h ; -> push 0A000h
mov es,ax     ;   pop es


Примечание: "push <константа>" появилась в системе команд x86 начиная с I80186.

(5) Получение адреса элемента массива по его индексу:
mov ax,ELEM_SIZE ; -> mov ax,ELEM_SIZE
mul index        ;   mul index
lea di,array     ;   add ax,offset array
add di,ax        ;   xchg di,ax

где
ELEM_SIZE - размер элемента массива,
index (регистр общего назначения или переменная в памяти) - индекс элемента, адрес которого нас интересует.

(6) Для особо ярых поклонников x86 и команд push/pop:
Если на входе в процедуру (или другой участок кода, от которого требуется сохранять, а затем восстанавливать значения некоторых регистров) сохраняется больше одного регистра, то последовательность "push"'ей можно заменить на "pusha", а "pop"'ов - на команду со звучным названием "popa".

Примечание: кстати, RISC-процессор SPARC при обращении к процедурам в большинстве случаев прекрасно обходится без технологии "толкай-тяни" благодаря использованию регистрового файла со скользящим окном, который в частности выполняет функции стека вызовов - в нем сохраняются адреса возврата, передаются параметры и хранятся локальные переменные.

May be continued... ;)

P.S. В дополнение - маленький пример, как это работает...


Прикрепленные файлы
Прикрепленный файл  flag.zip ( 1.44 килобайт ) Кол-во скачиваний: 392


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 7:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name