汇编语言课程设计报告计算器.docx

上传人:b****5 文档编号:29512749 上传时间:2023-07-24 格式:DOCX 页数:31 大小:280.97KB
下载 相关 举报
汇编语言课程设计报告计算器.docx_第1页
第1页 / 共31页
汇编语言课程设计报告计算器.docx_第2页
第2页 / 共31页
汇编语言课程设计报告计算器.docx_第3页
第3页 / 共31页
汇编语言课程设计报告计算器.docx_第4页
第4页 / 共31页
汇编语言课程设计报告计算器.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

汇编语言课程设计报告计算器.docx

《汇编语言课程设计报告计算器.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告计算器.docx(31页珍藏版)》请在冰豆网上搜索。

汇编语言课程设计报告计算器.docx

汇编语言课程设计报告计算器

*******************

实践教学

*******************

 

理工大学

技术工程学院

2015年春季学期

 

汇编语言实训课程设计

 

题目:

____计算器

专业班级:

_2013级软件工程

(1)班__

姓名:

_______郭益婷__

学号:

13740104

指导教师:

树群

成绩:

_______________

2015计算器任务书

题目:

计算器

学生学号:

杜政毅13740102,惠攀龙13740108,郭益婷13740104

班级:

13软件工程1班

题目类型:

软件工程(R)指导教师:

树群

1、设计目的

用汇编语言编程设计一个简单的计算器,实现四则运算数的交互式输入,并显示运算结果。

通过设计,掌握键盘和鼠标控制、显示输出和基本算术运算指令的应用,进一步提高综合运用知识的能力。

 

2、设计容(包括原始数据、技术参数、条件、设计要求等):

 

使用按键式操作,对任意给定的正确四则运算序列,能按照意图分部计算出其计算的有效结果数值并输出。

3、设计要求

题目的选择是根据汇编语言的特点主要针对系统部的一些中断调用、系统功能调用、系统数据处理、文件数据处理、以及相关的API而设计的,是对所学课程知识较为系统的应用。

  

由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计。

不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善程序。

  另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。

 

4、提交的成果

1.设计说明书一份,容包括:

包含任务书一份

1)中文摘要100字,关键词3-5个。

2)实训题目、容、要求。

3)总体设计(包含几大功能模块)。

4)详细设计(各功能模块的具体实现算法——流程图)

5)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。

6)调试分析(包含各模块的测试用例,及测试结果。

7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试程序的体会等)

8)参考文献、致等。

5、主要参考资料

[1]敬兆等编.《汇编语言程序设计》.:

中国科学技术大学,2008.9 

[2]敬兆等编.《汇编语言程序设计实验教程及习题解答》.:

中国科学技术大学,2008.9 

[3]王爽等编.《汇编语言》.:

清华大学,2003.5 

[4]加恒等编.《新一代汇编语言课程设计》.:

高等教育,2003.6 

[5]路明等编.《汇编语言程序设计》.:

中南大学,2005.8 [6]詹仕华等编.《汇编语言程序设计》.:

中国电力,2008.2 [7]詹仕华等编.《汇编语言程序设计习题解答及课程设计、设计辅导》.:

中国电力,2008.2 

[8]宋彩莉等编.《汇编语言程序设计学习指导》.:

交通大学,2008.2 

6、各阶段时间安排(共1周)

日期

地点

星期一

教师讲解设计要求,准备参考资料

实验室

星期二

分析系统,方案设计

实验室

星期三

方案设计,编程

实验室

星期四

调试程序,书写实训说明书

实验室

星期五

完成实训说明书,答辩

实验室

 

摘要

汇编语言是一种功能很强的程序设计语言,也是利用计算器所有特性并能直接控制硬件的语言。

汇编语言,作为一门语言,对应于高级语言的编译器,需要一个”汇编器”来把汇编语言原文件会变成机器可执行的代码。

高级汇编语言器如:

MASM,TASM等等为我们后来写汇编程序提供了很多类似高级语言的特征,比如结构化,抽象等。

在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。

现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处,回避啊预言的长处在于编写高效且需要对机器硬件精确控制的程序。

本次设计简单计算器支持简单的四则运算。

 

关键词:

汇编语言,计算器,高效,硬件

 

前言

运用汇编语言,制作一个计算的程序,实现简单计算器的一般功能,使用Win32编程设计一个功能及界面风格类似于Windows计算器的计算器程序,只要现标准型计算器。

主要实现的功能:

包含基本的四则运算、倒数运算、平方根运算。

支持存储区的存储、清除、调出、累加等功能。

程序主界面应有操作提示、输入和输出。

