#1 11-01-2007 10:41

Sanchez
Registered: 18-08-2006
Posts: 280

Краткое руководство по ассемблеру

В Sanny Builder для хранения данных используются переменные, в ассемблере данные можно хранить непосредственно в памяти или в регистрах. Основных регистров восемь: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP. Регистры EAX, EBX, ECX, EDX – можно использовать без ограничения для любых целей. Регистры ESI, EDI, ESP, EBP –  имеют более конкретное назначение и могут применяться для хранения всевозможных переменных, только когда они не используются по назначению.
Основной ассемблерной командой является MOV (пересылка данных) ее можно сравнить с оператором присвоения. Равенство:

$a = 16 
или
$a = 0x10

из Sanny Builder на языке ассемблера записывается примерно так:

MOV EAX, 10  ; ассемблер использует шестнадцатеричную систему счисления

Пересылать данные также можно из регистра в регистр:

MOV EAX, EBX ; записать в регистр EAX значение регистра EBX

Если мы хотим обратится к ячейки памяти, то ее адрес нужно заключить в квадратные скобки (указатель):

MOV EAX, [402000]  ; записать в регистр EAX значение по адресу 402000

MOV EAX, [EBX]	 ; записать в регистр EAX значение по адресу указанному в регистре EBX

MOV [402000], EAX  ; записать в ячейку памяти с адресом 402000 значение регистра EAX

MOV [EAX], EBX	 ; записать в ячейку памяти с адресом указанным в регистре EAX значение регистра EBX

Если необходимо, то к указателю можно добавить смещение:

MOV EAX, [EBX + 66]  ; записать в регистр EAX значение по адресу указанному в регистре EBX со смещением 66

MOV [EAX + 66], EBX  ; записать в ячейку памяти с адресом указанным в регистре EAX со смещением 66 значение регистра EBX

Для более удобного хранения данных можно использовать специальную область памяти, которая называется стек. Стек можно представить в виде списка или массива данных. Класть и забирать данные можно только с вершины стека. Таким образом, если в стек положить числа 1, 2, 3, то при чтении они будут получаться в обратном порядке – 3, 2, 1. Для работы со стеком служат команды PUSH и POP. PUSH кладет данные на верхушку стека, а POP снимает их оттуда. Пример:

PUSH 1  ; положить в стек число 1
PUSH 2  ; положить в стек число 2
PUSH 3  ; положить в стек число 3

После выполнения данных команд, стек будет выглядеть так:

3   ; число положенное в стек последним стало первым
2
1   ; число положенное в стек первым стало последним

Стек позволяет сохранять данные в памяти, не заботясь об их абсолютных адресах. Теперь рассмотрим более сложный пример:

MOV EAX, 1  ; записать в регистр EAX число 1, EAX = 1
MOV ECX, 2  ; записать в регистр ECX число 2, ECX = 2
PUSH EAX	; положить в стек значение регистра EAX, т.е. 1
PUSH EСX	; положить в стек значение регистра EСX, т.е. 2
POP EAX	 ; снять значение с верхушки стека и положить в регистр EAX, EAX = 2
POP EСX	 ; снять значение с верхушки стека и положить в регистр ECX, ECX = 1

Указатель на вершину стека хранится в регистре ESP:

PUSH 123456	 ; положить в стек число 123456
MOV EAX, [ESP]  ; записать в регистр EAX значение с верхушки стека, т.е. EAX = 123456

Для того чтобы складывать, вычитать или производить другие действия над двумя числами, одно число необходимо загрузить в регистр, а другое может быть как в регистре, так и в памяти. Рассмотрим основные математические операции.
Для сложения чисел служит команда ADD,  для вычитания SUB. Обе команды имеют одинаковый синтаксис:

ADD приемник, источник

SUB приемник, источник

Команда ADD складывает источник и приемник, сумму помещает в приемник. Команда SUB вычитает источник из приемника и помещает разность в приемник. Пример:

ADD EAX, 3  ; EAX = EAX + 3

SUB ECX, 5  ; ECX = ECX - 5

В Sanny Builder это выглядит так:

$eax += 3

$ecx -= 5

Для умножения чисел служит команда MUL, для деления DIV. Команды имеют следующий синтаксис:

MUL источник

DIV источник

Команда MUL умножает значение регистра EAX на источник, результат помещает в регистр EAX:

