логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.



Меню невыпадающее
Программистам : Другое :

Fasm - некоторые точки над Ё...

    Этот материал размещен исключительно по запросам пользователей. Если вы хотите, штобы мы разместили ответы и на ваши вопросы, пишите на нашу почту - pauk@fromru.com . ;

       
Некоторые точки над Ё [1]
----=# FASM #=----

[1] Квадратные скобки в fasm.

Основной мануал к FASM (тот самый, который 'Translate made by Paranoik') цитата:
"Если операнд - это данные в памяти, адрес этих данных (также любого числового выражения, но оно может содержать регистры) должен быть должен быть заключен в квадратные скобки или предворен оператором 'ptr'. Например инструкция 'mov eax,3' поместит число 3 в регистр EAX, а 'mov eax,[7]' поместит 32-битное значение из адресса 7 в EAX, и инструкция 'mov byte [7],3' поместит число 3 в байт по адресу 7, это можно записать ещё так: 'mov byte ptr 7,3'. Для того чтобы установить какой сегментный регистр будет использоваться для адрессации, нужно поставить его название с двоеточием перед адресом внутри квадратных скобок или после оператора 'ptr'"
Конец цитаты.
[основной мануал к fasm можно скачать на wasm.ru - русскозычный].

Итак что мы имеем:
1) конкретное значение в регистр
mov eax,9 - помещает число 9 в eax
2) данные из памяти в регистр
mov eax,[1234h] - помещение 32-бита из памяти по адрессу 1234h в eax
3) конкретное значение в память
mov byte [04h],5 - помещает 5 в память по адрессу 04h
mov byte ptr 04h,5 - аналогично предыдущей
Чтоб указать используемый сегментный регистр надо поставить его перед адресом в памяти
mov byte [ds:04h],5
mov byte ptr ds:04h,5
4) регистр в память аналогично (3)
mov [es:45h],eax ; - поместить значение eax в память по адресу es:45h

Пример:
"...
;инициализируем данные
somedata: dd 9h
; - двойное слово 9h
string: db "some string",0
; - последовательность байтов 's','o','m','e',' ','s','t','r','i','n','g' и '0'
...
;с регистрами
mov eax,somedata ; - поместит в eax 32-битный адресс метки somedata
mov eax,[somedata] ; - загрузит в eax 32-битное значение переменной = 9h
mov [somedata],eax ; - помещаем 32-битное значение из eax в память по адрессу somedata
mov somedata,eax ; - так нельзя!
mov [eax],somedata ; - поместит значение из памяти (9h) в ячейку памяти на которую указывает адресс в eax (в eax должен быть адрес)
...
;стек
push [somedata] ; - выталкивает в стек значение переменной somedata - 9h
push somedata ; - сохраняет в стеке адрес метки somedata
pop [somedata] ; - помещает в переменную somedata значение из стека
pop somedata ; - так нельзя!
...
;при вызове процедур
invoke someProc 0,12,43,somedata ; - передаем процедуре 0,12,43 и адресс метки somedata
invoke someProc 0,32,98,[somedata] ; - передаем 0,32,98 и значение из памяти на которое указывает somedata, т.е. передаем 9h
...
; со строками
mov al,[string] ; - поместит в al байт 's'
mov al,[string+1] ; - помещаем в al байт 'o'
mov bx,2
mov al,[string+bx]
; - поместит в al байт 'm'
...
; call
; если надо вызвать функцию типа
theFunc:
...
; код функции
ret
call theFunc
; - вызов функции
;
mov ebx,theFunc ; помещаем в ebx адрес функции
call [ebx] ; - вызов функции
; если адрес функции theFunc например 4321h, то можно вызвать по нему
call [4321h]

...
"
Конец примера
Суть: x - указатель (читай адрес в памяти), [x] - значение на которое ссылается x.




[2] fasm wndclassex         \include\equates\user32.inc

struc WNDCLASS
{
.style dd ?
.lpfnWndProc dd ?
.cbClsExtra dd ?
.cbWndExtra dd ?
.hInstance dd ?
.hIcon dd ?
.hCursor dd ?
.hbrBackground dd ?
.lpszMenuName dd ?
.lpszClassName dd ?
}
struct WNDCLASS

struc WNDCLASSEX
{
.cbSize dd ?
.style dd ?
.lpfnWndProc dd ?
.cbClsExtra dd ?
.cbWndExtra dd ?
.hInstance dd ?
.hIcon dd ?
.hCursor dd ?
.hbrBackground dd ?
.lpszMenuName dd ?
.lpszClassName dd ?
.hIconSm dd ?
}
struct WNDCLASSEX


