• XSS.stack #1 – первый литературный журнал от юзеров форума

Ассемблер Для Начинающих

Horrible

(L2) cache
Пользователь
Регистрация
24.04.2005
Сообщения
353
Реакции
3
Я тут подумал, что неплохобылоб изучать асму. И захотелось посмотреть какойнить простой пример. Как на ассемблере нерисовать мессаджбокс (только не через winapi)?

Попутно вопрос: может кто поделится личным опытом. С чего начать изучение, какой компилятор/линкер выбрать и т.п. Вобщем все по теме Асм для зелёных.

Зашол на wasm.ru и ненашол там никаких статей для новичков. Может плохо искал?

[mod] Great: Тут задаем все вопросы по асму. Другие топики аналогичного содержания будут удаляться[/mod]
 
а как тогда?
Я неправильно выразился, я хотел посмотреть пример, как ручками на асме нарисовать окошка, как мессаджбокс. Т.е. окошко, баттон и на баттон действие повесить. Мне просто интересно как это на асме выглядеть будет.
Добавлено [time]1116266522[/time]
Пирогов В.Ю. ASSEMBLER Учебный курс.pdf
Ща буду гуглить.
Добавлено [time]1116268263[/time]
Пирогов В.Ю. ASSEMBLER Учебный курс.pdf
Ща буду гуглить.
 
Нус... наснёмс...

Перво наперво я хотел бы сказать, что для того, чтобы учить асм надо достаточно хорошо знать язык выского уровня ибо въезжать в соновы программированию в ассемблере не представляется возможным, хотя там в принципе всё по-другому!
Во-вторых хочу тебе посоветовать следующее:
1. Скачай рассылку Калашникова, все с неё начинают, там ассемблер для ДОС разбирается, но я тебе настоятельно советую начать с ДОСа, прочитай уроков 13, дальше там муть всякая...
2. Бери книгу(обязательно купи или скачай и распечатай) Питер Абель "Ассемблер и программирование для IBM PC", эти 350 страниц - это БИБЛИЯ программиста на ассемблере, книга написана в далёкие 80ые, там описывается процессор 8086, но это супер книга, читай её и перечитывай на сто и двести раз, это друг мой классика!!!!!!
3. После прочтения этих двух вещиц, а так же закрепления всего прочитанного на практике(это обязательно), бери книгу Владислава Пирогова "Ассебмлер для Windows" , бери 3-е и последнее издание! Она как справочник, там не расписывается всё подробно, но зато там много полезного, много практики, очень хорошая вещица!!!!! Обязательно её купи, в сети есть только 1-е издание и то неполное!
Далее качай справочники, качай другую итературу, но начни именно с того, что тебе посоветовал я!

Теперь инструментарий:
Вообще выбор среди компиляторов довольно большой:
MASM - мелкософт(его я тебе и советую)
TASM - борланд, хороший он, но не обновляется уже долго и просто морально устарел!
NASM - assemler for unix
FASM - довольно новый ассемблер, очень логичный синтаксис, но имхо советую не отходить от традиций и всё-таки выбрать MASM
MASM есть двух типов: DOS и Win32
Ты начнёшь изучение ассемблере с дОС, пэтому и качай MASM6.1*, а потом скачаешь уже MASM32.
___________-
Далее дизассемблеры и отладчики!
Качай следующее:
OllyDBG - отличный отладчик с GIU Очень удобен! Есть проф. отладчик на уровне ядра - SoftIce, но рано до него ещё тебе...
Да, кстати, для ДОС программ олли не подходит, в рассылке Калашникова тебе будет дана ссылка на отладчик for dos application :)
Дизассемблер качай этот - HackVIEW
ХЕКС редактор без разговоров - WinHEX
Ну вот для начала пожалуй и всё!
И обязательно смотри как работают программы в отладчике, написал, слинковал прогу и сразу в отладчик её!!!! ОБЯЗАТЕЛЬНО!!!!!!!!

Теперь что качается твоих вопросов:

Написать форму, на ней кнопку и под ней событие - это довольно сложная задача для ассемблера и для программиста вообще! Так что делай консольные приложения! А для программирования GIU используй языки выского уровня с ассемблерными вставками в критических местах кода!

Но пример я тебе всё же приведу:
Вот этот код выведет на экран строку "Hello World", это ассемблер для ДОС, причём это приложение Com, здесь нет сегмента данных и мы не определяем адреса других сегментов, а указываем всего лишь начальное смещение в памяти(org 100h):
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello, world!$'
CSEG ends
end Begin

Это дос, где используются прерывания и функции, в данном случае функция 9 прерывания 21h

В винде нет прерываний, тут нам предлагается использовать АПИ, вот тебе пример обычного месаджбокса:

.386

.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption db "Iczelion Tutorial No.2",0
MsgBoxText db "Win32 Assembly is Great!",0

.code
start:

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL
end start
Как видишь у нас здесь 2 api функции: MessageBox и ExitProcess

Ну и накоонец форма, обычная форма... готов? :)
.386
.model flat,stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and kernel32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib


WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.DATA ; initialized data

ClassName db "SimpleWinClass",0 ; Имя нашего класса окна
AppName db "Our First Window",0 ; Имя нашего окна