MOV EAX, 5  ; EAX = 5
MOV ECX, 7  ; ECX = 7
MUL ECX	 ; EAX = EAX * ECX = 5 * 7 = 23, ECX = 7

Команда DIV делит значение регистра EAX на источник, результат помещает в регистр EAX, остаток от деления в регистр EDX:

MOV EAX, 64  ; EAX = 64
MOV ECX, 3   ; ECX = 3
DIV ECX	  ; EAX = EAX / ECX = 64 / 3 = 21, ECX = 3, EDX = 1

Команды MUL и DIV применяются для умножения и деления чисел  без знака. Источник может быть регистром, ячейкой памятью, но не может быть числом.

Теперь переедем к условным переходам. Для осуществления условного перехода необходимо сравнить данные и в зависимости от результата перейди в нужную часть программы. Для сравнения используется команда CMP:

CMP приемник, источник

Команда сравнивает приемник с источником и сохраняет результат во флагах. Флаги – это биты специального регистра. Для перехода используют команды JNE или JE. JE перейдет, если источник с приемником равны, а JNE – если неравны. Пример:

CMP EAX, 5  ; сравниваем значение регистра EAX с числом 5
JE 402000   ; если EAX равно 5, то переходим по адресу 402000
MOV EAX, 1  ; если нет, записываем в регистр EAX число 1

Безусловный переход осуществляется командой JMP:

JMP 402000  ; перейти по адресу 402000

Чтобы вызвать функцию используют команду CALL:

CALL 402000  ; вызвать функцию по адресу 402000

CALL EAX	 ; вызвать функцию по адресу указанному в регистре EAX

CALL [EAX]   ; вызвать функцию по адресу указанному в ячейки памяти

Возврат из функции осуществляется командой RET.

Offline

#2 11-01-2007 17:42

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Краткое руководство по ассемблеру

Очень хорошая статья , только вот мне кажется , кто не знает асма , тому оно и не очень надо , а кто знает , тот знает и это , это лично моё мнение .

Offline

#3 12-01-2007 06:02

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

Пригодится. Молодец.
Я только не понял, при чем здесь Sanny Builder в заголовке smile

Offline

#4 12-01-2007 10:53

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Краткое руководство по ассемблеру

Я только не понял, при чем здесь Sanny Builder в заголовке

Так это чтобы легче понять было. Это я так асм с sanny builder'ом сравнивал.

Offline

#5 21-02-2007 13:10

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Краткое руководство по ассемблеру

теперь бы ещё сюда добавить надо , как переводить код асма в хеш для дальнейшего использования в СБ .

Offline

#6 22-02-2007 09:59

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

Есть руководство от Intel, в котором описаны все возможные комбинации опкодов ассемблера
ftp://download.intel.com/design/Pentium … 319102.PDF

Я еще пользуюсь достаточно простым способом для написания ассемблерных вставок: открываю делфи, пишу в asm..end нужный код, потом в режиме отладки смотрю че получилось и копирую в СБ.

Offline

#7 22-02-2007 12:27

Sanchez
Registered: 18-08-2006
Posts: 280

Re: Краткое руководство по ассемблеру

теперь бы ещё сюда добавить надо , как переводить код асма в хеш для дальнейшего использования в СБ .

Открой любую прогу в OllyDbg и вводи что надо. Выделяешь строчку, нажимаешь пробел, вводишь команду, нажимаешь ОК и т.д.

Может еще вот это пригодится:
http://wasm.ru/series.php?sid=17

Last edited by Sanchez (22-02-2007 12:38)

Offline

#8 22-02-2007 15:48

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Краткое руководство по ассемблеру

спасибо

Offline

#9 24-02-2007 21:09

flacs
Registered: 17-01-2007
Posts: 16

Re: Краткое руководство по ассемблеру

Пригодиться!:)

Offline

#10 13-07-2009 18:25

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Краткое руководство по ассемблеру

Хорошо написано - хорошо воспринимаемо.
Спасибо, буду изучать (а то на крэклабе ничего не понятно, там половина первой главы - вступление) smile

Offline

#11 26-03-2010 17:36

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Краткое руководство по ассемблеру

Спасибо, как раз хотел порыться в асм!

Offline

#12 07-04-2010 18:49

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Краткое руководство по ассемблеру

Нашёл PDF версию некой книжечки по ассемблеру некого Рудольфа Марека. Нет-ли её где-нибудь в печатном виде? А то очень занятно, но читать не удобно.

Offline

#13 07-04-2010 20:31

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

