![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
xds |
![]()
Сообщение
#1
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Несколько примеров под 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. В дополнение - маленький пример, как это работает... Прикрепленные файлы ![]() -------------------- The idiots are winning.
|
![]() ![]() |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
К счастью, все не так уж плохо. В некоторых архитектурах встречаются инструкции условного пропуска следующих за ними инструкций. Так в AVR RISC это команды SBIC/SBIS (Skip if Bit in I/O register is Cleared/Set) и SBRC/SBRS (Skip if Bit in Register is Cleared/Set). Следует отметить, что в AVR слово состояния процессора доступно как регистр ввода/вывода, поэтому эта архитектура является реально существующей реализацией рассмотренного тобой случая.
Впрочем, архитектуры с ортогональной системой команд (в основном RISC-процессоры и их RISC-подобные предшественники, exempli gratia, LSI-11) всегда отличались ощутимо большей долей рациональности, чем классические CISC-семейства - постепенно распухающие от объема устаревших инструкций и сгибающиеся под весом новых (в "родимом" x86 легко обнаруживаются следы i8080, и даже i8008, не говоря уж о том, что Pentium 4 до сих пор полноценно поддерживает 16-битный реальный режим). К слову, RISC-архитектуры легко справляются с проблемами "накопления совместимости" путем разумного использования исключений для программной эмуляции устаревших инструкций. -------------------- The idiots are winning.
|
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 4:34 |