DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Archive for the ‘Ассемблер’ Category

Как прикрутить FASM к RadAsm. Пытаемся подружить 2 клёвых инструмента!

Posted by devprog на Февраль 24, 2009

Привет. Прошу прощение за долгое отсутствие новых материалов на блоге. Всё это гадская работа виновата. Итак, приступим к настройке!

• Скачиваем с офф.сайта вот этот архив:  пакет RadASMон содержит файлы поддержки языков ассемблеров, таких как MASM, FASM, TASM, NASM… Нам, из этого архива, нужны только файлы и папки, в названиях которых, наш пытливый мозг может обнаружить вхождения подстроки “fasm”. Эти файлы и папки нужно записать в корень директория с установленным RadAsm! Например, RadAsm у нас установлен в: D:\Utilites\RadAsm\ – значит туда и кидаем следующие файлы:

1. Папка FASM полностью в D:\Utilites\RadAsm\

2. Файл fasm.ini тоже кидаем в D:\Utilites\RadAsm\

3. Файл fasm.ct из папки Addins кидаем в D:\Utilites\RadAsm\Addins\

 

• Скачиваем сам компилятор, если не скачали с сайта http://www.flatassembler.net/download.php и открываем архив. Из него нам нужны вот эти файл и папка:

1. Файл FASM.EXE пишем в D:\Utilites\RadAsm\

2. Папку INCLUDE засунем в D:\Utilites\RadAsm\

Этим мы переписали сам компилятор ассемблера и директорию с инклудниками в папку с RadAsm.

 

• Качаем GoRC.exe. GORC – это компилялка ресурсов. Архив распаковываем ровно в ту папку, куда записывали всё до этого, всмысле вот сюда: D:\Utilites\RadAsm\

 

• Открываем RadAsm.exe | Настройки | Programming Languages | Добавляем fasm.ini | Жмём Add | OK

 

• Создаём новый проект, выбираем из списка компилятор fasm! Выбираем шаблон win32dlg.tpl. Теперь удаляем в процедуре DlgProc директиву enter, а директиву return меняем на ret! Тем самым, должны получить следующий код процедуры DlgProc:

proc DlgProc,hWnd,uMsg,wParam,lParam
push edi esi ebx
; удалили enter
mov eax,[uMsg]
cmp eax,WM_COMMAND
je jCOMMAND
cmp eax,WM_INITDIALOG
je jINITDIALOG
cmp eax,WM_CLOSE
je jCLOSE
xor eax,eax
jmp finish

jINITDIALOG:
mov eax,[hWnd]
mov [gWnd],eax

mov eax,1
jmp finish

jCOMMAND:
mov eax,[wParam]
cmp eax,1000
je a1000
xor eax,eax
jmp finish

a1000:
invoke SendMessage,[hWnd],WM_CLOSE,0,0
mov eax,1
jmp finish

jCLOSE:
invoke EndDialog,[hWnd],0
mov eax,1

finish:
pop ebx esi edi
ret
endp

 

• Ассемблируем проект! Всё должно получиться, и вы увидите простую форму с одной кнопкой. Если вам что нибудь не ясно – спрашивайте, не стесняйтесь. Я всегда рад общению. Настройка RadAsm+FASM успешно завершена.

 

Понравилась заметка? Хочешь продолжать читать мой блог? Тогда, подпишись на мою RSS-ленту новостей! Теперь ты не пропустишь возможность почитать новенькие заметки, на Блоге для Программистов!

Реклама

Posted in Ассемблер | 9 комментариев »

DelphiWorld, World C++, World C#, ASM World — качаем громадные архивы статей.

Posted by devprog на Февраль 4, 2009

Справочники очень большие и качественные. Содержат множество статей по программированию на языках ассемблера, Delphi, С++, С#.

ASM World – сборник статей по ассемблеру

World C++ – статьи и исхлдники по C и C++

C# World – русские и английские статьи по C#

DelphiWorld – статьи и исходники по Delphi

Posted in Delphi, Ассемблер, С и С++ | Leave a Comment »

Узелок впрок! Как отобразить окно без заголовка в Ассемблере?

Posted by devprog на Ноябрь 4, 2008