Распечатай

Offline

#14 08-04-2010 13:36

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Краткое руководство по ассемблеру

Легко сказать. Есть несколько причин:
1. Полностью нет краски для печати (а рисунков там полно)
2. Там не много ни мало 320 страниц!
У меня просто не хватит терпения и бумаги. Поэтому и спросил про печатную версию.

Offline

#15 08-04-2010 15:32

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

Re: Краткое руководство по ассемблеру

Немного не в тему, но есть 2 способа в разы сэкономить затраты на краску для струйного принтера (многие знают об этом, но всё же):
1. Заправлять картриджи самостоятельно (особенно это имеет смысл для черного картриджа)
2. Выставить качество печати в опциях принтера на минимум. При стандартном качестве обычно чернил потребляется больше, чем нужно (даже приходится ждать, пока на отпечатанном листе высохнут чернила)

Offline

#16 09-04-2010 02:20

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

Можно отнести PDF в какой-нить салон печати, где не только распечатают в книжном формате, но и переплетут. По цене, думаю, получится одинаково.

Offline

#17 13-04-2010 11:36

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Краткое руководство по ассемблеру

Seemann wrote:

Можно отнести PDF в какой-нить салон печати, где не только распечатают в книжном формате, но и переплетут. По цене, думаю, получится одинаково.

О, вот это может подойти. Спасибо!

UPDATE:
Кто-нибудь может расписать про доп. операнды ассемблера. Типа jz, shr, test и т.д.

Last edited by Sw[ee]t (20-07-2010 10:34)

Offline

#18 05-10-2010 11:03

mr.Andrei
Registered: 03-07-2010
Posts: 38
Website

Re: Краткое руководство по ассемблеру

Неплохо, очень неплохо - асм для геймеров good clap


SNKillers.net - всё о взломе и защите социальных сетей

Offline

#19 05-10-2010 11:35

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Краткое руководство по ассемблеру

При чём тут "для геймеров"? Это можно сделать с любым приложением, а не только с играми.

Offline

#20 06-10-2010 15:57

mr.Andrei
Registered: 03-07-2010
Posts: 38
Website

Re: Краткое руководство по ассемблеру

Ну это понятно, что асм для всех программ (в каком-то смысле все программы на асме). В смысле "асм для геймеров" - асм для тех, кому нравится GTA: наглядное применение плюс аналогия с CLEO скриптами.
Ладно проехали:blush:


SNKillers.net - всё о взломе и защите социальных сетей

Offline

#21 03-01-2011 20:03

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

Re: Краткое руководство по ассемблеру

Seemann wrote:

Я еще пользуюсь достаточно простым способом для написания ассемблерных вставок: открываю делфи, пишу в asm..end нужный код, потом в режиме отладки смотрю че получилось и копирую в СБ.

Я так понимаю, asm..end с кодом надо вставить в окно Unit1.pas, после команды {$R *.dfm} ? И как теперь режим отладки включить, чтобы конвертировать в hex ?

Offline

#22 04-01-2011 02:54

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

1 Создаешь новую программу. File-New-Other->Console Application
2 Между begin и end. пишешь asm..end

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin

asm
 mov eax, 1
end;

end.

Ставишь курсор на строку mov и жмешь F4. Это команда Run to Cursor

3 Когда программа дойдет до этой строки, отладчик выбросит тебя обратно в дельфи. Теперь нажми Ctrl+Alt+C (или меню View-Debug-CPU)

4 В этом окне увидишь ассемблерный код и его хекс-вариант

Project1.dpr.11: mov eax, 1
0040A178 B801000000       mov eax,$00000001

F7 перейти к следующей строке кода. Некоторые строки могут отсутствовать в программе, так как оптимизатор их выбрасывает при компиляции.

Offline

#23 04-01-2011 03:08

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 937
Website

Re: Краткое руководство по ассемблеру

Спасибо, работает. Теперь не надо каждый опкод искать.

Offline

#24 18-02-2011 21:40

Seemann
Registered: 07-08-2006
Posts: 2,105

Re: Краткое руководство по ассемблеру

UPDATE:
Кто-нибудь может расписать про доп. операнды ассемблера. Типа jz, shr, test и т.д.

better late than never
http://www.codenet.ru/progr/asm/newbee/lesson8.php

Offline

#25 19-02-2011 11:09

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Краткое руководство по ассемблеру

Спасибо!

Offline

Board footer

Powered by FluxBB