输入数值及所需符号后可以进行正确的运算,程序计算其结果值并输出。

表达式中运算分量为有正负号整数,运算符为+、-、*、/,最后结果以十进制数表示。

且程序主界面需为一个由仿windws界面。

汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:

能够直接访问与硬件相关的存储器或I/O端口;能够不受编译器的限制,对生成的二进制代码进行完全的控制;能够对关键代码进行更准确的控制;能够根据特定的应用对代码做最佳的优化,提高运行速度;能够最大限度地发挥硬件的功能。

1总体分析

1.1系统分析

该课程的设计任务是做一个简易计算器,可以实现加减乘除四则运算。

我们要解决的问题有:

以什么方式输入数字、判断是进行什么运算、运算过程中的进位和借位问题、以及如何实现清屏等问题。

本次设计的简单计算器,主要是为了解决数学中的加,减,乘,除,开方的运算问题。

由于在设计之中考虑到了可能会多次计算数据,为此在本次课程设计中我们设计的计算器可一次运行,多次使用。

本程序使用了函数和宏混用的方式实现了代码的较好的可读性,使程序看起来结构严谨。

1.2功能分析

图1-1计算器

●显示区:

文本框,用于显示输入的操作数及结果。

●数字键入区:

在显示区中显示数字、小数点、正负号等。

●运算区:

包含双目运算符(+-*/)、单目运算符(sqrt()、%、1/x)、等于号等。

●记忆区:

清除记忆(MC)、显示记忆(MR)、记忆当前(MS)、记忆加(M+)以及记忆区存储情况的标签。

●清除键区:

退格(Backspace)、清除当前数据(CE)、初始化操作(C)。

2系统总体设计

2.1系统总体分析

本次设计的计算器,主要是为了解决数学中的加、减、乘、除、开方运算的问题。

由于在设计过程中考虑到了可能会多次计算数据,为此本次课程设计我设计的这个简单计算器可以一次运行,多次使用。

根据题目,可以把程序的工作过程主要划分为界面设计、运算表达式输入、计算、结果输出四部分。

因此在编写程序时可以按此把程序大致划分为四个模块。

第一步,界面设计,使用汇编语言设计一个界面风格及功能类似于Windows计算器程序,实现标准型、可靠性、简单性、易学性、实用性的界面。

第二步,运算表达式的输入,对于输入,键盘、鼠标都可进行输入操作。

第三步,计算,通过汇编语言使计算器实现四则运算、倒数运算、平方根运算等计算。

第四步,对于输出,必须能在显示区显示正确的结果。

2.2主模块框图及说明

主程序及窗口主程序结构如图2-1,按照Windows程序标准框架,主程序用于获得并保存本程序的句柄,并调用窗口主程序WinMain创建窗口并进入消息循环。

WinMain程序将获取的消息分发给消息处理程序Calculate进行处理。

图2-1主模块框图

 

3详细设计

3.1主模块及子模块说明

主模块:

主要完成程序的主体框架结构,提供人-程序的交互。

子模块:

主要完成对数据的加工处理。

3.2各模块详细设计

程序源文件包含两个部分:

头文件(Calculator.inc):

头文件中引入程序所需要的库以及常量和函数申明

源文件(Calculator.asm):

汇编程序源代码

(1)在Calculator.inc头文件中统一定义程序所需的头文件及引入库(代码如下)。

;---------------------------头文件声明---------------------------

include\masm32\include\windows.inc

includeuser32.inc

includekernel32.inc

includectl32.inc

;include\masm32\include\dlg32.inc

;include\masm32\include\gdi32.inc

includemasm32.inc

includeshell32.inc

;---------------------------引入库声明---------------------------

includelibuser32.lib

includelibkernel32.lib

includelibctl32.lib

includelibmasm32.lib

includelibshell32.lib

;includelib\masm32\lib\gdi32.lib

;includelib\masm32\lib\dlg32.lib

(2)WinMain主程序用于创建窗口并获取和分发消息(代码如下)。

WinMainprochInst:

DWORD,hPrevInst:

DWORD,CmdLine:

DWORD,CmdShow:

DWORD

LOCALwc:

WNDCLASSEX;窗口类

LOCALmsg:

MSG;消息

LOCALhWnd:

HWND;对话框句柄

Movwc.cbSize,sizeofWNDCLASSEX;WNDCLASSEX的大小

movwc.style,CS_BYTEALIGNWINDOWorCS_BYTEALIGNWINDOW;窗口风格orCS_HREDRAWorCS_VREDRAW

movwc.lpfnWndProc,OFFSETCalculate;窗口消息处理函数地址

movwc.cbClsExtra,0;在窗口类结构后的附加字节数,共享存

