|  | 
	
	
		
	
	
    
        |  28.02.2009, 08:57 | #16 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
 
            
               
    Команда JCXZ - переход если ECX==0Семантика:
 JCXZ r32/m32
 Передает управление коду по адресу в операнде
 если ECX==0
 MOV ECX,20h
 cycle:
 MOV EAX,[DDVar+ECX]
 DEC ECX
 JCXZ cEND
 JMP cycle
 cEND:
 Вот простой цикл на 20h итераций с использованием этой команды.
 Также может быть например такая ситуация:
 MOV EAX,[Var] ; Число которое сравнивают с нужным
 MOV ECX,[DesVar] ; Число с которым будут сравнивать
 SUB ECX,EAX
 JCXZ DesAddr ;Если число оказалось равным, нужному - переход на адрес DesAddr.
 
 Команда RET - возврат из подпрограммы(процедуры/функции)
 Семантика:
 RET
 Адрес возврата берется из стека.
 Команда можно интерпретировать так:
 POP EAX
 JMP EAX
 
 Команда CALL - вызов подпрограммы(процедуры/функции)
 Семантика:
 CALL ProcName/ProcAddr/m32/r32
 Команду можно интерпретировать так:
 PUSH EIP
 JMP ProcName/ProcAddr
 
                
 
                        Последний раз редактировалось Ivan_32; 28.02.2009 в 18:11.
                    
                    
                
             |  
    |  |   |  
	
		
			| 5 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  28.02.2009, 17:54 | #17 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
 
            
               
    Команда JS - переход если результат последнейарифметической операции отрицательный
 Семантика:
 JS r32/m32
 Передает управление коду по адресу в операнде
 если реузльтат последней арифметической операции отрицательный. Иными словами если SF=1.
 MOV EAX,10h
 SUB EAX,20h
 JS 00010000h
 При такой последовательности команд управление будет передано коду по адресу 10000h
 
 Команда JNS - переход если результат последней
 арифметической операции не отрицательный.
 Семантика:
 JNS r32/m32
 Передает управление коду по адресу в операнде
 если реузльтат последней арифметической операции не отрицательный. Иными словами если SF=0.
 MOV EAX,10h
 ADD EAX,20h
 JNS 00010000h
 При такой последовательности команд управление будет передано коду по адресу 10000h
 
                
 
                        Последний раз редактировалось Ivan_32; 20.06.2009 в 15:25.
                    
                    
                
             |  
    |  |   |  
	
		
			| 4 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  09.03.2009, 06:16 | #18 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
 
            
               
    Основные конструкции кода: 
 Конструкция IF
 Пример:
 cmp eax,0
 jne lab
 ;тут расположен код который выполнится если eax==0
 lab:
 
 Конструкция IF ELSE
 Пример:
 cmp eax,0
 je lab
 ;Тут находятся инструкции которые должны выполнится если eax==0
 jmp labEnd ;этот переход сделан что бы не началось выполнение кода после метки lab.
 lab:
 ;А тут инструкции которые должны выполнится если eax!=0
 labEnd:
 ;Это точка выхода из данной конструкции.
 
 Конструкция WHILE
 Пример:
 mov ecx,100
 cycle:
 ;Тело цикла
 dec ecx
 cmp ecx,0
 jne cycle
 
 |  
    |  |   |  
	
		
			| 5 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  09.03.2009, 06:31 | #19 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                  
 
            
               
    Процедура перевода бинарных данных в HexText. buff0 - двойное слово DWORD. Адрес буфера источника.
 buff1 - двойное слово DWORD. Адрес буфера применика.
 bLen - двойное слово DWORD. Количество переводимых данных(в байтах).
 Требования к аргументам:
 1. buff0 и buff1 должны быть двойными словами, в которых находятся адреса выделенной памяти.
 2. Обьем выделнной для второго буфера памяти должен быть в 2 раза больше чем для первого.
 
 proc _Hex2Text buff0,buff1,bLen
 pushad
 xor eax,eax
 xor ebx,ebx
 xor ecx,ecx
 xor edx,edx
 aCycle:
 xor eax,eax
 pushad
 mov ebx,[buff0]
 mov ah,byte[ebx+ecx]
 ;----------------->
 shr ah,4
 cmp ah,9
 ja charA
 add ah,30h
 jmp endA
 charA:
 add ah,37h
 endA:
 ;----------------->
 mov ebx,[buff1]
 mov byte[ebx+edx],ah
 ;==================>
 mov ebx,[buff0]
 mov ah,byte[ebx+ecx]
 ;----------------->
 and ah,00001111b
 cmp ah,9
 ja charB
 add ah,30h
 jmp endB
 charB:
 add ah,37h
 endB:
 ;----------------->
 mov ebx,[buff1]
 mov byte[ebx+edx+1],ah
 popad
 inc ecx
 inc edx
 inc edx
 cmp ecx,[bLen]
 jne aCycle
 popad
 ret
 endp
 
 |  
    |  |   |  
	
		
			| 5 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 13:22 | #20 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команда SLD - установка флага направления DFСемантика:
 SLD
 Команда SLD устанавливает флаг DF в состояние 1.
 Пример:
 SLD
 После выполнения этой команды флаг DF будет установлен в состояние 1, что повлияет на работу
 команд серий MOVSx STOSx и LODSx.
 
 Команда СLD - снятие флага направления DF
 Семантика:
 СLD
 Команда СLD устанавливает флаг DF в состояние 0.
 Пример:
 CLD
 После выполнения этой команды флаг DF будет установлен в состояние 0, что повлияет на работу
 команд серий MOVSx STOSx и LODSx.
 
 
                
 
                        Последний раз редактировалось Ivan_32; 20.06.2009 в 15:27.
                    
                    
                
             |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 13:29 | #21 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команды LODSB/LODSW/LODSD - пересылка данныхСемантика:
 LODSB
 LODSW
 LODSD
 Команды загружают значение из памяти по адресу, который хранится в регистре ESI, регистры
 AL(LODSB), AX(LODSW), EAX(LODSD) соответственно. При выполнении команды, значение в ESI инкрементируется или декрементируется
 в зависимости от значение флага DF=Direction Flag. Если DF=0 то ESI будет декрементироватся каждый раз при выполнении команды LODSx
 (х = B/W/D).
 
 Аналоги на основе MOV:
 
 LODSB:
 MOV AL,BYTE[ESI]
 if(DF=0)
 {
 ADD ESI,1
 }
 else
 {
 SUB ESI,1
 }
 
 LODSW:
 MOV AX,WORD[ESI]
 if(DF=0)
 {
 ADD ESI,2
 }
 else
 {
 SUB ESI,2
 }
 
 LODSD:
 MOV EAX,DWORD[ESI]
 if(DF=0)
 {
 ADD ESI,4
 }
 else
 {
 SUB ESI,4
 }
 
 Пример использования:
 MOV ESI,szString
 LODSB  ;В AL сейчас находится первый байт строки.
 
 MOV ESI,szString
 LODSB  ;В AX сейчас находится первое слово строки.
 
 MOV ESI,szString
 LODSB  ;В EAX сейчас находится первое двойное слово строки.
 
 |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 13:59 | #22 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команды STOSB/STOSW/STOSD - загрузка данных в памятьСемантика:
 STOSB
 STOSW
 STOSD
 Команды загружают значения которые находятся соответственно в AL(STOSB),AX(STOSW),EAX(STOSD) в память по адресу, который находится в EDI.
 При выполнении команды, значение в EDI инкрементируется или декрементируется
 в зависимости от значение флага DF=Direction Flag. Если DF=0 то EDI будет декрементироватся каждый раз при выполнении команды STOSx
 
 Аналоги на основе MOV:
 STOSB:
 MOV BYTE[EDI],AL
 if(DF=0)
 {
 ADD EDI,1
 }
 else
 {
 SUB EDI,1
 }
 
 STOSW:
 MOV WORD[EDI],AX
 if(DF=0)
 {
 ADD EDI,2
 }
 else
 {
 SUB EDI,2
 }
 
 STOSD:
 MOV DWORD[EDI],EAX
 if(DF=0)
 {
 ADD EDI,4
 }
 else
 {
 SUB EDI,4
 }
 
 Пример использования:
 MOV EDI,szString
 STOSB  ;В памяти по адресу EDI находится байт взятый из AL
 MOV EDI,szString
 STOSW  ;В памяти по адресу EDI находится слово взятое из AX
 MOV EDI,szString
 STOSD  ;В памяти по адресу EDI находится двойное слово взятое из EAX
 
 
                
 
                        Последний раз редактировалось Ivan_32; 22.04.2009 в 14:02.
                    
                    
                
             |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 14:36 | #23 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команды SCASB/SCASW/SCASD - сравнение данныхСемантика:
 SCASB
 SCASW
 SCASD
 Команды сравнивают значение в регистре AL(SCASB),AX(SCASW),EAX(SCASD) соответственно с значением находящимся в памяти по адресу в регистре EDI. Команды аналогичны команде CMP.
 При выполнении команды, значение в EDI инкрементируется или декрементируется
 в зависимости от значение флага DF=Direction Flag. Если DF=0 то EDI будет декрементироватся каждый раз при выполнении команды SCASx
 
 Аналоги на основе CMP:
 
 SCASB:
 CMP AL,BYTE[EDI]
 if(DF=0)
 {
 ADD EDI,1
 }
 else
 {
 SUB EDI,1
 }
 
 SCASW:
 CMP AX,WORD[EDI]
 if(DF=0)
 {
 ADD EDI,2
 }
 else
 {
 SUB EDI,2
 }
 
 SCASD:
 CMP EAX,DWORD[EDI]
 if(DF=0)
 {
 ADD EDI,4
 }
 else
 {
 SUB EDI,4
 }
 
 Пример использования:
 MOV EDI,szString
 SCASB ;Сравнивается AL с байтом по адресу EDI
 MOV EDI,szString
 SCASW ;Сравнивается AX с словом по адресу EDI
 MOV EDI,szString
 SCASD ;Сравнивается EAX с двойным словом по адресу EDI
 
 |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 15:12 | #24 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команды MOVSB/MOVSW/MOVSD - пересылка данныхСемантика:
 MOVSB
 MOVSW
 MOVSD
 Команды пересылают Байт,слово и двойное слово соответсвенно из памяти по адресу ESI в память по адресу EDI.
 В зависимости от значения флага DF, ESI и EDI либо инкрементируются после выполнения команды(DF=0) или же декрементируются(DF=1).
 
 Аналоги на основе MOV:
 
 MOVSB:
 MOV AL,BYTE[ESI]
 MOV BYTE[EDI],AL
 if(DF=0)
 {
 ADD EDI,1
 ADD ESI,1
 }
 else
 {
 SUB ESI,1
 SUB EDI,1
 }
 
 MOVSW:
 MOV AX,WORD[ESI]
 MOV WORD[EDI],AX
 if(DF=0)
 {
 ADD EDI,2
 ADD ESI,2
 }
 else
 {
 SUB ESI,2
 SUB EDI,2
 }
 
 MOVSD:
 MOV EAX,DWORD[ESI]
 MOV DWORD[EDI],EAX
 if(DF=0)
 {
 ADD EDI,4
 ADD ESI,4
 }
 else
 {
 SUB ESI,4
 SUB EDI,4
 }
 
 Пример использования:
 MOV ESI,szStr0
 MOV EDI,szStr1
 MOVSB ;Пересылается байт из szStr0 в szStr1
 
 MOV ESI,szStr0
 MOV EDI,szStr1
 MOVSW ;Пересылается слово из szStr0 в szStr1
 
 MOV ESI,szStr0
 MOV EDI,szStr1
 MOVSD ;Пересылается двойное слово из szStr0 в szStr1
 
 
                
 
                        Последний раз редактировалось Ivan_32; 22.04.2009 в 15:19.
                    
                    
                
             |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  22.04.2009, 15:18 | #25 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команды CMPSB/CMPSW/CMPSD - сравнение данныхСемантика:
 CMPSB
 CMPSW
 CMPSD
 Команды сравнивают байты, слова или двойные слова соотвественно по адресам в ESI и EDI соотвественно.
 В зависимости от значения флага DF, ESI и EDI либо инкрементируются после выполнения команды(DF=0) или же декрементируются(DF=1).
 
 Аналоги на основе CMP:
 
 CMPSB:
 MOV AL,BYTE[ESI]
 CMP BYTE[EDI],AL
 if(DF=0)
 {
 ADD EDI,1
 ADD ESI,1
 }
 else
 {
 SUB ESI,1
 SUB EDI,1
 }
 
 CMPSW:
 MOV AX,WORD[ESI]
 CMP WORD[EDI],AX
 if(DF=0)
 {
 ADD EDI,2
 ADD ESI,2
 }
 else
 {
 SUB ESI,2
 SUB EDI,2
 }
 
 CMPSD:
 MOV EAX,DWORD[ESI]
 CMP DWORD[EDI],EAX
 if(DF=0)
 {
 ADD EDI,4
 ADD ESI,4
 }
 else
 {
 SUB ESI,4
 SUB EDI,4
 }
 
 Пример использования:
 MOV ESI,szStr0
 MOV EDI,szStr1
 CMPSB ;Сравнивается байт из szStr0 c байтом в szStr1
 
 MOV ESI,szStr0
 MOV EDI,szStr1
 CMPSW ;Сравнивается слово из szStr0 c словом в szStr1
 
 MOV ESI,szStr0
 MOV EDI,szStr1
 CMPSD ;Сравнивается двойное слово из szStr0 c двойным словом в szStr1
 
 |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  23.04.2009, 09:00 | #26 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Префикс REP - безусловный повтор командыСемантика:
 REP commmand
 Префикс повторяет команду заданное количество итерация, это число хранится в ECX.
 Пример использования:
 CLD
 MOV ESI,szSourceString
 MOV EDI,szDestinationString
 MOV ECX,10
 REP MOVSB
 На данном участке кода, из памяти по адресу szSourceString, переписываются 10 байт, в память по адресу szDestinationString.
 Данный префикс удобен для циклического копирования данных(как и показано в примере). Так же можно посмотреть такой пример:
 CLD
 MOV AL,0
 MOV EDI,pMem
 MOV ECX,1000h
 REP STOSB
 Данный код заполняет 1000h байт по адресу pMem, значениями из AL.
 
 
 Префикс REPE - условный повтор команды пока флаг ZF=1
 Семантика:
 REPE command
 Префикс повторяет команду, до тех пор пока, ZF=1 или проще говоря, до тех пор пока результат последнего сравнения положительный - до тех пор пока равно.
 В ECX содержится максимальное количество итераций.
 Пример:
 CLD
 MOV EDI,szStr
 MOV AL,'A'
 MOv ECX,0FFFFFFFFh
 REPE SCASB
 SUB EDI,szStr
 После выполнения кода в EDI будет записано количество подряд идущих букв 'A' в памяти по адресу szStr.
 Тоесть, если допустим в памяти по этом адресу содержится такие значение "AAAAAFGAAA" то код прочтет первые 5 букв 'A' и прекратит выполнение.
 Так как ZF после следущего сравнения установится в 0.
 
 Префикс REPNE - условный повтор команды пока флаг ZF=0
 Семантика:
 REPNE command
 Префикс повторяет команду, до тех пор пока, ZF=0 или проще  говоря до тех пор пока не равно.
 В ECX содержится максимальное количество итераций.
 Пример:
 CLD
 MOV EDI,szStr
 MOV AL,'F'
 MOV ECX,0FFFFFFFFh
 REPNE SCASB
 Данный код найдет в памяти по адресу szStr символ 'F', в EDI будет содержатся его адрес.
 
 |  
    |  |   |  
	
		
			| 2 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  25.04.2009, 23:29 | #27 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команда LOOP - повтор блока команд без условийСемантика:
 LOOP Addres
 Команда повторят блок команд с адреса в аргументе, до текущего адреса, ECX - раз.
 Пример:
 MOV ECX,10
 looper:
 MOV BYTE[EDX+ECX],AH
 ADD EDX,1000h
 LOOP looper
 Данный код повторит блок инструкций 10 раз с метки looper по адрес команды.
 
 
 Команда LOOPE - повтор блока команд пока равно
 Семантика:
 LOOPNE Addres
 Команда повторят блок команд с адреса в аргументе, до текущего адреса, ECX - раз, пока ZF=1 или пока равно.
 Пример:
 MOV ECX,100
 MOV ESI,szStr0
 MOV EDI,szStr1
 looper:
 MOV AH,byte[ESI]
 MOV AL,byte[EDI]
 CMP AH,AL
 LOOPE looper
 Данный код повторит блок инструкций 100 раз с метки looper по адрес команды, но только пока ZF=1
 Цикл поелезн когда нужно определить длину последовательности одинаковых байт в памяти.
 
 Команда LOOPNE - повтор блока команд пока не равно
 Семантика:
 LOOPE Addres
 Команда повторят блок команд с адреса в аргументе, до текущего адреса, ECX - раз, пока ZF=0 или пока не равно.
 Пример:
 MOV ECX,100
 MOV ESI,szStr0
 MOV EDI,szStr1
 looper:
 MOV AH,byte[ESI]
 MOV AL,byte[EDI]
 CMP AH,AL
 LOOPNE looper
 Данный код повторит блок инструкций 100 раз с метки looper по адрес команды, но только пока ZF=0.
 Цикл полезен когда нужно найти байт в памяти.
 
 
                
 
                        Последний раз редактировалось Ivan_32; 20.06.2009 в 15:28.
                    
                    
                
             |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  26.04.2009, 00:31 | #28 |  
    | 
  
    |  |  
    |  |  |  
    |     Капитан |    
            
                 Регистрация: 14.05.2008
                 Сообщений: 253
                 Популярность: 1015  
	 Сказал(а) спасибо: 666
		
			
				Поблагодарили 451 раз(а) в 173 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Команда PUSHAD - сохранить все основные регистры в стекеСемантика:
 PUSHAD
 Сохраняет регистры ESI EDI EBP EBX EDX ECX EAX в стеке(именно в таком порядке)
 Пример:
 PUSHAD
 POP [reg.EAX]
 POP [reg.ECX]
 POP [reg.EDX]
 POP [reg.EBX]
 POP [reg.NULL]
 POP [reg.EBP]
 POP [reg.EDI]
 POP [reg.ESI]
 Данный код сохранит все регистры общего назначение(они приведены выше) в  импровизированную структуру reg.
 Дабы не возникало вопросов что и как, приведу примерный вид этой структуры.
 struc REGISTERS
 {
 .EAX dd ?
 .ECX dd ?
 .EDX dd ?
 .EBX dd ?
 .NULL dd ?
 .EBP dd ?
 .EDI dd ?
 .ESI dd ?
 }
 Примечание:
 Между ESI EDI EBP и EBX EDX ECX EAX выполнении команды загружается двойное слово - оно нулевое, в данном случае NULL
 это ненужная переменая значение которой можно сбросить, иначе говоря это просто что бы пропустить это двойное слово.
 
 
 Команда POPAD - выгрузить из стека все регистры основного назначения
 Семантика:
 POPAD
 Выгружает из данные из стека в регистры EAX EDI EBP EBX EDX ECX EAX (именно в таком порядке).
 Пример:
 CLD
 MOV ECX,8
 MOV ESI,reg
 MOV EDI,ESP
 REP MOVSB
 POPAD
 Загружаем в память содержимое структуры REGISTERS и вытаскиваем это из стека командой POPAD
 
 
                
 
                        Последний раз редактировалось Ivan_32; 26.04.2009 в 01:44.
                    
                    
                
             |  
    |  |   |  
	
		
			| 3 пользователя(ей) сказали cпасибо: |  |  
	
		
	
	
    
        |  11.12.2009, 08:39 | #29 |  
    | 
  
    |  |  
    |  |  |  
    |     Разведчик |    
            
                 Регистрация: 23.11.2009
                 Сообщений: 10
                 Популярность: 146  
	 Сказал(а) спасибо: 6
		
			
				Поблагодарили 41 раз(а) в 20 сообщениях
			
		
	   | 
                 Re: Экскурс в команды ассемблера 
 
            
               
    Кстати по поводу pushad-ов и popad-ов. Они далеко не восстанавливают равновесие в самом стеке, потому при вхождении в нестабильную секцию(где есть функции которые могут оставить в стеке что то свое - например входные параметры) лучше сохранить ESP в какой ни будь переменной и восстановить в конце процедуры.  
Для примера:
 
	PHP код: 
		
			
proc TestFuncmov dword[oldESP],esp
 pushad
 ;А здесь код.
 popad
 mov esp,dword[oldESP]
 ret
 endp
 
 |  
    |  |   |  
	
		
			| Пользователь сказал cпасибо: |  |  
	
		
	
	
	
		
	
	
	
	
Заявление об ответственности / Список мошенников
	| 
	|  Ваши права в разделе |  
	| 
		
		Вы не можете создавать новые темы Вы не можете отвечать в темах Вы не можете прикреплять вложения Вы не можете редактировать свои сообщения 
 HTML код Выкл. 
 |  |  |  Часовой пояс GMT +4, время: 20:40. |  |