|
28.02.2009, 07: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 в 17:11.
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
28.02.2009, 16: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, 05: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, 05: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, 07:39
|
#29
|
|
|
|
Разведчик
|
Регистрация: 23.11.2009
Сообщений: 10
Популярность: 146
Сказал(а) спасибо: 6
Поблагодарили 41 раз(а) в 20 сообщениях
|
Re: Экскурс в команды ассемблера
Кстати по поводу pushad-ов и popad-ов. Они далеко не восстанавливают равновесие в самом стеке, потому при вхождении в нестабильную секцию(где есть функции которые могут оставить в стеке что то свое - например входные параметры) лучше сохранить ESP в какой ни будь переменной и восстановить в конце процедуры.
Для примера:
PHP код:
proc TestFunc mov dword[oldESP],esp pushad ;А здесь код. popad mov esp,dword[oldESP] ret endp
|
|
|
Пользователь сказал cпасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 16:31.
|
|