блог программистовВозможно отображать окна, без их заголовка. Достаточно лишь удалить у них свойство WS_CAPTION, которое отвечает как раз за его отображение. Так же, таким способом можно удалять и выставлять другие свойства окон.

Рассмотрим пример:

invoke GetWindowLong,hWnd,GWL_STYLE ; получение информации об окне
and eax,not WS_CAPTION ; удаление WS_CAPTION
invoke SetWindowLong,hWnd,GWL_STYLE,eax ; установка свойств окна

Так, мы получаем сначала все стили окна, в одном числе. А потом из него убераем стиль WS_CAPTION и выставляем всё обратно, но уже без заголовка.

В Delphi, такое возможно путём установки поля BorderStyle значением bsNone.

Вы можете присылать свои советы для рубрики “Узелок впрок” по адресу seorobo@gmail.com

Posted in Ассемблер, Узелок впрок | 11 комментариев »

Ассемблер для начинающих. Урок III — Сравнения и переходы (более подробно)

Posted by devprog на Ноябрь 4, 2008

Привет. На этом уроке поговорим про операторы cmp & условные переходы более подробно. Для начала обратите внимание на таблицу условных переходов. Вы уже видели нечто подобное на прошлом уроке:

Теперь давайте посмотрим на практике. Есть код:

1) mov eax,32  ; в EAX 32h

2) mov ebx,33  ; в EBX 33h

3) cmp eax,ebx  ; сравниваем EAX c EBX

4) jne metka  ; Если не равны то прыгаем на metka

5) sub eax,eax  ; иначе обнуляем EAX

metka:

6) invoke ExitProcess,0 ; завершаем процесс

Разберём каждую инструкцию:

1) mov — инструкция, которая присваивает значения. В данном случаи мы присваиваем регистру EAX число 32h (hex)

2) Аногогично, только теперь регистру EBX присваиваеться 33h

3) cmp — оператор сравнения (Compare — сравнивать). Сравнивает EAX c EBX и взависимости от результата выставляет соответствующие арифметические флаги (у нас ZF, SF, CF — но не подумайте что это все флаги!)

4) Наш условный переход, чтобы его понять обратимся к таблице. Смотрим тип операндов — любые, значит не имеет значения, со знаком числа или без. Далее смотрим критерий условного перехода — 1операнд НЕ РАВЕН 2операнду. И третие — смотрим значение флага, в данном случаи это флаг «нуля» (ZF — Zerro Flag). Итак из таблицы видно что, чтобы мы прыгнули на метку — регистры EAX & EBX не должны быть равны и флаг нуля устанавливаеться в 0(нуль). То есть если они не равны — мы прыгаем на метку «metka»

5) Так как переходу быть — процессор не выполняет эту инструцкию. Она предназначена для вычитания. То есть если бы перехода не было она бы вычла из EAX, EAX (значения) — тем самым обнулив его.

6) Уже до боли знакомый вам вызов функции API ExitProcess, который просто завершит программу.

Если бы мы в 4) пункте написали бы не JNE a JZ то мы бы не прыгнули на метку, так как регистры EAX & EBX не равны между собой.

Для полноты всей картины давайте воспроизведём всё выше описаное в полноценную программу:

include ‘D:\FASM\include\win32ax.inc’

.code

start:

mov eax,32              ; в EAX 32h

mov ebx,33              ; в EBX 33h

cmp eax,ebx             ; сравниваем EAX c EBX

jne metka               ; Если не равны то прыгаем на metka

sub eax,eax             ; иначе обнуляем EAX

metka:

invoke ExitProcess,0    ; завершаем процесс

.end start

Вот и весь урок. Можно эксперементировать задавая разные значения регистрам и изменяя прыжок — так вы быстрее поймёте. Есстественно нужно это делать в отладчике. Возьмите Olly. Кстати вот этот наш кусок кода в отладчике выглядит следующим образом:

Красная стрелочко означает что сейчас произойдёт переход, и я ещё там написал что флаг нуля = 0 (нуль), чтобы не постить весь экран от Olly. А вот Olly лучше скачайте и посмотрите сами! Пока.

