记事本汇编课程设计

更新时间:2024-04-09 00:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

华 北 科 技 学 院

课程设计说明书

课程名称: 汇编语言程序设计 班 级: 计科B093 姓名:_ 杜晓春 学 号:__ 200807014330 设计题目: Win32编写记事本 设计时间: 6/25/ 2010 至 7/1/2010 指导教师:_ _ 陈振国 评 语: 评阅成绩: 评阅教师:____

一、课程设计目的

使用所学过的汇编语言程序设计知识,掌握结构化程序设计的基本思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,解决稍微复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。

二、课程设计要求

1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。 2.遵循模块化、结构化的程序设计方法。 3. 要求程序必须正确。

4. 程序简明易懂,多运用输入输出提示,出错信息及必要的注释。 5. 要求程序结构合理,语句使用得当。 6. 适当追求编程技巧和程序运行效率。

三、课程设计题目:

Win32记事本

要求:能实现基本菜单框架并打开窗口,有能力的同学可以编写进行数据录 入并保存的代码

四、课题分析

用32位汇编语言以WINDOWS SDK编程的模式编写记事本,为编写一个简洁可用的记事本程序,选择以对话框为程序主界面,通过RichEdit控件直接进行文本的录入、读取、存储等操作。菜单项中设置基本的文件新建、打开、保存、退出,及文本的撤销、重做、删除、剪切、复制、粘贴、全选功能,同时加入工具栏,工具栏上加入基本常用的功能按钮。

- 1 -

五、流程图

开 始 文 件 编 辑 帮 助 新 打 保 另退 撤 前 删 剪 复 粘 全 存 建 开 存 为 出 销 进 除 切 制 贴 选 六、程序源代码

记事本.rc

#include \记事本Res.rc\#include \记事本Mnu.rc\#include \记事本Dlg.rc\#include \关于Dlg.rc\

记事本Res.rc

#define IDB_TBRBMP 1212 #define IDI_ICON 1213 IDB_TBRBMP BITMAP DISCARDABLE \工具栏图标.bmp\IDI_ICON ICON DISCARDABLE \图标.ico\

记事本Mnu.rc

#define IDM_MENU 10000

#define IDM_FILE_NEW 10001 #define IDM_FILE_OPEN 10002

- 2 -

关 于

#define IDM_FILE_SAVE 10003 #define IDM_FILE_SAVEAS 10004 #define IDM_FILE_EXIT 10006 #define IDM_EDIT_UNDO 10101 #define IDM_EDIT_REDO 10102 #define IDM_EDIT_DELETE 10103 #define IDM_EDIT_CUT 10104 #define IDM_EDIT_COPY 10105 #define IDM_EDIT_PASTE 10106

#define IDM_EDIT_SELECTALL 10107 #define IDM_HELP_ABOUT 10201 IDM_MENU MENUEX BEGIN

POPUP \文件\ BEGIN

MENUITEM \新建\ MENUITEM \打开\ MENUITEM \保存\

MENUITEM \另存为...\ MENUITEM \

MENUITEM \退出\ END

POPUP \编辑\ BEGIN

MENUITEM \撤销\ MENUITEM \前进\ MENUITEM \删除\ MENUITEM \

MENUITEM \剪切\ MENUITEM \复制\ MENUITEM \粘贴\

MENUITEM \全选\ END

POPUP \帮助\ BEGIN

MENUITEM \关于\ END END

记事本Dlg.rc

#define IDD_DLG 1000

- 3 -

#define IDC_TOOLBAR 1001 #define IDC_RICHEDIT 1002

IDD_DLG DIALOGEX 228,88,596,499 CAPTION \记事本\FONT 7,\宋体\CLASS \STYLE 0x96CF0000 EXSTYLE 0x00000000 BEGIN CONTROL

\ CONTROL

\END

关于Dlg.rc

#define IDD_DLG1 3000 #define IDC_STC1 1001 #define IDC_IMG1 3001

IDD_DLG1 DIALOGEX 266,133,136,50 CAPTION \关于\

FONT 9,\宋体\STYLE 0x10CF0000 EXSTYLE 0x00000080 BEGIN

CONTROL \汇编记事本 计科B093 杜晓春\ IDC_STC1,\

CONTROL \END

记事本.inc

include windows.inc include user32.inc include kernel32.inc include shell32.inc include comctl32.inc include comdlg32.inc include gdi32.inc

- 4 -

includelib user32.lib includelib kernel32.lib includelib shell32.lib includelib comctl32.lib includelib comdlg32.lib includelib gdi32.lib

