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

Автор: Пользователь скрыл имя, 06 Апреля 2013 в 14:47, курсовая работа

Описание работы

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

Содержание

1. Вступ
2. Постановка задачі
3. Обґрунтування вибору методів розв'язку задачі
4. Алгоритм програми
5. Реалізація програми
6. Системні вимоги
7. Інструкція для користувача
8. Висновки
9. Використана література
Додаток

Работа содержит 1 файл

курсак Зербіно теорія.docx

— 34.27 Кб (Скачать)

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

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

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

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

з дисципліни “Програмування на мові 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

pushCREATE_ALWAYS

pushebx

pushFILE_SHARE_READ or FILE_SHARE_WRITE

pushGENERIC_READ or GENERIC_WRITE

pushoffset buffer

callCreateFile

movedi,eax

; выделим память

pushMEMSIZE

pushGMEM_MOVEABLE or GMEM_ZEROINIT

callGlobalAlloc

pusheax; hMemory для GlobalFree

pusheax; hMemory для GlobalLock

callGlobalLock

movesi,eax; адрес буфера в  ESI

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

pushesi

pushMEMSIZE-1

pushWM_GETTEXT

pushh_editwindow

callSendMessage

; запишем в файл

pushesi; pMemory

calllstrlen

pushebx

pushoffset SizeReadWrite

pusheax; размер буфера

pushesi; адрес буфера

pushedi; идентификатор файла

callWriteFile

pushesi; pMemory

callGlobalUnlock

callGlobalFree; hMemory уже в стеке

pushedi; идентификатор файла

callCloseHandle

; сбросим флаг модификации  в редакторе

pushebx

pushebx

pushEM_SETMODIFY

pushh_editwindow

callSendMessage

movbyte ptr flag_untitled,0

callset_title

file_save_failed:

pushh_editwindow

callSetFocus

ret

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

h_idm_open:

callsave_contents

; вызовем стандартный  диалог выбора имени файла

movofn. Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_EXPLORER

pushoffset ofn

callGetOpenFileName

testeax,eax

jzfile_open_failed

skip_getopen:

; откроем выбранный файл

pushebx

pushFILE_ATTRIBUTE_ARCHIVE

pushOPEN_EXISTING

pushebx

pushFILE_SHARE_READ or FILE_SHARE_WRITE

pushGENERIC_READ or GENERIC_WRITE

pushoffset buffer

callCreateFile

movedi,eax; идентификатор для  ReadFile

; выделим память

pushMEMSIZE

pushGMEM_MOVEABLE or GMEM_ZEROINIT

callGlobalAlloc

pusheax; hMemory для GlobalFree

pusheax; hMemory для GlobalLock

callGlobalLock; получим адрес  выделенной памяти

pusheax; pMemory для GlobalUnlock

pusheax; pMemory для SendMessage

; прочитаем файл

pushebx

pushoffset SizeReadWrite

pushMEMSIZE-1

pusheax; pMemory для ReadFile

pushedi

callReadFile

; пошлём окну редактора  сообщение wm_settext чтобы он забрал  текст из буфера

pushebx; pMemory уже в стеке

pushWM_SETTEXT

pushh_editwindow

callSendMessage

; а теперь можно закрыть  файл и освободить память

callGlobalUnlock; pMemory уже в стеке

callGlobalFree; hMemory уже в стеке

pushedi; hFile

callCloseHandle;

movbyte ptr flag_untitled,0

callset_title

file_open_failed:

pushh_editwindow

callSetFocus

ret

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

h_idm_exit:

callsave_contents

pushesi; hWnd

callDestroyWindow; уничтожить наше  окно

ret

;

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

;

h_wm_size:

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

; изменим размер окна  редактора так чтобы оно по-прежнему  было на всё окно

pushoffset rec

pushesi; hWnd

callGetClientRect

push1; true

pushrec. bottom; height

pushrec. right; width

pushebx; y

pushebx; x

pushh_editwindow

callMoveWindow

jmp short end_wm_check

;

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

;

h_wm_activate:

pushh_editwindow

callSetFocus

jmp short end_wm_check

;

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

;

h_wm_destroy:

pushebx

callPostQuitMessage; послать WM_QUIT основной программе

end_wm_check:

popa

xor eax,eax; вернуть 0

leave

ret16

; процедура set_title

; устанавливает новый  заголовок для основного окна

set_title:

pushesi

pushedi

movedi,offset window_title

cmpbyte ptr flag_untitled,1; если у  файла нет имени

jeuntitled; использовать Untitled

movesi,ofn. lpstrFile; [ESI] - имя файла  с путём

movzxeax,ofn. nFileOffset; eax - начало  имени файла

addesi,eax

copy_filename:

lodsb; скопирем файл побайтово  в название окна

testal,al

jzadd_progname; пока не встретится  ноль

stosb

jmp short copy_filename

add_progname:

movdword ptr [edi],' - '; припишем  минус

addedi,3

movesi,offset c_w_name

movecx,9; и название программы

rep movsb

Информация о работе Текстовий редактор під Windows