Перед вами две структуры WNDCLASS и WNDCLASSEX.
WNDCLASS содержит аттрибуты класса окна - передается функции RegisterClass.
Она замнена структурой WNDCLASSEX, используемой функцией RegisterClassEx.
Можно использовать WNDCLASS и RegisterClass, если нет необходимости в использовании маленькой иконки.
Личный состав структуры WNDCLASS:
style
Стиль класса. Должен быть комбинацией предопределённых стилей.
Вот они (\INCLUDE\EQUATES\USER32.INC)
CS_VREDRAW = 00001h
CS_HREDRAW = 00002h
CS_KEYCVTWINDOW = 00004h
CS_DBLCLKS = 00008h
CS_OWNDC = 00020h
CS_CLASSDC = 00040h
CS_PARENTDC = 00080h
CS_NOKEYCVT = 00100h
CS_SAVEBITS = 00800h
CS_NOCLOSE = 00200h
CS_BYTEALIGNCLIENT = 01000h
CS_BYTEALIGNWINDOW = 02000h
CS_PUBLICCLASS = 04000h
CS_GLOBALCLASS = CS_PUBLICCLASS
CS_IME = 10000h
Если NULL (ноль), то ничего страшного не произойдет - просто класс будет без прибамбасов.
lpfnWndProc
Указатель на процедуру окна. Эту процедуру потом вызывает Винда, после регистрации класса, после создания окна.
cbClsExtra
количество дополнительных байтов, которые нужно зарезервировать в конце структуры. Винда установит эти байты в ноль.
cbWndExtra
количество доплнителльных байт, которые нужно зарезервировать после окна. Винда установит эти байты в нули. Если приложение использует структуру для регистрации диалогового окна, то здесь надо установить DLGWINDOWEXTRA.
hInstance
Хендл нашей программы - тот самый который GetModuleHendl возвращает в eax.
hIcon
Указатель на класс иконки. Если NULL, то система установит дефолтную иконку.
hCursor
Указатель на класс курсора. Если NULL, то приложение должно явно указать форму курсора когда мышь перемещается над окнами приложения.
lbrBackground
Указатель на штуку - определяющую фон (background brush).Можно указать просто цвет из набора:
COLOR_ACTIVEBORDER = 10
COLOR_ACTIVECAPTION = 2
COLOR_APPWORKSPACE = 12
COLOR_BACKGROUND = 1
COLOR_BTNFACE = 15
COLOR_BTNSHADOW = 16
COLOR_BTNTEXT = 18
COLOR_CAPTIONTEXT = 9
COLOR_GRAYTEXT = 17
COLOR_HIGHLIGHT = 13
COLOR_HIGHLIGHTTEXT = 14
COLOR_INACTIVEBORDER = 11
COLOR_INACTIVECAPTION = 3
COLOR_MENU = 4
COLOR_MENUTEXT = 7
COLOR_SCROLLBAR = 0
COLOR_WINDOW = 5
COLOR_WINDOWFRAME = 6
COLOR_WINDOWTEXT = 8
всего 19 цветов. Либо NULL, но тогда приложение должно само прорисовывать фон. Определить когда нужно прорисовывать фон можно по сооющению WM_ERASEBKGND, или проверкой члена fErase из структуры PAINTSTRUCT, заполняемой ункцией BeginPaint.
lpszMenuName
Указатель на меню окна. Если NULL - то без меню. Можно указать 0, а потом загрузить меню с помощью функции LoadMenu.
lpszClassName
Указатель на строку - имя класса. Строку в формате ACSIIZ - ACSII строка кончающаяся на '0'. Не должна совпадать с уже зарегистрированными классами (с помощью функций RegisterClass и RegisterClassEX), и с предопределёнными классами Венды (типа MessageBox). Длина строки 256 символов, если больше, то функция выдаст ошибку.
Структура WNDCLASSEX - расширеная форма структуры WNDCLASS. Используется функциями RegisterClassEx и GetClassInfoEx. Добавлено два компонента cbSize и hIconSm.
cbSize
Размер структуры в байтах. Прально заполнять этот член структуры до вызова функции GetClassInfoEx (если она нужна конечно).
hIconSm
Указатель на маленькую иконку, ассоциируемую с классом окна. Если NULL, то система будет искать в ресурсах иконку подходящего размера.

///
/// Используемый материал: http://msdn.microsoft.com/en-us/library/ms633577(VS.85).aspx
/// http://msdn.microsoft.com/en-us/library/ms633576(VS.85).aspx
///
///
/// with уважуха Kostik
///


Информер ТИЦ


Предлагается изготовление сайтов cms Обращайтесь

Сайт создан Pauk_pv // Pauk@paukpv.pp.ru

Rambler's Top100 Каталог@MAIL.RU - каталог ресурсов интернет

При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©