WinMain WndProc AboutProc

;主对话框

IDD_DLG IDC_TOOLBAR IDC_RICHEDIT IDM_MENU

;菜单

IDM_FILE_NEW IDM_FILE_OPEN IDM_FILE_SAVE IDM_FILE_SAVEAS IDM_FILE_PRINT IDM_FILE_EXIT IDM_EDIT_UNDO IDM_EDIT_REDO IDM_EDIT_DELETE IDM_EDIT_CUT IDM_EDIT_COPY IDM_EDIT_PASTE IDM_EDIT_SELECTALL IDM_HELP_ABOUT

;关于

IDD_DLG1 IDC_STC1

;工具栏图标

IDB_TOOLBARMAP ;图标

IDI_ICON

.const

PROTO :DWORD,:DWORD,:DWORD,:DWORD PROTO :DWORD,:DWORD,:DWORD,:DWORD PROTO :DWORD,:DWORD,:DWORD,:DWORD equ 1000 equ 1001 equ 1002 equ 10000 equ 10001 equ 10002 equ 10003 equ 10004 equ 10005 equ 10006 equ 10101 equ 10102 equ 10103 equ 10104 equ 10105 equ 10106 equ 10107 equ 10201 equ 3000 equ 3001 equ 1212 equ 1213 - 5 -

;填充按钮结构

stToolBar TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0>

TBBUTTON<6,IDM_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<7,IDM_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<8,IDM_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0>

TBBUTTON<0,IDM_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<1,IDM_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<2,IDM_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0>

TBBUTTON<3,IDM_EDIT_UNDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<4,IDM_EDIT_REDO,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON<5,IDM_EDIT_DELETE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0> TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0> nToolBar equ 13

RichEditDLL db 'riched20.dll',0 szClassName db 'DLGCLASS',0 szAppName db '记事本',0

OpenFileFail db '无法打开文件',0 SaveFileFail db '无法保存文件',0

szWantToSave db '是否将改动保存到',0Dh,0 NewFileName db '新建文件',0 szNULL db 0

szFont db '宋体',0 szFileType db '文本文档(*.txt)',0,'*.txt',0 db '所有文件(*.*)',0,'*.*',0,0 szDefExt db 'txt',0

.data?

hRichEdDLL dd ? hInstance dd ? CommandLine dd ? hIcon dd ? hWinMain dd ? hRichEdit dd ? hFile dd ?

FileName db 100 dup(?)

记事本.asm

- 6 -

.386

.model flat,stdcall option casemap:none

include 记事本.Inc

.code

start:

invoke GetModuleHandle,NULL mov hInstance,eax ;获取命令行参数

invoke GetCommandLine mov CommandLine,eax ;装入库

invoke LoadLibrary,addr RichEditDLL mov hRichEdDLL,eax

invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT push eax ;释放库

invoke FreeLibrary,hRichEdDLL pop eax

invoke ExitProcess,eax

WinMain proc _hInstance,_hPrevInstance,_lpCmdLine,_nCmdShow LOCAL @stWndClass:WNDCLASSEX LOCAL @stMsg:MSG

;设计窗口类 mov @stWndClass.cbSize,SIZEOF WNDCLASSEX mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW mov @stWndClass.lpfnWndProc,OFFSET WndProc mov @stWndClass.cbClsExtra,NULL mov @stWndClass.cbWndExtra,DLGWINDOWEXTRA push _hInstance pop @stWndClass.hInstance mov @stWndClass.hbrBackground,NULL mov @stWndClass.lpszMenuName,IDM_MENU mov @stWndClass.lpszClassName,OFFSET szClassName invoke LoadIcon,_hInstance,IDI_ICON mov hIcon,eax mov @stWndClass.hIcon,eax mov @stWndClass.hIconSm,eax

- 7 -

invoke LoadCursor,NULL,IDC_ARROW mov @stWndClass.hCursor,eax ;注册窗口

invoke RegisterClassEx,addr @stWndClass ;建立对话框窗口

invoke DialogBoxParam,_hInstance,IDD_DLG,NULL,addr WndProc,NULL ret

WinMain endp

StreamProc proc _dwCookie,_pBuffer,_NumBytes,_lpBytes

.if _dwCookie

invoke ReadFile,hFile,_pBuffer,_NumBytes,_lpBytes,0 .else

invoke WriteFile,hFile,_pBuffer,_NumBytes,_lpBytes,0 .endif xor eax,eax ret

StreamProc endp

SetWinCaption proc

