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. 
					
		 | 
	
![]() ![]()  | 
	
| P@sh@ | 
			
			  29.09.2004 10:23
			
				 Сообщение
					#2				
			 
		 | 
	
| 
        	
        		 Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация:    2           	 | 
       
			
			 Я еще со времен ПК8000 (на проце К580) задумывался, а почему не сделали вместо команд условного перехода типа JNZ, JZ, JC и т.д. просто условия (в виде префиксов например): IFNZ <команда> - мне кажется, так было бы удобнее, так как частенько условие нужно лишь для выполнения одной команды (только представьте: IFNZ DEC AX), а из-за этого приходится делать переход... а переходы по условию выглядели бы так: IFZ JMP adr. Однако так никто никогда не делал, из чего я заключаю, что это гораздо сложнее сделать при существующих архитектурах процессоров? (другой вариант - никто не догадался ;) ) С другой стороны - есть же префиксы-циклы REPNZ и т.д.   
			
			
					
		 | 
	
 xds   Приемы уменьшения размера ассемблерного кода   6.08.2004 1:46
 
 Анна   ...ещё достигается хорошая оптимизация при примене...   28.09.2004 23:29
 
 Shadow   Анна 
на степени двойки   28.09.2004 23:36
 
 xds   К счастью, все не так уж плохо. В некоторых архите...   29.09.2004 16:20
 
 Atos   Вместо команды mov ax, 0 ,занимающей в памяти 5 ба...   30.09.2004 12:13
 
 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![]() ![]()  | 
	
 
  | 
		Текстовая версия | 4.11.2025 4:51 |