Смекни!
smekni.com

Текстовий редактор під Windows (стр. 1 из 2)

Міністерство освіти та науки України

Кіровоградський Державний Технічний університет

Кафедра програмного забезпечення

Курсова робота

з дисципліни “Програмування на мові ASM-86” на тему:

Текстовий редактор під Windows

Зміст

1. Вступ

2. Постановка задачі

3. Обґрунтування вибору методів розв’язку задачі

4. Алгоритм програми

5. Реалізація програми

6. Системні вимоги

7. Інструкція для користувача

8. Висновки

9. Використана література

Додаток

1. Вступ

Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.

Інформація - цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп‘ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів.

2. Постановка задачі

Розробити текстовий редактор під Windows (типу Notepad) на мові програмування ASM-86. Програма повинна виконувати основні дії над введеним текстом.

3. Обґрунтування вибору методів розв’язку задачі

Отже, необхідно написати текстовий редактор під Windows. Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації. При виборі алгоритму програми у мене не виникло варіантів. Тут все дуже просто. В Windows вже є функції API для роботи з текстом, іх тільки потрібно правильно викликати. Ще потрібно правильно написати обробники повідомлень.

4. Алгоритм програми

Читаємо командний рядок.

Читаємо іконку та курсор з ресурсів.

Будування головного вікна.

Ініціалізація акселераторів.

Отримання повідомлення

Якщо це WM_QUIT, то перехід до пункту 11.

Перетворимо акселератори в IDM*

Перетворимо повідомлення від клавіш

Відішлемо назад.

Перехід до пункту 5.

Закінчити програму.

5. Реалізація програми

Програма написана на мові ASM-86 з використанням команд процесора 386. Вона складається з головної програми, яка читає командний рядок, будує головне вікно, та організує головний цикл програми. Та з обробників повідомлень вікна, які і викликають функції для роботи з текстом.

Вона працює на будь якій машині де WINDOWS. При написанні програми для реалізації роботи з текстом та файлом були використані функції API WINDOWS.

Програма компілюється Turbo Assembler, зв’язується за допомогою TLINK32, та компілюються ресурси за допомогою brcc32.

tasm /m /ml /D_TASM_ winpad. asm

brcc32 winpad. rc

tlink32 /Tpe /aa /c /x winpad. obj,,,,,winpad. res

6. Системні вимоги

IBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим.

Операційна система - Windows 3.1 або старша

Пам’ять - 2M і вище

7. Інструкція для користувача

Для запуску текстового редактора під Windows, потрібно зайти в меню “Пуск", вибрати “Выполнить” та в командному рядку набрати Notepad. Exe та натиснути Enter. Також можна набрати ім’я файлу, який потрібно редагувати.

Після запуску програми з’являється оболонка, в якій вже можна набирати текст, причому, можна використовувати операції з блоком. Також, в програмі є меню, в якому є опції для читання файлу, для запису файлу, для операцій з буфером, та вивід інформації про програму.

8. Висновки

Отже, на мові ASM-86 створено текстовий редактор під Windows (типу Notepad). При постійній роботі з комп‘ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Під час написання цієї програми був розібраний метод писання програм під Windows.

9. Використана література

1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич, В.I. Воющ Москва 1989 р. ст. 166

2).“Програмування на сучасних мовах програмування”. Москва 1990 р. ст. 206

3) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.309

4) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.155

5) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.178

6) “Макро Асемблер” К.С. Кропiйко, О.Д. Богатирова. Київ - “Наука” 1991р.

7) Електронний довідник BOOK.

Додаток

Лістинг програми

; winpad. asm

; Графическое win32-приложение - текстовый редактор

;

; Компиляция TASM

; tasm /m /ml /D_TASM_ winpad. asm

; brcc32 winpad. rc

; tlink32 /Tpe /aa /c /x winpad. obj,,,,,winpad. res

include def32. inc

include user32. inc

include kernel32. inc

include comdlg32. inc

ID_MENUequ700h

ID_ACCELequ701h

ID_ABOUTequ702h

MAXSIZE equ 260; максимальное имя файла

