版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言实训任务书题目 计算器学生姓名学号: 杜政毅 12730102,惠攀龙 12730108,郭益婷13730104班级:13软件工程1班题目类型:软件工程(R)指导教师:刘树群一、设计目的用汇编语言编程设计一个简单的计算器,实现四则运算数的交互式输入,并显示运算 结果。通过设计,掌握键盘和鼠标控制、显示输出和基本算术运算指令的应用,进一步提高综合运用知识的能力。二、设计内容 (包括原始数据、技术参数、条件、设计要求等):使用按键式操作,对任意给定的正确四则运算序列,能按照意图分部计算出其计算的 有效结果数值并输出。三、设计要求题目的选择是根据汇编语言的特点主要针对系统内部的一些中断调用、
2、系统功能调用、系统数据处理、文件数据处理、以及相关的API而设计的,是对所学课程知识较为系统的应 用。由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的 功能实现上,不要太在意程序的结构和显示界面的设计。不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善程序。另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。四、提交的成果1.设计说明书一份,内容包括:包含任务书一份1)中文摘要100字,关键词3-5个。2)实训题目、内容、要求。3)总体设计(包含几大功能模块)。4)详细设计(各功能模块的具体实现算法一一流程图)5)数
3、据结构设计描述,各模块(函数)的功能介绍,参数说明等。6)调试分析(包含各模块的测试用例,及测试结果。)7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试 程序的体会等)8)参考文献、致谢等。五、主要参考资料1 李敬兆等编汇编语言程序设计合肥:中国科学技术大学出版社,2008.92 李敬兆等编汇编语言程序设计实验教程及习题解答.合肥:中国科学技术大学出版社,2008.93 王爽等编汇编语言北京:清华大学出版社,2003.54 曹加恒等编新一代汇编语言课程设计北京:高等教育出版社,2003.65 杨路明等编汇编语言程序设计长沙:中南大学出版社,2005.8 6詹仕华等编
4、 汇编语言程序设计.北京:中国电力出版社,2008.2 7詹仕华等编.汇编语言程序设计习题解答及课程设计、设计辅导北京:中国电力出版社,2008.28宋彩莉等编汇编语言程序设计学习指导西安:西安交通大学出版社,2008.2六、各阶段时间安排(共1 周)日期内容地点星期一教师讲解设计要求,准备参考资料实验室星期二分析系统,方案设计实验室星期三方案设计,编程实验室星期四调试程序,书写实训说明书实验室星期五完成实训说明书,答辩实验室摘要本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一 个程序,每运行一次可执行程序,可 以实现加减乘除四则运算。计算器是最简 单的计算工具,简单计算器具有
5、加、减 乘、除四项运算功能。想要用汇编语言 实现简单的计算器,就必须通过对数据存储,寄存器的使用加减乘除相关指令以及模块的调用等汇编语言知识进行运用,以实现一个基本功能完善,界面友好, 操作简便易行的计算器。用汇编语言实现简单计算器还涉及到输入输出模块的设 计,加减乘除运算的判断以及退出程序的判断的设计。 通过对各种指令的合理使 用,设计各个功能模块。当实现各个程序模块后,通过程序的调用最终实现一个 简单的计算器。关键字:汇编语言,仿 Windows计算器,四则运算,调用,功能模块目录一、程序设计目的及要求 -5 -1.1设计目的 -5 -1.2设计内容 -5 -1.3设计要求 -5 -二、系
6、统总体分析 -6 -三、详细设计 -7 -3.1主程序及窗口主程序结构 -7 -3.2各功能模块的具体实现 -7 -3.3源文件(Calculator.asm )中各个模块分析 -10-四、调试过程及分析 -19-4.1窗口检测 -19 -4.2四则运算、开方以及倒数运算测试 -19 -五、说明书 -21 -六、心得体会 错误!未定义书签。七、参考文献 -24 -八、致谢 -25 -附录(源程序) -26 -、程序设计目的及要求1.1设计目的本次程序的设计题目是使用汇编实现 设计一个功能及界面风格类似于 Win dows计算器的计算器程序,要求实现标准型计算器 ,其中包含基本的四则运 算、倒数
7、运算、开方运算。支持存储区的存储、清除、调出、累加等功能。计算 器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使 用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的 使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。 通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入 输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判 断的设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使 用汇编语言设计各个功能模块。当实现
8、各个程序模块后,学会通过程序的调用最 终实现一个具有基本计算功能的简单计算器。1.2设计内容使用按键式操作,对任意给定的正确四则运算序列,能按照意图分部计算出 其计算的有效结果数值并输出。1.3设计要求a. 遵循模块化、结构化的编程思路,用汇编实现简单的算法b. 程序必须正确运行c. 程序简明易懂,多标明注释,具有良好的程序书写风格d. 适当优化程序,提高程序的运行效率二、系统总体分析本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程 序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数 的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算, 但是对
9、于 简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算, 而且做的是加法运算、减法运算乘法运算还是除法运算也未可知, 为此我们还要 判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。 设 计程序进行判断所输入的算式是做加法运算、 减法运算、乘法运算还是除法运算, 即判断输入的运算符是 +'号、-'号、 * '号、/'号中的哪一个,因为 输入的格式固定了,所以只需要把存进数据区的第三个字符拿
10、来与加减乘除四个 运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。根据计算器程序所要实现的功能完成各个功能模块。设计程序主体部分,根据主 体部分所需的功能模块对各个子模块一一进行设计编写。子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div 除法运算模块,in put输入模块等。最后还要对这个简易计算器进行功能完善。 为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式 后,按下enter键或是='符号键时,程序依据输入的算式进行计算,并将结 果显示在屏幕上。如果用户输入错误,则返回,提示信息
11、让用户重新输入算式, 当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题 模块的合理调用,最终实现一个具有简单运算功能的计算器。三、详细设计3.1主程序及窗口主程序结构按照系统总体分析,主程序用于获得并保存本程序的句柄,并调用窗口主程序Win Mai n创建窗口并进入消息循环。Win Mai n程序将获取的消息分发给消息处 理程序Calculate进行处理。消息处理程序Calculate用于相应窗口创立、销毁、Calculate窗口主程序(开姑调膚歯口主程庠WlnMain训© 如1 胡阿417退出程呼Eki tPrnc*!;按键等消息并进行处理。主程序和窗口主程序
12、结构及消息处理程序 结构图如3-1所示:st arCL电宕乍卫女调问対话程程字Cr aatisDi alogPyn显寻雇口ShevWisiddwtIjpd4.tftw3rld.aw驶戢消息GelNesEeifeWinMamTranslateNessaigeDi spatchMessaae乜息处两程宇Calculate.;'退出消息?.d±l 图3-1主程序和窗口主程序及消息处理程序结构图主程序流程图及原代码如下:in voke GetModuleHa ndle,NULL ; 获得并保存本程序的句柄 mov hln sta nce,eaxin voke WinMain ,hl
13、nsta nce,0,0,SW_SHOWDEFAULT invoke ExitProcess,eax ; 退出程序,返回 eax 值3.2各功能模块的具体实现(1)将Calculator.inc头文件中统一定义程序所需的头文件及引入库源程序如下:; 头文件声明in clude win dows.i ncin clude user32.i ncin clude kernel32.i nc(2)在 Calculatornc中定义程序所需常量如下:ID_NUM0equ 300ID_NUM1equ 301ID_NUM2equ 302ID_NUM3equ 303ID_NUM4equ 304ID_NUM5
14、equ 305ID_NUM6equ 306ID_NUM7equ 307ID_NUM8equ 308ID_NUM9equ 309ID_NEGequ 310ID_POINTequ 311ID_MULequ 312ID_DIVequ 313ID_SUBequ 314ID_ADDequ 315ID_EQUequ 316ID_PERequ 317ID_DAOequ 318ID_SQRTequ 319ID_MCequ 320ID_MRequ 321ID_MSequ 322ID_MPLUSequ 323ID_Mequ 324ID_BACKequ 325ID_CEequ 326ID_Cequ 327ID_RE
15、SULTequ 328ID_COPYequ 1001ID_PASTEequ 1002ID_STANDARD equ 1003ID_SCIENCEequ 1004ID_PACKETequ 1006ID_HELPequ 1007ID_ABOUTequ 1008ID_EXIT equ1009ID_NOTIFYICON equ 2000 WM_SHELLNOTIFY equ WM_USER+1(3)在Calculatornc声明了自定义函数的原型,主要有窗口主程序Calculate、消息处理程序、数字分组子程序、数字不分组子程序、数字按键消 息处理程序、显示数据子程序、显示存储信息子程序、计算结果子程
16、序、双目运 算符消息处理程序、初始化计算器子程序、等于消息处理程序等函数声明如下:; 函数声明Win Mai nPROTO :DWORD, :DWORD, :DWORD, :DWOR窗 口 主程序 Calculate PROTO :DWORD,:DWORD,:DWORD,:DWORg 息处理程序PackNum PROTO ;数字分组子程序UnpackNum PROTO ;数字不分组子程序BtnNumPROTO :DWORD数字按键消息处理程序ShowNum PROTO ShowTextM PROTO Init PROTO;GetResult PROTO Btn Operator PROTO B
17、tn Equal PROTO显示数据子程序 显示存储信息子程序 初始化计算器子程序计算结果子程序 双目运算符消息处理程序 等于消息处理程序(4)数据段定义如下:.dataHelpFile db "rc.hlp",0 ;帮助文档hI nsta needd ?;主程序句柄hEdit dd ?;输出文本框句柄hTextM dd ?; 记忆标签句柄 hMe nu dd ?;菜单句柄hIco n dd ?;Ico n句柄DialogName db "Calculator",。 ;对话框名称Menu Name db "Me nu",0;菜单名称I
18、conN amedb "Ico n",0;Ic on名称TextMdb 'M',0 ;MOutputdb "0.",0,30 dup(0);输出字符串IsStart db 1;判断是否运算开始 判断是否存在小数点HasPoi ntdb 0;HasEqueal db 0;判断是否存在等号Remember dq 0.0;记忆数据Numberdq 0.0;记录临时数据Resultdq 0.0;记录结果Opera nddq 0.0;记录操作数IsPacketdb 0;数字分组Operatordb '.'记录运算符IsErrordb
19、 0记录是否出现异常Div0db"除数不能为零。",0Function Error db "函数输入无效。",0hGlobal HANDLE ?;剪切板内存块句柄pGlobal dd ? ;po in ter to allocate memoryNumLittle REAL8 1.0E-12|Num10 REAL8 10.0; 实数 10Num100 REAL8 100.0; 实数 100NotifyIco n NOTIFYICONDATA<> ;通知栏图标3.3源文件(Calculator.asm )中各个模块分析(1) WinMain主程
20、序用于创建窗口并获取和分发消息。a.窗口创建,主要包括窗口类的注册、窗口的风格以及窗口消息处理和更新窗 口等。Win Mai n proc hI nst:DWORD, hPrevI nst:DWORD, CmdLi ne:DWORD;mdShow:DWORDLOCAL wc:WNDCLASSEX;窗口类LOCAL msg:MSG;消息LOCAL hWnd:HWND;对话框句柄mov wc.cbSize,sizeof WNDCLASSEX ;WNDCLASSEX 的大小mov wc.style,CS_BYTEALIGNWINDOW or CS_BYTEALIGNWIND窗口风格 or CS_HR
21、EDRAW or CS_VREDRAWmov wc.lpfnWndProc,OFFSET Calculate ;窗口消息处理函数地址mov wc.cbClsExtra,0 ;在窗口类结构后的附加字节数,共享内存movwc.cbWndExtra,DLGWINDOWEXTRA在窗口实例后的附加字节数(!注意点) mov eax,hI nstmov wc.h In sta nce,eax;窗口所属程序句柄mov wc.hbrBackgrou nd,COLOR_BTNFACE+1 背景画刷句柄 mov wc.lpszMe nuName,NULL;菜单名称指针mov wc.lpszClassName,O
22、FFSET DialogName ;类名称指针 invoke LoadIcon,hlnst,addr IconName ;力口载 Iconmov wc.hIco n,eax;图标句柄in voke LoadCursor,NULL,IDC_ARROWmov wc.hCursor,eax;光标句柄mov wc.hIco nSm,0;窗口小图标句柄inv oke RegisterClassEx,addr wc ;注册窗口类inv oke CreateDialogParam,hI nst,addr DialogName,0,addr Calculate,0 ;调用对话框窗口mov hWnd,eax;保
23、存对话框句柄in voke ShowWi ndow,hWnd,CmdShow ;最后一个参数可设置为b.消息处理,主要包含窗口的更新、消息循环、获取消息以及键盘转换消息、消 息的分发和消息循环的结束。SW_SHOWNORMALin voke UpdateWi ndow,hWnd;更新窗口StartLoop:;消息循环in voke GetMessage,addr msg,0,0,0;获取消息cmp eax,0je ExitLoopinv oke Tran slateMessage,addr msg;转换键盘消息inv oke DispatchMessage,addr msg;分发消息jmp S
24、tartLoopExitLoop:;结束消息循环mov eax,msg.wParamretWin Mai n endp(2) 消息处理程序用于处理用户消息,其中包括窗口的显示、关闭、隐藏和最小 化以及数字按钮、开方按钮、粘贴复制等热键操作。|a. 窗口消息处理,窗口最大化、最小化、隐藏和显示窗口等消息处理。.if aParam=SIZE_MINIMIZED;最小化mov NotifyIco n. cbSize,sizeof NOTIFYICONDATApush hWinpop NotifyIc on .hw ndmov NotifyIco n.ulD,ID_NOTIFYICONmov Noti
25、fyIc on .uFlags,NIFCON+NIF_MESSAGE+NIF_TIPmov NotifyIco n.uCallbackMessage,WM_SHELLNOTIFYmov eax,hIc onmov NotifyIc on .hlc on, eaxinv oke lstrcpy,addr NotifyIc on. szTip,addr ProgramNamein voke ShowWi ndow,hWi n,SW_HIDE;隐藏窗口;in voke Shell_NotifyIco n, NIM_ADD,addr NotifyIco n.en dif.elseif uMsg = W
26、M_SHELLNOTIFY.if aParam=ID_NOTIFYICON.if (bParam=WM_LBUTTONDOWN) ;单击通知栏图标in voke ShowWi ndow,hWi n,SW_SHOW ;显示窗口in voke Shell_NotifyIco n, NIM_DELETE,addr NotifyIco n ;删除通知栏图标.elseif (bParam=WM_RBUTTONDOWN);右键通知栏图标inv oke GetCursorPos,addr ptin voke GetSubMe nu,hMe nu,3in voke TrackPopupMe nu,eax,TP
27、M_LEFTALIGN,pt.x,pt.y,NULL,hWi n,NULL.en difinv oke ShowNum.en difb. 部分按钮的热键操作,数字按钮和运算按钮的操作。.elseif uMsg = WM_CHAR;热键操作mov eax,aParamsub eax,'0'add eax,ID_NUM0.if (eax>=ID_NUMO) && (eax<=ID_NUM9);数字按钮in voke Calculate,hWi n,WM_COMMAND,eax,O.elseif (eax=0ffh);ID_COPYin voke Calc
28、ulate,hWi n, WM_COMMAND,ID_COPY,0.elseif (eax=112h);ID_PASTEin voke Calculate,hWi n,WM_COMMAND,ID_PASTE,0.elseif (eax=104h);ID_BACKin voke Calculate,hWi n,WM_COMMAND,ID_BACK,0.elseif (eax=265);ID_EQUin voke Calculate,hWi n,WM_COMMAND,ID_EQU,0.elseif (eax=298);ID_POINTin voke Calculate,hWi n, WM_COMM
29、AND,ID_POINT,0.elseif(eax=295);ID_ADDin voke Calculate,hWi n, WM_COMMAND,ID_ADD,0.elseif (eax=297);ID_SUBin voke Calculate,hWi n,WM_COMMAND,ID_SUB,0.elseif (eax=294);ID_MULin voke Calculate,hWi n,WM_COMMAND,ID_MUL,0.elseif (eax=299);ID_DIVin voke Calculate,hWi n,WM_COMMAND,ID_DIV,0.en dif.elseif (ea
30、x >= ID_MUL) && (eax <= ID_ADD);双目运算符按钮inv oke Btn Operator.elseif eax = ID_EQU;等于按钮inv oke Btn Equal.elseif eax = ID_PER;百分号按钮mov Operator,'*'inv oke GetResultinv oke Un packNuminv oke StrToFloat,addr Output, addr Numberfinitfld Numberfld Num100fdivfstp Numberinvoke FloatToStr
31、2,Number,addr Outputinv oke ShowNum.elseif eax = ID_DAO;倒数按钮inv oke Un packNuminv oke StrToFloat,addr Output, addr Numberfinitfld Numberfldzfcomi ST(0),ST(1)jnz NotZeromov IsError,1in voke Sen dMessage,hEdit,WM_SETTEXT,0,addr Div0retNotZero:fstp Numberfstp Number fldl fld Number fdiv.if HasEqueal=1
32、fst Result.en dif fstp Numberinvoke FloatToStr2,Number,addr Output inv oke ShowNum c复制粘贴按钮,主要包括字符串的复制粘贴、剪切板的清空等功能的实现。.elseif eax = ID_COPY;复制invoke GlobalAlloc,GMEM_MOVEABLE,35 ;配置一个内存块mov hGlobal ,eaxin voke GlobalLock,hGlobal;锁定内存块mov pGlobal ,eaxlea esi,Outputmov edi,pGlobalmov ecx,35rep movsb;in
33、 voke GlobalU nlock,hGlobal;in voke Ope nClipboard, NULL;inv oke EmptyClipboard;in voke SetClipboardData,CF_TEXT,hGlobal inv oke CloseClipboard;.elseif eax = ID_PASTE;in voke IsClipboardFormatAvailable,CF_TEXT ; 格式的数据 in voke Ope nClipboard,NULL;in voke GetClipboardData,CF_TEXT;mov hGlobal,eax inv o
34、ke GlobalLock ,hGlobal;mov pGlobal,eax mov ecx,35 lea edi,Output mov esi,eax rep movsb;in voke GlobalU nlock ,hGlobal;inv oke CloseClipboard;inv oke ShowNum复制字符串 解锁内存块 打开剪切板 清空剪切板把内存句柄交给剪贴簿关闭剪切板粘贴确定剪贴簿是否含有CF_TEXT打开剪切板得到代表文字的内存块代号解锁内存块复制字符串 解锁内存块 关闭剪切板(3) PackNum函数将输出数据的字符串 Output进行数字分组。它首先获取小数 点以前的数
35、字位数并保存在寄存器 eax中,然后将(eax-1)/3即为需要添加的字 符,数目,并保存在eax中,对于小数点以后的字符都向后移动 eax位,对 于小数点以前的字符,向后移动eax位并用ecx计数,当ecx计数到3是添加字 符,并将ecx设为1且eax减一,重复上述步骤直到eax等于0。函数源代 码如下:PackNum proc USES eax ebx ecx edxlea esi,Outputmov eax,0.while (BYTE PTResi!='.')inc eaxinc esi.endw.while (BYTE PTResi!=0)inc esi.endwdec
36、 eaxmov edx,0mov ecx,3div ecx.while (BYTE PTResi!='.')mov bx,esimov esi+eax,bx dec esi.endwmov bx,esimov esi+eax,bxdec esimov ecx,0.while (eax!=0).if(ecx<3)mov bx,esimov esi+eax,bxinc ecx.elsemov BYTE PTResi+eax,','dec eaxmov ecx,1.en difdec esi.endwlea esi,Output.while (BYTE PTRe
37、si!=0)mov bx,esiinc esi.endwretPackNum endp(4) UnpackNum函数将进行数字分组输出的字符串 Output解分组。它首先获取 Output地址存在esi中,然后ecx赋0,并将Output中字符向前移动ecx个单 位,遇见,字符则将ecx加1,直到字符串结束。函数源代码如下:Un packNum proc USES ecxlea esi,Outputmov ecx,0.while (BYTE PTResi+ecx!=0).if(BYTE PTResi=",")inc ecx.en difmov bx,esi+ecxmov e
38、si,bx inc esi.endwret(5) ShowNur函数将Output字符串处理后在文本框中显示出来。它首先调UnpackNumS数对Output解分组,然后获取 Output地址存在esi、edi中,通 过循环将Output尾地址存在esi中,将字符.地址存在edi中,如果edi 等于esi则表明Output中无字符.',则在结尾添加字符.。如果IsPacked 等于1则对Output调用UnpackNumg数对其分组,最后向文本框发送 WM_SETTEXT 消息显示数据。函数源代码如下:ShowNum procinv oke Un packNumlea esi,Outp
39、utlea edi,Output.while (BYTE PTResi!=0)inc esi.endw.while (BYTE PTRedi!='.') && (edi<esi)inc edi.endw.if esi=edimov BYTE PTResi,'.'mov BYTE PTResi+1,0.en dif.if lsPacket=1inv oke PackNum.en difin voke Sen dMessage,hEdit,WM_SETTEXT,0,addr Output retShowNum endp(6) BtnNum函数响
40、应数字按钮消息,向文本框中添加字符。函数源代码如下:BtnNum proc USES eax,Num:DWORDlea esi,Outputmov eax,Numsub eax,252 .if IsStart=1 mov esi,eax inc esi mov BYTE PTResi,'.' inc esi mov BYTE PTResi,0 mov IsStart,0.else.while BYTE PTResi!='.' inc esi.endw.if HasPo in t=1.while BYTE PTResi!=0 inc esi.endwmov esi
41、,ax inc esi mov BYTE PTResi,0.else.if BYTE PTROutput='0'lea esi,Outputmov esi,eaxmov BYTE PTResi+1,'.'mov BYTE PTResi+2,0 .elsemov esi,eaxinc esimov BYTE PTResi,'.' inc esimov BYTE PTResi,0.en dif.en dif.en difinv oke ShowNum retBtnNum endp(7) BtnOperator函数响应运算符按钮消息,进行运算并输出结果
42、。首先判断 是否为等号,如果不是则调用GetResult函数先进行一次运算,然后将当前操作 符存入Operator变量中。函数源代码如下:Btn Operator proc USES eax.if HasEqueal!=1inv oke GetResult.en dif.if eax = ID_MULmov Operator,'*'.elseif eax = ID_DIVmov Operator,'/'.elseif eax = ID_SUBmov Operator,'-'.elseif eax = ID_ADDmov Operator,'
43、;+'.en difmov HasEqueal,0retBtn Operator endp(8) BtnEqual函数响应等号按钮消息,进行运算并输出结果。首先判断是否为 起始状态,如果不是则调用 GetResult函数,并将HasEqual变量置1。函数源 代码如下:Btn Equal proc.if (lsStart=1) && (HasEqueal=O)fstp Numberfst Numberfld Number.en difinv oke GetResultmov HasEqueal,1retBtn Equal endp(9) ShowTextM函数判断Rem
44、embe中的值是否为0,如果不是是则在标签中显 示M ,否则清空标签中内容。函数源代码如下:ShowTextM procfld NumLittlefldzfsub Rememberfabsfcomi ST(0),ST(1)ja NotZeroin voke Sen dMessage,hTextM,WM_SETTEXT,0,NULL jmp PopNumLittleNotZero:i nvoke Sen dMessage,hTextM,WM_SETTEXT,0,addr TextM PopNumLittle:fstp Opera ndfstp Opera ndmov IsStart,1mov H
45、asPo in t,0retShowTextM endpFPU(10) Init函数负责进行必要的初始化操作,如对状态变量的初始化以及的的初始化。函数源代码如下:Init procmov IsStart,1;初始化mov HasPoi nt,0;清除小数点mov HasEqueal,0fldzfst Number;清除结果fst Opera ndmov Operator,'.'清除运算符mov IsError,0finit;初始化FPUretInit endp四、调试过程及分析对程序源代码进行功能调试和功能验证。 程序代码运行成功后,要对窗口进 行检测,再者,分别检验测试其四则
46、运算、开方、倒数运算等功能,并对结果进 行分析。4.1窗口检测看其热键按钮等功能是否能正常使用。其测试如图4-1所示:r-ifTI 吉咅凹 SFJT.H;复制(G CtrkC 姑尼村CrrlhP EMC1 d2l/1顽mIT6%ME1 1L珂-1#Mt0十卜-ZE图4-1窗口测试4.2四则运算、开方以及倒数运算测试进行数据输入,对结果进行分析(1)加法运算,计算2211.045+1000,如图4-2所示:'爲f计富器離旧歸V) 65(H)臨计寡器况牽旧直寿(V)軒弧H)Backspace严你斗M-+1直5jj丄也J_L_3-址Ijl+=2211.045CEC0_蹴 上J命计宫器岳辑旧臣
47、看(V)释則IH)3211.D454 1 56* 1 % 11 1 23-110 +1-+ =1斑知pa怯仁M +图4-2加法运算(2)减算运算,计算170-50,如图4-3所示:E)计算詐llE痼计肓非1胡口 Z两旧«tv)11加.BxkspKE CEC科 CF) SSM50.M+ 0+/-+图4-3减法运算(3)乘法运算,计算100*999,如图4-4所示:图4-4乘法运算(4)除法运算,计算888/222,如图4-5所示:图4-5除法运算(5)开方运算,计算625开方,如图4-6所示:图4-6开放运算(6)倒数运算,计算1000的倒数,如图4-7所示:图4-7倒数运算五、说明书
48、功能分析,如图5-1所示:一 M1Z显示区:文本框,用于显示输入的操作数及结果数字键入区:在显示区中显示数字、小数点、正负号等;运算区:包含双目运算符(+ - * /)、单目运算符(sqrt()、1/x )、等于 号等记忆区:清除记忆(MC、显示记忆(MR、记忆当前(MS、记忆加(M+以 及记忆区存储情况的标签清除键区:退格(Backspace)、清除当前数据(CE、初始化操作(C)数字:添加文本框字符串添加数字字符,调用函数Bt nNum完成该功能;小数点:为当前输入数字添加小数点,将判断是否小数点的变量HasPoi nt赋值为1正负号:将当前数字取相反数并在对话框显示,拟通过浮点运算求相反
49、数并 调用ShowNur函数显示数字双目运算符:计算结果,调用函数 BtnOperator实现运算功能等号:计算结果,调用函数 BtnEqual实现运算功能单目运算符:立即对当前数字进行运算并输出结果MS将当前数据保存在变量Remembe中,并在记忆区存储情况的标签中显示 相应的信息M+将当前数据加到变量Remembe上,并在记忆区存储情况的标签中显示相 应的信息MR将变量Remembe数据显示到文本框中;MC将变量Remembe归零,并在记忆区存储情况的标签中显示相应的信息C:初始化计算器,调用函数Init实现该功能,并在文本框显示 0.CE将当前数字清零Backspace :删除当前数据的
50、末位数字六、心得体会经调试,基本上任务要求设计的所有功能都实现, 调试出的计算结果均正确。一 周的课程设计结束了,给我的总体感觉就是忙碌但充实,而且真正学到了东西。以前做课程课计的时候总是前几天时间玩, 后面几天才开始做,不过这次却是一 直都在做这个课程设计,因为在网上我根本搜不到别人写的简易计算机的资料, 所以从构思到设计流程图到编写源程序都是我一个人独立完成的,虽然这个过程比较痛苦,但是我真正的去体验了,当我编写的程序一遍一遍地报错,出的结果 一次次和正确结果有出入的时候我真的好想放弃,但是我选择了坚持,通过调试程序,一步步地看寄存器和数据区的变化, 最终发现了错误并改正了错误,当运 行的
51、结果全都正确的时候我真的好激动, 好有成就感,。 这次课程设计使我对 汇编语言程序设计这门课程有了进一步的理解和认识,使我学到了许多编程语言以及算法设计方面的知识,同时也锻炼了我的耐心和意志,增长了我的实践能力。 这次课程设计我所选的题目是使用汇编语言设计一个具有加减乘除基本运算功 能的简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现加减乘 除四则运算等功能。通过使用汇编语言设计实现简单计算器, 我进一步了解和掌 握了对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言 知识的有效运用。本次课程设计以实现一个基本功能完善, 界面友好,操作简便 易行的计算器为最终目的,
52、我通过对具有加减乘除基本功能的计算器的设计实 现,学会了使用汇编语言实现输入输出模块的设计, 模块合理调用的设计,加减 乘除运算的判断以及退出程序的判断的设计。 在汇编语言程序设计中,我通过对 各种指令的合理使用,熟悉并加深了对各种指令的用法,同时也学会使用汇编语 言设计各个功能模块。当我实现各个程序模块后,学会了通过程序的调用最终实 现一个具有基本计算功能的简单计算器。在本次课程设中,我也遇到了很多问题, 通过不断努力,我完成了这次课设;当然,我学到了许多东西,同时也发现了一 些不足之处,在以后的学习中我会逐步弥补这些不足。 总而言之,此次课程设计 使我受益匪浅。本次课程设计我虽然完成了题目
53、的要求,但是其中也还存在一些不足之处,这些不足的地方有待与改进与完善。系统需要改进的地方有以下三点:一,最主 要的就是程序的健壮性不是很完善;二,程序代码算法的优化不足。三 本计算 器还有科学型没有编写出来。七、参考文献1 李敬兆.8086/8088和基于ARM核汇编语言程序设计.合肥:中国科技大学出 版社,20082 李敬兆.8086/8088和基于ARM核汇编语言程序设计实验教程.合肥:中国科 技大学出版社,20083 钱晓捷.新版汇编语言程序设计.北京:电子工业出版社,20074 洪志全,罗省贤.汇编语言程序设计教程.北京:电子工业出版社,2004 杨季文.80x86汇编语言程序设计教程.北京:清华大学出版社,2004 周佩玲,彭虎,傅忠谦.微机原理与接口技术.北京:电子工业出版社,20057 何小海,严华.微机原理与接口技术.北京:科学出版社,20068 钱晓捷.新版汇编语言程序设计.北京:电子工业出版社,2008八、致谢在我的导师刘树群刘老师的亲切关怀和悉心指导下完成的。他严肃的科学态 度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。刘老师不 仅在学业上给我以精心指导,同时还在思想、生活上给我以无微不至的关怀,刘 树群老师倾注了大量的心血和汗水, 无论是在课设的选题、构思等方面,还是在 设计说明书的成文定稿方面,我都得到了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能制造概论-全套课件
- 2024年小型厂房租赁协议模板
- 不动产财产赠予协议2024专业
- 2024年企业员工食堂承包服务协议
- 2024年合作伙伴投资合作协议模板
- 2024商业翻译服务协议化样本
- 2024年统编版七年级上册道德与法治期中综合训练
- 2024年度团购房购买协议
- 2023-2024学年浙江省乐清市白象中学高三4月综合测试(二模)数学试题试卷
- 2024商用场地租赁协议样本
- 教科版五年级科学上册(风的作用) 教学课件
- 盐酸-危险化学品安全标签
- 二年级下册语文试题 -“诗词大会”题库二 (word版有答案) 人教部编版
- 部编版道德与法治三年级上册知识点
- SB/T 10843-2012金属组合货架
- GB/T 4337-2015金属材料疲劳试验旋转弯曲方法
- GB/T 40120-2021农业灌溉设备灌溉用热塑性可折叠软管技术规范和试验方法
- 各专业试验报告-nvh m301s1样车测试报告
- 化工课件-S-Zorb装置运行特点及故障处理
- 头发及头皮知识讲述资料课件
- 儿童年龄分期及各期特点 (儿童护理课件)
评论
0/150
提交评论