| Итак, начнём с того, что давным-давно люди сделали
процессор, который работал только с битами, программы писались в
машинных кодах, что-то типа: 0010010010 и т.д. Позже программисты
придумали HEX-коды, что-то промежуточное между тем, что понятно человек
и процессору, то есть что-то близкое к машинным кодам, но более
понятное программисту. Позже были придуманы компиляторы. Это программы
которые читали человеческие слова и переводили их в биты(машинные
кода). То есть с помощью компиляторов из исходного кода получался
исполняемый файл. Это были первые компиляторы ассемблера. Позже начали
появляться всякие: basic, pascal, C, C++, Delphi и т.д. 
 Любую программу можно представить в виде ассемблерного кода, этим
занимаются программы – дизассемблеры, про которые мы поговорим в
следующей статье. А пока я хотел - бы рассказать основы ассемблера
(основные команды и т.д.), поэтому вы должны хоть чуть-чуть понимать в
программирование иначе материал будет очень трудный для восприятия.
 Регистры:
 Регистры это места в оперативной памяти, где могут храниться какие-либо
данные, можно сказать что регистры – это некие переменные. Регистры,
которые важны для нас это: EAX, EBX, ECX, EDX. Буква “E” вначале имени
регистра означает, что он является 32-разрядным.
 
 Push и Pop:
 Команда Push используется для помещения адреса в стэк.
 Команда Pop обратная команде Push.
 
 Стэк можно представить себе как некоторую стопку листов, где верхний
лист берётся первым. Вообще он является участками памяти, начало
которого на потолке и имеет смещение 0xFFFFFFFF, и всё что мы будем
добавлять будет добавляться снизу:
 
 0xFFFFFFFF Начало стэка.
 0xFFFFFFFC Занесли некоторые данные.
 0xFFFFFFF8 Занесли некоторые данные.
 0xFFFFFFF4 Занесли некоторые данные.
 0xFFFFFFF0 Занесли некоторые данные.
 … и т.д.
 Стэк растёт к меньшему адресу.
 
 Рассмотрим пример:
 PUSH EAX - мы положили в стэк верхним значение регистра EAX
 POP EAX - мы вытащили со стэка последние положенные данные.
 
 Call:
 Команда Call выполняет функцию по нужному адресу.
 Пример: Call: 10284354, будет выполнена функция по адресу 10284354.
 
 RET:
 Команда RET используется для возврата из функции.
 Например, нам нужно выполнить какую – либо функцию, а потом вернутся на
место где она вызывалась и продолжить выполнение программы:
 
 Mov:
 Копирует байт или значение слова из источника в конечную точку.
 Пример: Mov EAX, 00000002 – копирует в регистр EAX, значение: 2
 Mov EAX, EBX – копирует в регистр EAX значение регистра EBX.
 
 CMP:
 ОЧЕНЬ важная программа для взломщиков, используется в программе для
сравнения чего – либо (например, серийного номера :) ) После сравнения
устанавливается флажок (0 или 1). Флажки очень похожи на PASCAL’евские
переменные типа: BOOLEAN, которые принимают значения TRUE и FALSE.
 Пример: CMP EAX, 123 – сравнение значение регистра EAX со значением
123, и если они равны флажок устанавливается в значение: 1(или TRUE,
как кому нравится).
 
 JMP:
 Команда эквивалентна Pascal’евскому GOTO, переход в заданный адрес.
 Пример: JMP 30385678, переход по адресу: 30385678.
 
 JMP – безусловный переход.
 
 Имеются некоторые разновидности этой программы:
 JZ - Переход, если флажок Z установлен.
 JNZ - Переход, если флажок Z не установлен.
 Так же существуют другие команды перехода: JNE, JE, JG и т.д.
 
 Рассмотрим пример:
 CMP EAX, 123456 - сравнить реальный номер, содержащийся в регистре EAX и нами введенный.
 JNE EXIT - если они Не Равны, тогда выходим.
 
 NOP:
 Команда NOP не выполняет никаких действий.
 
 
 Я постарался дать основные знания ассемблера, и дать их в понятной форме. .
 XhackX |