.DATA? ; Hеиницилизируемые данные
hInstance HINSTANCE ? ; Хэндл нашей программы
CommandLine LPSTR ?
.CODE ; Здесь начинается наш код
start:
invoke GetModuleHandle, NULL ; Взять хэндл программы
; Под Win32, hmodule==hinstance mov hInstance,eax
mov hInstance,eax

invoke GetCommandLine ; Взять командную строку. Вы не обязаны
вызывать эту функцию ЕСЛИ ваша программа не обрабатывает командную строку.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию
invoke ExitProcess, eax ; Выйти из программы.
; Возвращаемое значение, помещаемое в eax, берется из WinMain'а.

WinMain proc

hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; создание локальных переменных в стеке
LOCAL msg:MSG
LOCAL hwnd:HWND


mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение структуры wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax

mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; регистрация нашего класса окна
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax

invoke ShowWindow, hwnd,CmdShow ; отобразить наше окно на десктопе
invoke UpdateWindow, hwnd ; обновить клиентскую область

.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; сохранение возвращаемого значения в eax
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.IF uMsg==WM_DESTROY ; если пользователь закрывает окно
invoke PostQuitMessage,NULL ; выходим из программы
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефаултная функция обработки окна
ret
.ENDIF
xor eax,eax

ret
WndProc endp


end start

Всё.... хэппи энд
Добавлено [time]1116318328[/time]
wasm.ru - это портал для профи, я оттуда лично половину материала тоже не понимаю!
Но там хороший набор инструментов и исходников!
 
BUG(O)R РЕСПЕКТ! Объяснил по теме че к чему!

Насчет дизассемблера: а почему не IDA? Все говорят что без разницы новичёк ты или профи, всеравно IDA рулит, а почему неговорят :)

Вот насчет мессаджбокса все понятно: винапи оно и в африке, вот тока синтаксис у асма какойто трудночитаемый :).
А вот когда пример окна увидел, у меня челюсть отпала :blink:
Ты прав, лучше создать форму в VC++ а весь основной код сделать ввиде вставок. Или рисовать окно через винапи.
Найду эти книжки и буду :bang:. Ещё раз спасибо.
Добавлено [time]1116322740[/time]
А вот ещё: чето мне говорили про какуюто прогу для изучения ассемблера. Там IDE, компилятор, дебаггер и хексредактор вместе, плюс эта прога эмулирует ОС, что позволяет лучше понять как все происходит на самом деле. Вроде на EMU название начинается. надо её найти.
 
Ты прав, лучше создать форму в VC++ а весь основной код сделать ввиде вставок.
тогда объясни, где будет польза от асма?
апи, только апи...
или тебе жалко 6 кб (сишник и асм, разница в хелловорде), но не жалко 120кб на форму?

имхо асм не рулит(ибо нефиг)
 
IDA - это интерактивный дизассемлер, действительно лучший в своём роде, но для чего все его примочки? Тебе то надо понять как выглядит программа в памяти, как она работает! Юзай обычный дизассемблер, а лучше в связке с отладчиком!

Не знаю, есть конечно среды с IDE для ассемблера, но они очень дорогие!
А всё остальное полная чушь! ОС у тебя и так есть, дебаггер+дизасм+хексредактор - есть отладчик(бери, ещё раз повторяю, OllyDBG).
И ты поймешь как всё происходит НА САМОМ деле!
Добавлено [time]1116324942[/time]
nerezus
Например во всех антивирусах и фарволах критические места в коде написаны на ассемблере! Вот буквально на днях посчитал один чел(админ с кряклаба), мой знакомый, он работает в связке asm+deplhi, что если например писать открытие файла и работу со строками как ассемблерную вставку, то мы получаем прирост скорости минимум в 2 раза!!!! Наверное не стоит говорить, что значит такой прирост когда ты пишешь брут!!!
Кароч, асм в связке с языком выского уровня = 100% скорости!
 
$01!$
У него первые 10 уроков дельные, всё остальное читать смысла нет. К тому же это ДОС. А ассемблер под ДОС = Питер Абель - это библия, это классика.
Добавлено [time]1116647387[/time]
А что ты ещё видел если не секрет?
 
если например писать открытие файла и работу со строками как ассемблерную вставку, то мы получаем прирост скорости минимум в 2 раза!!!!
Это почему интересно? Что по твоему мнению на асме win api функции работают быстрее? =) Или твой знакомый написал свои функции для работы с файлами?
Имхо асм вставки стоит использовать, если реализуешь сложные вычисления, да и то перед этим лучше прикинуть даст ли это большой прирост производительности или нет.
 
[ CoDeR]
При чём тут ВинАпи, я тебе говорю про стандартный метод открытия файлов!
А что удивительного? Стандартные функции - это обёртка над АПИ. Можно вообще использовать натив функции, они ещё быстрее kernel32.dll будут т.к. кернел, это тож обертка над ntdll.dll
Скомпилируй с апи на асме и со стандартным методом и посчитай сколько тактов та и другая операция!!!
Мой знакомый может написать и свои функции, можешь в этом не сомневаться!!!
 
Как на ассемблере нерисовать мессаджбокс (только не через winapi)?

Вопрос на самом деле интересный - надо только перефразировать например:
- как на asm'е написать DirectX ?
или
- как достучаться до видеопамяти (низкоуровнего HDD, портов) ?
 
Их нет. Апи
я по какому поводу вопрос задала :
При чём тут ВинАпи, я тебе говорю про стандартный метод открытия файлов!
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх