![]() |
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.
|
![]() ![]() |
P@sh@ |
![]()
Сообщение
#2
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
xds
но ведь щас вроде как везде RISC-архитектура используется... я помню, первый раз увидел это слово (аббревиатуру) в описании первых AMD-процессоров... интересно, а можно программировать напрямую на микрокоде, в обход "интерпретатора" команд х86 ? |
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 0:29 |