1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
| xds |
6.08.2004 1:46
Сообщение
#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] где a - bx,bp или константа; b - si, di или константа; r - любой регистр общего назначения. Примечание: кстати, многие ассемблеры автоматически заменяют "lea r,label" на "mov r,offset label" исходя из соображений, что настоящая инструкция "lea" в данном случае займет 4 байта, а "mov" - только 3. (4) Загрузка константы в сегментный регистр: mov ax,0A000h ; -> push 0A000h Примечание: "push <константа>" появилась в системе команд x86 начиная с I80186. (5) Получение адреса элемента массива по его индексу: mov ax,ELEM_SIZE ; -> mov ax,ELEM_SIZE где ELEM_SIZE - размер элемента массива, index (регистр общего назначения или переменная в памяти) - индекс элемента, адрес которого нас интересует. (6) Для особо ярых поклонников x86 и команд push/pop: Если на входе в процедуру (или другой участок кода, от которого требуется сохранять, а затем восстанавливать значения некоторых регистров) сохраняется больше одного регистра, то последовательность "push"'ей можно заменить на "pusha", а "pop"'ов - на команду со звучным названием "popa". Примечание: кстати, RISC-процессор SPARC при обращении к процедурам в большинстве случаев прекрасно обходится без технологии "толкай-тяни" благодаря использованию регистрового файла со скользящим окном, который в частности выполняет функции стека вызовов - в нем сохраняются адреса возврата, передаются параметры и хранятся локальные переменные. May be continued... ;) P.S. В дополнение - маленький пример, как это работает... Прикрепленные файлы
flag.zip ( 1.44 килобайт )
Кол-во скачиваний: 1280-------------------- The idiots are winning.
|
![]() ![]() |
| Atos |
30.09.2004 12:13
Сообщение
#2
|
|
Прогрессор ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: 9 |
Вместо команды mov ax, 0 ,занимающей в памяти 5 байт, можно написать xor ax, ax , занимающую 1 байт. Хотя, это, наверное, общеизвестный факт, или нет? {Нам на лекции рассказали}
|
xds Приемы уменьшения размера ассемблерного кода 6.08.2004 1:46
Анна ...ещё достигается хорошая оптимизация при примене... 28.09.2004 23:29
Shadow Анна
на степени двойки 28.09.2004 23:36
P@sh@ Я еще со времен ПК8000 (на проце К580) задумывался... 29.09.2004 10:23
xds К счастью, все не так уж плохо. В некоторых архите... 29.09.2004 16:20
xds
В x86/real mode - 3 байта... 30.09.2004 14:16
xds Существует на удивление много способов применения ... 30.09.2004 15:15
P@sh@ xds
но ведь щас вроде как везде RISC-архитектура ... 1.10.2004 8:09
xds
Я имел в виду полноценные RISC-процессоры (SPARC,... 5.10.2004 14:28![]() ![]() |
|
Текстовая версия | 3.11.2025 23:14 |