Posted in Ассемблер, Новичку | 8 комментариев »

Ассемблеры для Linux: Сравнение GAS и NASM

Posted by devprog на Октябрь 24, 2008

Сегодня, уже собираясь ложиться спать и видеть хорошие, добрые сны, наткнулся (совершенно случайно) на очень интересную статью. В чём отличия ассемблеров GAS и NASM? Вот вы знаете? И я не знаю. Так давайте прочитаем!!!

Вырезка из статьи:

В этой статье объясняются некоторые наиболее важные синтаксические и семантические различия двух самых популярных ассемблеров для Linux® — GNU Assembler (GAS) и Netwide Assembler (NASM), а также различия в базовом синтаксисе, переменных и доступе к памяти, обработке макросов, функциях и внешних подпрограммах, работе со стеком и методиках простого повторения блоков кода.

В этой статье описываются:

  • Основные синтаксические различия NASM и GAS
  • Общие конструкции на уровне ассемблера, такие как переменные, циклы, метки и макросы
  • Немного о вызове внешних подпрограмм на C и использовании функций
  • Использование и различия мнемоник ассемблера
  • Методы адресации памяти

В этой статье не рассматриваются:

  • Различные виды макросов и компоненты, специфичные для того или иного ассемблера
  • Директивы ассемблера, характерные только для NASM либо GAS
  • Возможности, не являющиеся широко употребительными, или имеющиеся в одном ассемблере и отсутствующие в другом

Ну что-ж, не буду вас томить, читайте на здоровье: Ассемблеры для Linux: Сравнение GAS и NASM

Posted in Ассемблер | 1 Comment »

Ассемблер для начинающих. Урок 2 — Циклы и условные переходы

Posted by devprog на Октябрь 21, 2008

ассемблер для новичковПривет. Сегодня поговорим о циклах и условных переходах. Для этого давайте возьмём код из первого урока и немного его усложним, добавив сначала цикл, затем условный переход. Давайте сделаем так чтобы окошко вызывалось 5 раз. Для этого приведём следующий код:

include ‘D:\FASM\include\win32ax.inc’

.code

start:

mov esi,5d    ; кладём в регистр esi число 5

@@loop:   ; обьявили метку

invoke MessageBox,0,0,0,0 ; вызываем окно

dec esi   ; уменьшаем счётчик

cmp esi,0  ; сравниваем esi c нулём (проверяем не кончился ли счётчик)

ja @@loop        ; и если число в esi превышает 0 (нуль) то прыгаем на метку @@loop

invoke  ExitProcess,0 ; ну а если равно то выходим из программы

.end start

Тут наверное стоит пояснить что метка @@loop — так написанна для удобства и только для этого. Есть ещё понятие анонимных меток — о них мы поговорим в следующих уроках. Итак из комментариев в коде я думаю всё ясно. Мы просто обьявили регистр esi как счётчик, затем мы вызываем окошко и уменьшаем счётчик на 1 (dec — уменьшить на 1). Сравниваем счётчик с нулём, так мы проверяем, не кончился ли счётчик, и если не кончился — переходим на метку @@loop. Поясню, что JA — Jump if Above то есть переход если больше. Так и получаеться что пока в esi больше нуля то мы «бегаем по коду» и выполняем вызов окна. Как только счётчик установлен в 0 (нуль) — выполнение программы прекращаеться, то есть выполняеться ExitProcess.

Кстати в этой программе мы использовали и цикл и условный переход. Но давайте превратим этот код в более привычный вид для программистов на C++ и Delphi:

include ‘D:\FASM\include\win32ax.inc’

.code

start:

mov esi,5d

@@loop:

invoke MessageBox,0,0,0,0

dec esi

.if esi = 0

invoke  ExitProcess,0

.endif

jmp @@loop

.end start

Тут уже попонятнее да? Появился привычный нам всем if. Как вы уже знаете после if выполняеться код если условие верно. То есть если у нас esi = 0, то выполняеться ExitProcess. Тут всё понятно и так. Если не понятно — всегда рад ответить на ваши вопросы.