movwc.cbWndExtra,DLGWINDOWEXTRA;在窗口实例后的附加字节数(!

注意点)

moveax,hInst

movwc.hInstance,eax;窗口所属程序句柄

movwc.hbrBackground,COLOR_BTNFACE+1;背景画刷句柄

movwc.lpszMenuName,NULL;菜单名称指针

movwc.lpszClassName,OFFSETDialogName;类名称指针

invokeLoadIcon,hInst,addrIconName;加载Icon

movwc.hIcon,eax;图标句柄

invokeLoadCursor,NULL,IDC_ARROW

movwc.hCursor,eax;光标句柄

movwc.hIconSm,0;窗口小图标句柄

invokeRegisterClassEx,addrwc;注册窗口类

invokeCreateDialogParam,hInst,addrDialogName,0,addrCalculate,0;调用对话框窗口

movhWnd,eax;保存对话框句柄

invokeShowWindow,hWnd,CmdShow;最后一个参数可设置为SW_SHOWNORMAL

invokeUpdateWindow,hWnd;更新窗口

StartLoop:

;消息循环

invokeGetMessage,addrmsg,0,0,0;获取消息

cmpeax,0

jeExitLoop

invokeTranslateMessage,addrmsg;转换键盘消息

invokeDispatchMessage,addrmsg;分发消息

jmpStartLoop

ExitLoop:

;结束消息循环

moveax,msg.wParam

ret

WinMainendp

(3)消息处理程序用于处理用户消息(代码如下)。

CalculateprochWin:

DWORD,uMsg:

UINT,aParam:

DWORD,bParam:

DWORD

LOCALpt:

POINT

.ifuMsg==WM_INITDIALOG

invokeGetDlgItem,hWin,ID_RESULT;获取输出文本框句柄

movhEdit,eax;保存文本框句柄

invokeGetDlgItem,hWin,ID_M;获取记忆标签句柄

movhTextM,eax;保存记忆标签句柄

invokeLoadIcon,hInstance,addrIconName;载入Icon

movhIcon,eax;保存Icon句柄

nvokeSendMessage,hWin,WM_SETICON,ICON_SMALL,eax

invokeLoadMenu,hInstance,addrMenuName;加载菜单

movhMenu,eax;保存菜单句柄

invokeSetMenu,hWin,eax

invokeCheckMenuRadioItem,hMenu,ID_STANDARD,ID_SCIENCE,ID_STANDARD,MF_BYMAND;选中标准型

invokeSendMessage,hEdit,WM_SETTEXT,0,addrOutput;显示"0."

.elseifuMsg==WM_SIZE

.ifaParam==SIZE_MINIMIZED;最小化

movNotifyIcon.cbSize,sizeofNOTIFYICONDATA

pushhWin

popNotifyIcon.hwnd

movNotifyIcon.uID,ID_NOTIFYICON

movNotifyIcon.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP

movNotifyIcon.uCallbackMessage,WM_SHELLNOTIFY

moveax,hIcon

movNotifyIcon.hIcon,eax

invokelstrcpy,addrNotifyIcon.szTip,addrProgramName

invokeShowWindow,hWin,SW_HIDE;隐藏窗口;

invokeShell_NotifyIcon,NIM_ADD,addrNotifyIcon

.endif

.elseifuMsg==WM_SHELLNOTIFY

.ifaParam==ID_NOTIFYICON

.if(bParam==WM_LBUTTONDOWN);单击通知栏图标

invokeShowWindow,hWin,SW_SHOW;显示窗口

invokeShell_NotifyIcon,NIM_DELETE,addrNotifyIcon;删除通知栏图标

.elseif(bParam==WM_RBUTTONDOWN);右键通知栏图标

invokeGetCursorPos,addrpt

invokeGetSubMenu,hMenu,3

invokeTrackPopupMenu,eax,TPM_LEFTALIGN,pt.x,pt.y,NULL,hWin,NULL

.endif

.endif

.elseifuMsg==WM_CHAR;热键操作

moveax,aParam

subeax,'0'

addeax,ID_NUM0

.if(eax>=ID_NUM0)&&(eax<=ID_NUM9);数字按钮

invokeCalculate,hWin,WM_MAND,eax,0

.elseif(eax==0ffh);ID_COPY

invokeCalculate,hWin,WM_MAND,ID_COPY,0

.elseif(eax==112h);ID_PASTE

invokeCalculate,hWin,WM_MAND,ID_PASTE,0

.elseif(eax==104h);ID_BACK

invokeCalculate,hWin,WM_MAND,ID_BACK,0

.elseif(eax==265);ID_EQU