LOCAL @buffer[120]:BYTE LOCAL @buffer1[4]:BYTE

;复制程序名

invoke lstrcpy,addr @buffer,addr szAppName ;添加‘-’到标题名 mov eax,' - ' mov dword ptr @buffer1,eax

invoke lstrcat,addr @buffer,addr @buffer1 ;添加文件路径到标题名

invoke lstrcat,addr @buffer,addr FileName ;设置标题栏

invoke SetWindowText,hWinMain,addr @buffer ret

SetWinCaption endp

SaveFile proc _lpFileName

LOCAL @stEditstream:EDITSTREAM

;创建新文件,如果已经存在则清除源文件 invoke CreateFile,_lpFileName,GENERIC_WRITE,

- 8 -

FILE_SHARE_READ,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0 ;创建成功

.if eax!=INVALID_HANDLE_VALUE mov hFile,eax ;流出标志 mov @stEditstream.dwCookie,FALSE ;回调函数 mov @stEditstream.pfnCallback,offset StreamProc ;richedit中的文本写入文件

invoke SendMessage,hRichEdit,EM_STREAMOUT,SF_TEXT, addr @stEditstream ;关闭文件

invoke CloseHandle,hFile ;修改标志清零

invoke SendMessage,hRichEdit,EM_SETMODIFY,FALSE,0 mov eax,FALSE .else

invoke MessageBox,hWinMain,addr SaveFileFail, addr szAppName,MB_OK mov eax,TRUE .endif ret

SaveFile endp

SaveEditAs proc

LOCAL @stOpenFileName:OPENFILENAME LOCAL @buffer[MAX_PATH]:BYTE LOCAL @buffer1[100]:BYTE ;清零

invoke RtlZeroMemory,addr @stOpenFileName, sizeof @stOpenFileName ;填充OpenFileName结构 mov @stOpenFileName.lStructSize,sizeof @stOpenFileName push hWinMain pop @stOpenFileName.hwndOwner;父窗口句柄 push hInstance pop @stOpenFileName.hInstance mov @stOpenFileName.lpstrFilter,offset szFileType mov @buffer[0],0;缓冲区清零 lea eax,@buffer mov @stOpenFileName.lpstrFile,eax;指定全路径缓冲区 mov @stOpenFileName.nMaxFile,sizeof @buffer

- 9 -

mov @buffer1[0],0;缓冲区清零 lea eax,@buffer1 mov @stOpenFileName.lpstrFileTitle,eax;指定文件名缓冲区 mov @stOpenFileName.nMaxFileTitle,sizeof @buffer1 mov @stOpenFileName.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_OVERWRITEPROMPT;设置对话框行为 mov @stOpenFileName.lpstrDefExt,offset szDefExt ;打开另存为通用对话框

invoke GetSaveFileName,addr @stOpenFileName ;保存文件

.if eax

invoke SaveFile,addr @buffer ;设置标题栏

invoke lstrcpy,addr FileName,addr @buffer1 invoke SetWinCaption .endif ret

SaveEditAs endp

SaveEdit proc

;判断是否为新建文件,是的话直接保存,不是的话另存为 invoke lstrcmp,addr FileName,addr NewFileName .if eax

invoke SaveFile,addr FileName .else

invoke SaveEditAs .endif ret

SaveEdit endp

WantToSave proc

LOCAL @buffer[200]:BYTE LOCAL @buffer1[2]:BYTE

;获取修改标志

invoke SendMessage,hRichEdit,EM_GETMODIFY,0,0 ;richedit被修改 .if eax

;制作显示字符串

invoke lstrcpy,addr @buffer,addr szWantToSave invoke lstrcat,addr @buffer,addr FileName

- 10 -

mov ax,'?' mov word ptr @buffer1,ax

invoke lstrcat,addr @buffer,addr @buffer1 invoke MessageBox,hWinMain,addr @buffer, addr szAppName,

MB_YESNOCANCEL or MB_ICONQUESTION .if eax==IDYES

invoke SaveEdit .elseif eax==IDNO mov eax,FALSE .else mov eax,TRUE .endif .endif ret

WantToSave endp

OpenEdit proc

LOCAL @stOpenFileName:OPENFILENAME LOCAL @stEditstream:EDITSTREAM LOCAL @buffer[MAX_PATH]:BYTE LOCAL @buffer1[100]:BYTE

LOCAL @stCharRange:CHARRANGE

;清零