И вот только сейчас я вспомнил что я обещал на прошлом уроке показать как использовать переменные среды. Но я не буду этого делать. А почему? Да потому что я нашёл видео по этому делу:

http://sulaiman.netadvant.com/video/fasm-05.rar . Но для его просмотра нужно скачать кодек: http://sulaiman.netadvant.com/video/….0.0-13124.exe

Posted in Ассемблер, Новичку | 7 комментариев »

Ассемблер для начинающих. Урок 1 — Вызов API функций.

Posted by devprog на Октябрь 17, 2008

Привет. Итак приступим к делу, для этого нам нужно скачать какой-нибудь компилятор ассемблера, качайте или FASM или MASM, так как отличия в синтаксисе минимальны. Выбрать компилятор по душе можете вот сдесь. Лучше конечно скачать FASM, так как этот компилятор нравиться мне больше остальных и обьяснять я буду именно на нём.

Итак, давайте напишем приложение которое будет показывать простое окошко с какой-либо фразой, как и подобает обучаться програмированию. Вообще я сомневаюсь что имеено так нужно учиться но не будем нарушать традиций.

Создадим простой текстовый файлик и назовём его «first.asm» и начинаем программировать:

include ‘win32ax.inc’
.code
start:
invoke  ExitProcess,0       ; вызываем функцию ExitProcess c параметром 0 (нуль)
.end start

Что делает этот код? Да ничего… Если мы его скомпилируем то получим полноценную программу которая просто завершает сама себя. Компилируем:

fasm.exe first.asm

Итак, вы попытались скомпилировать… Но не получилось, а всё потому что компилятор не знает где находиться файл-инклудник — «win32ax.inc». Необходимо ему явно указать этот файл для этого меняем код программы, например вот так:

include ‘D:\FASM\include\win32ax.inc’
.code
start:
invoke  ExitProcess,0       ; вызываем функцию ExitProcess c параметром 0 (нуль)
.end start

Теперь всё скомпилируеться отлично, но чтобы это не писать каждый раз, можно задействовать переменные среды, присвоив например переменной %inc% путь «D:\FASM\include». Но этим мы займемся в следующем туториале, так как в этом я собираюсь показать как вызываеться функция Windows API (какой и являеться ExitProcess).

Кстати invoke — это макрос, который обьявлен в инклуднике win32ax.inc. Он позволяет нам вызывать функции привычным образом как например в С++ или Delphi. Без него мы будем писать в следующих туториалах. Короче усвойте что invoke это вызов функций (но только на первый туториал, ну или на все если в будущем вы собираетесь программировать именно с его помощью).

Теперь давайте добавим в нашу программу ещё одну функцию — MessageBox:

include ‘D:\FASM\include\win32ax.inc’
.code
start:
invoke  MessageBox,HWND_DESKTOP,»Hallo Xaker.Name»,»Caption»,MB_ICONASTERISK
invoke  ExitProcess,0       ; вызываем функцию ExitProcess c параметром 0 (нуль)
.end start

Первый параметр функции MessageBox являеться дескриптор окна-родителя нашего окошка, в качестве него мы передаём константу HWND_DESKTOP — дескриптор Рабочего Стола.

Второй параметр — адрес на текст самого окошка. Возникает вопрос — почему же мы не пишем: invoke MessageBox,HWND_DESKTOP,offset Message….? Да потому что, макрос invoke достаточно универсален, чтобы принимать в параметре просто текст… Подробнее обьясню в следующих уроках.

Третий параметр — заголовок окна, то есть его адрес.
Ну а четвёртый параметр — стиль окна, у нас это MB_ICONASTERISK то есть окошко с восклицанием.

Кстати дополнительную информацию об API — можно получить либо на MSDN либо из любой справки Windows SDK, которая поставляеться с любым продуктом Borland. Вот и написали и разобрали вызов функций и написали полноценное приложение. Всё, до следующего туториала, всего хорошего…

———-
Интересное на блогах:
Сокращаем JavaScript код
Сервисы для программистов

———-
Полезная заметка? Есть способ получать новые посты не заходя на этот сайт! Как? Да просто подпишись на RSS-Фид !

Posted in Ассемблер, Новичку | Отмечено: , , , | 23 комментария »