invokeCalculate,hWin,WM_MAND,ID_EQU,0

.elseif(eax==298);ID_POINT

invokeCalculate,hWin,WM_MAND,ID_POINT,0

.elseif(eax==295);ID_ADD

invokeCalculate,hWin,WM_MAND,ID_ADD,0

.elseif(eax==297);ID_SUB

invokeCalculate,hWin,WM_MAND,ID_SUB,0

.elseif(eax==294);ID_MUL

invokeCalculate,hWin,WM_MAND,ID_MUL,0

.elseif(eax==299);ID_DIV

invokeCalculate,hWin,WM_MAND,ID_DIV,0

.endif

.elseifuMsg==WM_MAND

moveax,aParam

.ifeax==ID_CE;清零按钮CE

leaesi,Output

movBYTEPTR[esi],'0'

movBYTEPTR[esi+1],'.'

movBYTEPTR[esi+2],0

.ifIsError==1

invokeInit

.endif

invokeSendMessage,hEdit,WM_SETTEXT,0,addrOutput

.elseifeax==ID_C;初始化按钮C

invokeCalculate,hWin,WM_MAND,ID_CE,bParam

invokeInit

.elseifIsError==1ret.elseifeax==ID_BACK;退格按钮Backspace

invokeUnpackNum

.ifIsStart==0

leaesi,Output

.whileBYTEPTR[esi]!

=0

incesi

.endw

.ifBYTEPTR[esi-1]=='.'

.ifHasPoint==1

movHasPoint,0

.else

.ifBYTEPTR[esi-3]=='-'

leaesi,Output

movBYTEPTR[esi],'0'

movBYTEPTR[esi+1],'.'

movBYTEPTR[esi+2],0

.else

movBYTEPTR[esi-2],'.'

movBYTEPTR[esi-1],0

.endif

.endif

.else

movBYTEPTR[esi-1],0

.endif

leaesi,Output

.ifBYTEPTR[esi]=='.'

movBYTEPTR[esi],'0'

movBYTEPTR[esi+1],'.'

movBYTEPTR[esi+2],0

.endif

invokeShowNum

.endif

.elseif(eax>=ID_NUM0)&&(eax<=ID_NUM9);数字按钮

.ifHasEqueal==1

invokeInit

.endif

invokeBtnNum,eax

.elseifeax==ID_POINT;小数点按钮

movBYTEPTRHasPoint,1

movBYTEPTRIsStart,0

.elseifeax==ID_NEG;正负号按钮

invokeUnpackNum

invokeStrToFloat,addrOutput,addrNumber

finit

fldz

fldNumber

fsub

fstpNumber

invokeFloatToStr2,Number,addrOutput

invokeShowNum

.elseif(eax>=ID_MUL)&&(eax<=ID_ADD);双目运算符按钮

invokeBtnOperator

.elseifeax==ID_EQU;等于按钮

invokeBtnEqual

.elseifeax==ID_PER;百分号按钮

movOperator,'*'

invokeGetResult

invokeUnpackNum

invokeStrToFloat,addrOutput,addrNumber

finit

fldNumber

fldNum100

fdiv

fstpNumber

invokeFloatToStr2,Number,addrOutput

invokeShowNum

.elseifeax==ID_DAO;倒数按钮

invokeUnpackNum

invokeStrToFloat,addrOutput,addrNumber

finit

fldNumber

fldz

fiST(0),ST

(1)

jnzNotZero

movIsError,1

invokeSendMessage,hEdit,WM_SETTEXT,0,addrDiv0

ret

NotZero:

fstpNumber

fstpNumber

fld1

fldNumber

fdiv

.ifHasEqueal==1

fstResult

.endif

fstpNumber

invokeFloatToStr2,Number,addrOutput

invokeShowNum

.elseifeax==ID_SQRT;开方按钮

invokeUnpackNum

invokeStrToFloat,addrOutput,addrNumber

finit

fldNumber

fldz

fiST(0),ST

(1)

Positive

movIsError,1

invokeSendMessage,hEdit,WM_SETTEXT,0,addrFunctionError

ret

Positive:

fstpNumber

fsqrt

.ifHasEqueal==1

fstResult

.endif

fstpNumber

invokeFloatToStr2,Number,addrOutput

invokeShowNum

.elseifeax==ID_MC;MC按钮

fldz

fstpRemember

invokeSendMessage,hTextM,WM_SETTEXT,0,NULL

.elseifeax==ID_MR;MR按钮

invokeFloatToStr2,Remember,addrOutput

invokeShowNum

movIsStart,0

.elseifeax==ID_MS;MS按钮

invo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1