invoke RtlZeroMemory,addr @stOpenFileName, sizeof @stOpenFileName ;填充OpenFileName结构 mov @stOpenFileName.lStructSize,sizeof @stOpenFileName push hWinMain pop @stOpenFileName.hwndOwner;父窗口句柄 push hInstance pop @stOpenFileName.hInstance mov @stOpenFileName.lpstrFilter,NULL mov @buffer[0],0;缓冲区清零 lea eax,@buffer mov @stOpenFileName.lpstrFile,eax;指定全路径缓冲区 mov @stOpenFileName.nMaxFile,sizeof @buffer mov @buffer1[0],0;缓冲区清零 lea eax,@buffer1 mov @stOpenFileName.lpstrFileTitle,eax;指定文件名缓冲区 mov @stOpenFileName.nMaxFileTitle,sizeof @buffer1 mov @stOpenFileName.lpstrDefExt,NULL

- 11 -

mov @stOpenFileName.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST;设置对话框行为 ;显示打开通用对话框

invoke GetOpenFileName,addr @stOpenFileName .if eax

;打开已存在的文件

invoke CreateFile,addr@buffer,

GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,0 ;打开文件成功

.if eax!=INVALID_HANDLE_VALUE ;返回文件句柄 mov hFile,eax

;获取打开文件的文件名

invoke lstrcpy,addr FileName,addr @buffer1 ;流入标记 mov @stEditstream.dwCookie,TRUE ;设置回调函数 mov @stEditstream.pfnCallback,offset StreamProc ;装入文本

invoke SendMessage,hRichEdit,EM_STREAMIN,

SF_TEXT,addr @stEditstream ;关闭文件

invoke CloseHandle,hFile ;修改标志清零

invoke SendMessage,hRichEdit,EM_SETMODIFY,FALSE,0 ;初始化光标位置 mov @stCharRange.cpMin,0 mov @stCharRange.cpMax,0

invoke SendMessage,hRichEdit,EM_EXSETSEL,0,addr @stCharRange

invoke SetWinCaption mov eax,FALSE .else

invoke MessageBox,hWinMain,addr OpenFileFail, addr szAppName,MB_OK mov eax,TRUE .endif .endif ret

OpenEdit endp

- 12 -

InitRichEdit proc _hWin,_hRichEdit LOCAL @stCharRange:CHARRANGE LOCAL @stCharformat:CHARFORMAT

invoke GetDlgItem,_hWin,IDC_RICHEDIT mov hRichEdit,eax ;全选 mov @stCharRange.cpMin,0 mov @stCharRange.cpMax,-1

invoke SendMessage,hRichEdit,EM_EXSETSEL,0, addr @stCharRange ;设置文本格式 mov @stCharformat.cbSize,sizeof @stCharformat mov @stCharformat.dwMask,CFM_CHARSET or CFM_FACE or CFM_SIZE invoke lstrcpyn,addr @stCharformat.szFaceName, addr szFont,LF_FACESIZE mov @stCharformat.yHeight,250

invoke SendMessage,hRichEdit,EM_SETCHARFORMAT,

SCF_SELECTION,addr @stCharformat ;修改标志清零

invoke SendMessage,hRichEdit,EM_SETMODIFY,FALSE,0 ;设置焦点

invoke SetFocus,hRichEdit ;设置光标 mov @stCharRange.cpMin,0 mov @stCharRange.cpMax,0

invoke SendMessage,hRichEdit,EM_EXSETSEL,0, addr @stCharRange ret

InitRichEdit endp

DoToolBar proc _hInstance,_hToolBar LOCAL @stTmap:TBADDBITMAP

invoke SendMessage,_hToolBar,TB_BUTTONSTRUCTSIZE, sizeof TBBUTTON,0 ;填充位图结构

push _hInstance pop @stTmap.hInst mov @stTmap.nID,IDB_TOOLBARMAP ;装载工具栏位图

invoke SendMessage,_hToolBar,TB_ADDBITMAP,15,addr @stTmap ;添加按钮

- 13 -

invoke SendMessage,_hToolBar,TB_ADDBUTTONS,nToolBar, addr stToolBar ;返回工具栏句柄 mov eax,_hToolBar ret

DoToolBar endp

AboutProc proc _hWin,_stMsg,_wParam,_lParam

mov eax,_stMsg .if eax==WM_CLOSE

invoke EndDialog,_hWin,0 .endif

xor eax,eax ret AboutProc endp

WndProc proc _hWin,_stMsg,_wParam,_lParam LOCAL @stRect:RECT LOCAL @height:DWORD LOCAL @hContrl:HWND

LOCAL @stCharRange:CHARRANGE

