|
《汇编语言程序设计》
——计算器程序设计
目录
使用Win32编程设计一个功能及界面风格类似于Windows计算器的计算器程序,只要求实现标准型计算器。
主要实现的功能:
包含基本的四则运算、倒数运算、平方根运算。支持存储区的存储、清除、调出、累加等功能。
Ø WIN32汇编程序编写。
Ø 用汇编实现简单的算法。
Ø 浮点数运算(浮点指令或者自己编程模拟)。
Ø 综合解决问题的能力。
本程序为Win32窗口应用程序,因此采用Windows开发包的文档中规定的Windows程序标准框架进行编程设计。
按照Windows程序标准框架,主程序用于获得并保存本程序的句柄,并调用窗口主程序WinMain创建窗口并进入消息循环。WinMain程序将获取的消息分发给消息处理程序Calculate进行处理。主程序及窗口主程序结构如下图:
消息处理程序Calculate用于相应窗口创立、销毁、按键等消息并进行处理,根据系统功能,消息处理程序Calculate结构图如下:
3. 功能分析
如图所示,Windows自带的计算器按照功能划分可以分为以下5个区域:
显示区:文本框,用于显示输入的操作数及结果
数字键入区:在显示区中显示数字、小数点、正负号等;
运算区:包含双目运算符(+ - * /)、单目运算符(sqrt()、%、1/x)、等于号等
记忆区:清除记忆(MC)、显示记忆(MR)、记忆当前(MS)、记忆加(M+)以及记忆区存储情况的标签
清除键区:退格(Backspace)、清除当前数据(CE)、初始化操作(C)
Ø 数字:添加文本框字符串添加数字字符,调用函数BtnNum完成该功能;
Ø 小数点:为当前输入数字添加小数点,将判断是否小数点的变量HasPoint赋值为1
Ø 正负号:将当前数字取相反数并在对话框显示,拟通过浮点运算求相反数并调用ShowNum函数显示数字
Ø 双目运算符:计算结果,调用函数BtnOperator实现运算功能
Ø 等号:计算结果,调用函数BtnEqual实现运算功能
Ø 单目运算符:立即对当前数字进行运算并输出结果
Ø MS:将当前数据保存在变量Remember中,并在记忆区存储情况的标签中显示相应的信息
Ø M+:将当前数据加到变量Remember上,并在记忆区存储情况的标签中显示相应的信息
Ø MR:将变量Remember数据显示到文本框中;
Ø MC:将变量Remember归零,并在记忆区存储情况的标签中显示相应的信息
Ø C:初始化计算器,调用函数Init实现该功能,并在文本框显示0.
Ø CE:将当前数字清零
Ø Backspace:删除当前数据的末位数字
系统界面仿照Windows计算器程序界面设计,并使用资源文件进行定义,设计界面如下:
6. 文件设计
程序源文件包含两个部分:
Ø 头文件(Calculator.inc):头文件中引入程序所需要的库以及常量和函数申明
Ø 源文件(Calculator.asm):汇编程序源代码
Ø 资源文件(Calculator.rc):定义程序的窗口界面以及相关资源
Ø 说明文件(Calculator.exe.manifest):说明程序的相关配置及信息
利用资源文件定义系统界面,代码如下
#include "resource.h"
#define ISOLATION_AWARE_ENABLED
#define ID_NUM0 300 #define ID_NUM1 301 #define ID_NUM2 302 #define ID_NUM3 303 #define ID_NUM4 304 #define ID_NUM5 305 #define ID_NUM6 306 #define ID_NUM7 307 #define ID_NUM8 308 #define ID_NUM9 309 #define ID_NEG 310 #define ID_POINT 311 #define ID_MUL 312 #define ID_DIV 313 #define ID_SUB 314 #define ID_ADD 315 #define ID_EQU 316 #define ID_PER 317 #define ID_DAO 318 #define ID_SQRT 319 #define ID_MC 320 #define ID_MR 321 #define ID_MS 322 #define ID_MPLUS 323 #define ID_M 324 #define ID_BACK 325 #define ID_CE 326 #define ID_C 327 #define ID_RESULT 328 #define ID_COPY 1001 #define ID_PASTE 1002 #define ID_STANDARD 1003 #define ID_SCIENCE 1004 #define ID_PACKET 1006 #define ID_HELP 1007 #define ID_ABOUT 1008 #define ID_EXIT 1009
Calculator DIALOGEX 0, 0, 170, 133 STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX CLASS "Calculator" CAPTION "计算器" FONT 8, "Tahoma" BEGIN PUSHBUTTON "0",ID_NUM0,36,99,23,16,0 PUSHBUTTON "1",ID_NUM1,36,81,23,16,0 PUSHBUTTON "2",ID_NUM2,61,81,23,16,0 PUSHBUTTON "3",ID_NUM3,87,81,23,16,0 PUSHBUTTON "4",ID_NUM4,36,63,23,16,0 PUSHBUTTON "5",ID_NUM5,61,63,23,16,0 PUSHBUTTON "6",ID_NUM6,87,63,23,16,0 PUSHBUTTON "7",ID_NUM7,36,44,23,16,0 PUSHBUTTON "8",ID_NUM8,61,44,23,16,0 PUSHBUTTON "9",ID_NUM9,87,44,23,16,0 PUSHBUTTON "+/-",ID_NEG,61,99,23,16,0 PUSHBUTTON ".",ID_POINT,87,99,23,16,0 PUSHBUTTON "/",ID_DIV,113,44,23,16,0 PUSHBUTTON "*",ID_MUL,113,63,23,16,0 PUSHBUTTON "-",ID_SUB,113,81,23,16,0 PUSHBUTTON "+",ID_ADD,113,99,23,16,0 PUSHBUTTON "sqrt",ID_SQRT,139,44,23,16,0 PUSHBUTTON "%",ID_PER,139,63,23,16,0 PUSHBUTTON "1/x",ID_DAO,139,81,23,16,0 PUSHBUTTON "=",ID_EQU,139,99,23,16,0 PUSHBUTTON "MC",ID_MC,6,44,23,16,0 PUSHBUTTON "MR",ID_MR,6,63,23,16,0 PUSHBUTTON "MS",ID_MS,6,81,23,16,0 PUSHBUTTON "M+",ID_MPLUS,6,99,23,16,0 PUSHBUTTON "Backspace",ID_BACK,36,23,42,16,0 PUSHBUTTON "CE",ID_CE,79,23,41,16,0 PUSHBUTTON "C",ID_C,122,23,41,16,0 EDITTEXT ID_RESULT,5,2,160,13,ES_RIGHT | ES_NUMBER ,0 CTEXT "",ID_M,9,23,17,14,SS_SUNKEN | NOT WS_BORDER END
Menu MENU LOADONCALL BEGIN POPUP "编辑(&F)" BEGIN MENUITEM "复制(&C) Ctrl+C",ID_COPY MENUITEM "粘贴(&P) Ctrl+P",ID_PASTE MENUITEM SEPARATOR MENUITEM "关闭(&E)",ID_EXIT END POPUP "查看(&V)" BEGIN MENUITEM "标准型(&T)",ID_STANDARD MENUITEM "科学型(&S)",ID_SCIENCE,GRAYED MENUITEM SEPARATOR MENUITEM "数字分组(&I)",ID_PACKET END POPUP "帮助(&H)" BEGIN MENUITEM "帮助主题(&H)",ID_HELP MENUITEM SEPARATOR MENUITEM "关于计算器(&A)",ID_ABOUT END POPUP "", GRAYED BEGIN MENUITEM "复制(&C) Ctrl+C",1001 MENUITEM "粘贴(&P) Ctrl+P",1002 MENUITEM SEPARATOR MENUITEM "标准型(&T)",1003 MENUITEM "科学型(&S)",1004,GRAYED MENUITEM SEPARATOR MENUITEM "数字分组(&I)",1006 MENUITEM SEPARATOR MENUITEM "帮助主题(&H)",1007 MENUITEM "关于计算器(&A)",1008 MENUITEM SEPARATOR MENUITEM "关闭(&E)",1009 END END
Icon ICON MOVEABLE PURE LOADONCALL DISCARDABLE "Calculator.ico" |
文件分别定义了对话框,菜单和Icon图标等资源,为了在程序中方便对消息的处理,此处有意连续定义了ID_NUM0~ID_NUM9
在Calculator.inc头文件中统一定义程序所需的头文件及引入库
;--------------------------- 头文件声明--------------------------- include windows.inc include user32.inc include kernel32.inc include comctl32.inc include masm32.inc include shell32.inc ;--------------------------- 引入库声明--------------------------- includelib user32.lib includelib comctl32.lib includelib masm32.lib |
在Calculator.inc中定义程序所需常量
;---------------------------- 常量声明---------------------------- ID_NUM0 equ 300 ID_NUM1 equ 301 ID_NUM2 equ 302 ID_NUM3 equ 303 ID_NUM4 equ 304 ID_NUM5 equ 305 ID_NUM6 equ 306 ID_NUM7 equ 307 ID_NUM8 equ 308 ID_NUM9 equ 309 ID_NEG equ 310 ID_POINT equ 311 ID_MUL equ 312 ID_DIV equ 313 ID_SUB equ 314 ID_ADD equ 315 ID_EQU equ 316 ID_PER equ 317 ID_DAO equ 318 ID_SQRT equ 319 ID_MC equ 320 ID_MR equ 321 ID_MS equ 322 ID_MPLUS equ 323 ID_M equ 324 ID_BACK equ 325 ID_CE equ 326 ID_C equ |