MEMSIZEequ 65535; максимальный размер временного буфера в памяти

EditIDequ 1

.386

. model flat

. const

c_w_namedb 'Asmpad95',0; это и имя класса и имя основного окна

edit_classdb 'edit',0; предопределённое имя класса для редактора

changes_msgdb 'Save changes? ',0

filter_stringdb 'All Files',0,'*. *',0; маски для Get*FileName

db 'Text Files',0,'*. txt',0,0

. data

; структура, использующаяся Get*FileName

ofnOPENFILENAME <SIZE ofn,?,?,offset filter_string,?,?,?,offset buffer,MAXSIZE,0,?,?,?,?,?,?,0,?,?,? >

; стурктура, описывающая наш основной класс

wcWNDCLASSEX <SIZE WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,offset win_proc,0,0,?,?,?,COLOR_WINDOW+1, ID_MENU,offset c_w_name,0>

flag_untitleddb1; = 1 если имя файла не определено (новый файл)

. data?

h_editwindowdd? ; идентификатор окна редактора

h_acceldd? ; идентификатор массива акселераторов

p_memorydd? ; адрес буфера в памяти

SizeReadWritedd?

msg_MSG<>

recRECT<>

bufferdbMAXSIZE dup (?) ; имя файла

window_titledbMAXSIZE dup (?), 12 dup (?)

. code

_start:

callGetCommandLine; получим нашу командную строку

movedi,eax

moval,' '

movecx,MAXSIZE

repnescasb; найдём конец имени нашей программы

cmpbyte ptr [edi],0

jecmdline_empty

movesi,edi

movedi,offset buffer

repmovsb

movflag_untitled,0

cmdline_empty:

; подготовим и зарегистрируем класс

xorebx,ebx

callGetModuleHandle; определим наш идентификатор

movesi,eax

movwc. hInstance,eax; и сохраним его в wc. hInstance

movofn. _hInstance,eax

pushIDI_APPLICATION; или IDI_ICON если иконка есть в ресурсах

pushebx; или esi если иконка есть в ресурсах

callLoadIcon

movwc. hIcon,eax

pushIDC_ARROW; предопределённый курсор (стрелка)

pushebx

callLoadCursor

movwc. hCursor,eax

pushoffset wc

callRegisterClassEx

; создадим основное окно

pushebx

pushesi

pushebx

pushebx

push400

push600

pushCW_USEDEFAULT

pushCW_USEDEFAULT

pushWS_OVERLAPPEDWINDOW

pushoffset c_w_name

pushoffset c_w_name

pushWS_EX_CLIENTEDGE

callCreateWindowEx

pusheax; для pop esi перед message_loop

pusheax

pushSW_SHOWNORMAL

pusheax

callShowWindow

callUpdateWindow

; инициализируем акселераторы

pushID_ACCEL

pushesi

callLoadAccelerators

movh_accel,eax

; цикл ожидания сообщения

popesi; ESI - идентификатор основного окна

movedi,offset msg_; EDI - структура с сообщением от него

message_loop:

pushebx

pushebx

pushebx

pushedi

callGetMessage; получим сообщение

testeax,eax; если это WM_QUIT

jzexit_msg_loop; выйти из цикла

pushedi

pushh_accel

pushesi; hWnd

callTranslateAccelerator; преобразуем акселераторы в IDM*

testeax,eax

jnzmessage_loop

pushedi

callTranslateMessage; преобразуем сообщения от клавиш

pushedi

callDispatchMessage; и отошлём обратно

jmp short message_loop

exit_msg_loop:

pushmsg_. wParam

callExitProcess; конец программы

; процедура win_proc

;

; процедура не должна изменять регистры EBP,EDI,ESI и EBX!

win_proc proc near

; параметры (с учётом push ebp)

wp_hWnd equ dword ptr [ebp+08h]

wp_uMsg equ dword ptr [ebp+0Ch]

wp_wParam equ dword ptr [ebp+10h]

wp_lParam equ dword ptr [ebp+14h]

; инициализируем стековый кадр

pushebp

movebp,esp; создадим стековый кадр