mov eax,_stMsg

.if eax==WM_INITDIALOG ;主窗口句柄赋值 mov eax,_hWin mov hWinMain,eax ;工具栏初始化

invoke GetDlgItem,_hWin,IDC_TOOLBAR invoke DoToolBar,hInstance,eax ;标题栏初始化

invoke lstrcpy,addr FileName,addr NewFileName invoke SetWinCaption ;Richedit初始化

invoke GetDlgItem,_hWin,IDC_RICHEDIT mov hRichEdit,eax

invoke InitRichEdit,_hWin,hRichEdit .elseif eax==WM_COMMAND mov eax,_wParam

.if eax==IDM_FILE_NEW invoke WantToSave .if !eax

- 14 -

;Richedit清零

invoke SetWindowText,hRichEdit,addr szNULL ;Richedit初始化

invoke InitRichEdit,_hWin,hRichEdit ;重置标题栏

invoke lstrcpy,addr FileName,addr NewFileName invoke SetWinCaption .endif

invoke SetFocus,hRichEdit .elseif eax==IDM_FILE_OPEN invoke WantToSave .if !eax

invoke OpenEdit .endif

invoke SetFocus,hRichEdit .elseif eax==IDM_FILE_SAVE invoke SaveEdit

invoke SetFocus,hRichEdit .elseif eax==IDM_FILE_SAVEAS invoke SaveEditAs

invoke SetFocus,hRichEdit .elseif eax==IDM_FILE_EXIT

invoke SendMessage,_hWin,WM_CLOSE,0,0 .elseif eax==IDM_EDIT_UNDO

invoke SendMessage,hRichEdit,EM_UNDO,0,0 .elseif eax==IDM_EDIT_REDO

invoke SendMessage,hRichEdit,EM_REDO,0,0 .elseif eax==IDM_EDIT_DELETE

invoke SendMessage,hRichEdit,EM_REPLACESEL,TRUE,0 .elseif eax==IDM_EDIT_CUT

invoke SendMessage,hRichEdit,WM_CUT,0,0 .elseif eax==IDM_EDIT_COPY

invoke SendMessage,hRichEdit,WM_COPY,0,0 .elseif eax==IDM_EDIT_PASTE

invoke SendMessage,hRichEdit,WM_PASTE,0,0 .elseif eax==IDM_EDIT_SELECTALL mov @stCharRange.cpMin,0 mov @stCharRange.cpMax,-1

invoke SendMessage,hRichEdit,EM_EXSETSEL,0, addr @stCharRange .elseif eax==IDM_HELP_ABOUT

invoke DialogBoxParam,hInstance,IDD_DLG1, hWinMain,AboutProc,NULL .endif

- 15 -

.elseif eax==WM_SIZE

invoke GetDlgItem,_hWin,IDC_TOOLBAR mov @hContrl,eax ;重绘工具栏

invoke MoveWindow,@hContrl,0,0,0,0,TRUE ;获取工具栏绘图区

invoke GetWindowRect,@hContrl,addr @stRect ;获取工具栏宽度 mov eax,@stRect.bottom sub eax,@stRect.top push eax ;获取主窗口绘图区

invoke GetClientRect,_hWin,addr @stRect pop eax

;用主绘图区上边位置减去工具栏宽度的值作为richedit控件的上边位置

add @stRect.top,eax ;获取richedit控件的宽度 mov eax,@stRect.bottom sub eax,@stRect.top mov @height,eax ;重绘richedit控件

invoke MoveWindow,hRichEdit,0,@stRect.top, @stRect.right,@height,TRUE .elseif eax==WM_CLOSE

invoke WantToSave .if !eax

invoke DestroyWindow,_hWin .endif .else

invoke DefWindowProc,_hWin,_stMsg,_wParam,_lParam ret .endif

xor eax,eax ret

WndProc endp

end start

- 16 -

七、结果显示

八、感想、收获及体会

理论和实践是存在差距的,学语言尤其如此。只有在实际操作中才能真正的领悟和掌握一门语言。编程环节,想法和算法尤为重要。有想法才存在构想,才能编出实际可用的程序;而算法则是实现构想的途径,一个糟糕的算法会大大拖累程序的运行效率而且浪费自己的时间。我感觉编程就像爬一座高山,沿途到处都是阻碍你前进的巨石,只有坚持翻过去才能看到脚下平坦的风景,只有享受这种乐趣的人才是真正可以和编程为伍的人。

- 17 -

本文来源:https://www.bwwdw.com/article/u2gr.html

Top