You are not logged in.
В 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
Очень хорошая статья , только вот мне кажется , кто не знает асма , тому оно и не очень надо , а кто знает , тот знает и это , это лично моё мнение .
Offline
Пригодится. Молодец.
Я только не понял, при чем здесь Sanny Builder в заголовке
Offline
Я только не понял, при чем здесь Sanny Builder в заголовке
Так это чтобы легче понять было. Это я так асм с sanny builder'ом сравнивал.
Offline
теперь бы ещё сюда добавить надо , как переводить код асма в хеш для дальнейшего использования в СБ .
Offline
Есть руководство от Intel, в котором описаны все возможные комбинации опкодов ассемблера
ftp://download.intel.com/design/Pentium … 319102.PDF
Я еще пользуюсь достаточно простым способом для написания ассемблерных вставок: открываю делфи, пишу в asm..end нужный код, потом в режиме отладки смотрю че получилось и копирую в СБ.
Offline
теперь бы ещё сюда добавить надо , как переводить код асма в хеш для дальнейшего использования в СБ .
Открой любую прогу в OllyDbg и вводи что надо. Выделяешь строчку, нажимаешь пробел, вводишь команду, нажимаешь ОК и т.д.
Может еще вот это пригодится:
http://wasm.ru/series.php?sid=17
Last edited by Sanchez (22-02-2007 12:38)
Offline
Offline
Пригодиться!:)
Offline
Хорошо написано - хорошо воспринимаемо.
Спасибо, буду изучать (а то на крэклабе ничего не понятно, там половина первой главы - вступление)
Offline
Спасибо, как раз хотел порыться в асм!
Offline
Нашёл PDF версию некой книжечки по ассемблеру некого Рудольфа Марека. Нет-ли её где-нибудь в печатном виде? А то очень занятно, но читать не удобно.
Offline
Распечатай
Offline
Легко сказать. Есть несколько причин:
1. Полностью нет краски для печати (а рисунков там полно)
2. Там не много ни мало 320 страниц!
У меня просто не хватит терпения и бумаги. Поэтому и спросил про печатную версию.
Offline
Немного не в тему, но есть 2 способа в разы сэкономить затраты на краску для струйного принтера (многие знают об этом, но всё же):
1. Заправлять картриджи самостоятельно (особенно это имеет смысл для черного картриджа)
2. Выставить качество печати в опциях принтера на минимум. При стандартном качестве обычно чернил потребляется больше, чем нужно (даже приходится ждать, пока на отпечатанном листе высохнут чернила)
Offline
Можно отнести PDF в какой-нить салон печати, где не только распечатают в книжном формате, но и переплетут. По цене, думаю, получится одинаково.
Offline
Можно отнести PDF в какой-нить салон печати, где не только распечатают в книжном формате, но и переплетут. По цене, думаю, получится одинаково.
О, вот это может подойти. Спасибо!
UPDATE:
Кто-нибудь может расписать про доп. операнды ассемблера. Типа jz, shr, test и т.д.
Last edited by Sw[ee]t (20-07-2010 10:34)
Offline
Неплохо, очень неплохо - асм для геймеров
SNKillers.net - всё о взломе и защите социальных сетей
Offline
При чём тут "для геймеров"? Это можно сделать с любым приложением, а не только с играми.
Offline
Ну это понятно, что асм для всех программ (в каком-то смысле все программы на асме). В смысле "асм для геймеров" - асм для тех, кому нравится GTA: наглядное применение плюс аналогия с CLEO скриптами.
Ладно проехали:blush:
SNKillers.net - всё о взломе и защите социальных сетей
Offline
Я еще пользуюсь достаточно простым способом для написания ассемблерных вставок: открываю делфи, пишу в asm..end нужный код, потом в режиме отладки смотрю че получилось и копирую в СБ.
Я так понимаю, asm..end с кодом надо вставить в окно Unit1.pas, после команды {$R *.dfm} ? И как теперь режим отладки включить, чтобы конвертировать в hex ?
Offline
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
UPDATE:
Кто-нибудь может расписать про доп. операнды ассемблера. Типа jz, shr, test и т.д.
better late than never
http://www.codenet.ru/progr/asm/newbee/lesson8.php
Offline
Спасибо!
Offline