pusha; сохраним все регистры

xorebx,ebx; 0 для команд push 0

movesi,wp_hWnd; для команд push hWnd

moveax,wp_uMsg

; обработаем пришедшее сообщение

cmpeax,WM_CREATE

jeh_wm_create

cmpeax,WM_SIZE

jeh_wm_size

cmpeax,WM_DESTROY

jeh_wm_destroy

cmpeax,WM_COMMAND

jeh_wm_command

cmpeax,WM_ACTIVATE

jeh_wm_activate

cmpeax,WM_CLOSE

jeh_wm_close

def_proc:

popa

leave; если это ненужное сообщение

jmpDefWindowProc; оставить его обработчику по умолчанию

;

; обработчик WM_CLOSE

; если нужно, спрашивает, сохранить ли файл

h_wm_close:

callsave_contents

jmp short def_proc

;

; обработчик WM_CREATE

;

h_wm_create:

; здесь также можно создать toolbar и statusbar

; создадим окно редактора

pushebx

pushwc. hInstance; идентификатор основной программы

pushEditID

pushesi; hWnd

pushebx; 0

pushebx; 0

pushebx; 0

pushebx; 0

pushWS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL

pushebx; 0

pushoffset edit_class

pushebx; 0

callCreateWindowEx

movh_editwindow,eax

; передадим ему фокус

pusheax

callSetFocus

cmpflag_untitled,1

jecontinue_create

callskip_getopen; откроем файл, указанный в командной строке

continue_create:

callset_title

jmp end_wm_check

;

; обработчик WM_COMMAND

;

h_wm_command:

moveax,wp_wParam

cwde; low word contains IDM_*

subeax,100h

jbdef_proc

; обработаем сообщения от пунктов меню

call dword ptr menu_handlers [eax*4]

jmp end_wm_check

menu_handlersdd offset h_idm_new,offset h_idm_open,offset h_idm_save

dd offset h_idm_saveas,offset h_idm_exit,offset h_idm_about

dd offset h_idm_undo, offset h_idm_cut, offset h_idm_copy

dd offset h_idm_paste, offset h_idm_clear, offset h_idm_setsel

; сообщения от пунктов меню должны быть описаны в win95pad. rc именно в таком

; порядке - от IDM_NEW 100h до IDM_CLEAR 10Ah

h_idm_setsel:

push-1; - 1

pushebx; 0

pushEM_SETSEL; выделить весь текст

pushh_editwindow

callSendMessage

ret

; обработчики сообщений из меню EDIT:

h_idm_clear:

moveax,WM_CLEAR

jmp short send_to_editor

h_idm_paste:

moveax,WM_PASTE

jmp short send_to_editor

h_idm_copy:

moveax,WM_COPY

jmp short send_to_editor

h_idm_cut:

moveax,WM_CUT

jmp short send_to_editor

h_idm_undo:

moveax,EM_UNDO

send_to_editor:

pushebx; 0

pushebx; 0

pusheax

pushh_editwindow

callSendMessage

ret

; обработчик IDM_NEW

h_idm_new:

callsave_contents; запишем файл если нужно

movbyte ptr flag_untitled,1

callset_title; отметим что файл не назван

pushebx

pushebx

pushWM_SETTEXT

pushh_editwindow

callSendMessage; пошлём пустой WM_SETTEXT редактору

ret

; обработчик IDM_ABOUT

h_idm_about:

pushebx; 0

pushoffset about_proc

pushesi; hWnd

pushID_ABOUT

pushwc. hInstance

callDialogBoxParam

ret

; обработчик IDM_SAVEAS и IDM_SAVE

h_idm_save:

cmpflag_untitled,1; если файл назван

jneskip_getsave; пропустим вызов GetSaveFileName

h_idm_saveas:

; спросим имя файла

movofn. Flags,OFN_EXPLORER or OFN_OVERWRITEPROMPT

pushoffset ofn

callGetSaveFileName

testeax,eax

jzfile_save_failed

skip_getsave:

; создадим его

pushebx

pushFILE_ATTRIBUTE_ARCHIVE