Міністерство освіти та науки України
Кіровоградський Державний Технічний університет
Кафедра програмного забезпечення
Курсова робота
з дисципліни “Програмування на мові ASM-86” на тему:
Текстовий редактор під Windows
Зміст
1. Вступ
2. Постановка задачі
3. Обґрунтування вибору методів розв’язку задачі
4. Алгоритм програми
5. Реалізація програми
6. Системні вимоги
7. Інструкція для користувача
8. Висновки
9. Використана література
Додаток
Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.
Інформація - цінна річ, тому для її збереження в сучасному суспільстві використовують все частіше персональний комп‘ютер. При перегляді текстових файлів виникає потреба в зручних в користуванні та розумінні програм переглядачів текстових файлів.
Розробити текстовий редактор під Windows (типу Notepad) на мові програмування ASM-86. Програма повинна виконувати основні дії над введеним текстом.
Отже, необхідно написати текстовий редактор під Windows. Дана програма призначена для перегляду текстових файлів різного розміру. Програма може бути використана будь яким користувачем ЕОМ для перегляду потрібної інформації. При виборі алгоритму програми у мене не виникло варіантів. Тут все дуже просто. В Windows вже є функції API для роботи з текстом, іх тільки потрібно правильно викликати. Ще потрібно правильно написати обробники повідомлень.
Читаємо командний рядок.
Читаємо іконку та курсор з ресурсів.
Будування головного вікна.
Ініціалізація акселераторів.
Отримання повідомлення
Якщо це WM_QUIT, то перехід до пункту 11.
Перетворимо акселератори в IDM*
Перетворимо повідомлення від клавіш
Відішлемо назад.
Перехід до пункту 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
IBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим.
Операційна система - Windows 3.1 або старша
Пам’ять - 2M і вище
Для запуску текстового редактора під Windows, потрібно зайти в меню “Пуск", вибрати “Выполнить” та в командному рядку набрати Notepad. Exe та натиснути Enter. Також можна набрати ім’я файлу, який потрібно редагувати.
Після запуску програми з’являється оболонка, в якій вже можна набирати текст, причому, можна використовувати операції з блоком. Також, в програмі є меню, в якому є опції для читання файлу, для запису файлу, для операцій з буфером, та вивід інформації про програму.
Отже, на мові ASM-86 створено текстовий редактор під Windows (типу Notepad). При постійній роботі з комп‘ютером досить часто потрібно переглянути файл. Тому дана програма є незамінною в роботі. Вона є простою в користуванні та розумінні. Під час написання цієї програми був розібраний метод писання програм під Windows.
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