.386
.model flat,stdcall
option casemap:none
;库文件
includelib shell32.lib
includelib user32.lib
includelib masm32.lib
includelib comctl32.lib
includelib kernel32.lib
includelib msvcrt.lib
include windows.inc
include masm32.inc
include shell32.inc
include user32.inc
include comctl32.inc
include kernel32.inc
;C函数
strcat PROTO C :ptr sbyte,:ptr sbyte
;界面常量
IDC_EDIT1 EQU 1001
IDC_EDIT2 EQU 1002
IDC_EQU EQU 1003
IDC_ADD EQU 1004
IDC_SUB EQU 1005
IDC_BUTTON4 EQU 1006
IDC_BUTTON5 EQU 1007
IDC_BUTTON6 EQU 1008
IDC_BUTTON7 EQU 1009
IDC_BUTTON8 EQU 1010
IDC_MUL EQU 1011
IDC_DIV1 EQU 1012
IDC_PER EQU 1013
IDC_DOT EQU 1014
IDC_NEG1 EQU 1015
IDC_ZERO1 EQU 1016
IDC_ONE EQU 1017
IDC_TWO EQU 1018
IDC_THREE EQU 1019
IDC_FOUR1 EQU 1020
IDC_FIVE EQU 1021
IDC_SIX1 EQU 1022
IDC_SEVEN EQU 1023
IDC_EIGHT EQU 1024
IDC_NINE EQU 1025
IDC_SIN EQU 1026
IDC_COS EQU 1027
IDC_TAN EQU 1028
IDC_BACK EQU 1029
IDC_PI EQU 1030
IDC_E EQU 1031
IDC_ABS EQU 1032
IDC_RIGHT EQU 1033
IDC_LEFT EQU 1034
;函数声明
WndProc PROTO :DWORD, :DWORD, :DWORD, :DWORD ; 消息处理程序
MyRegisterClass PROTO :DWORD;
InitInstance PROTO :DWORD, :DWORD ; 主程序
.data
optStack DD 200 dup(0);符号栈
index DD 0 ;符号栈下标
isFloat DD 0 ;是否是浮点数
isNeg DD 0 ;是否是负数
isLeft DD 0 ;是否是当前域的最左数
isStart DB 0 ;是否开始显示
isStart1 DB 0;是否开始输入数字
opt DD 0 ;当前运算符
OutString DB "0",0,40 DUP(0) ;下显示框显示内容
OutString1 DB 40 DUP(0);上显示框显示内容
ten qword 10.
dot qword 0.1
tempdot qword 1.;当前浮点数字的阶
negnum DD -1
tempnum DD 0
numStack real4 50 DUP(0.) ;数字栈
nindex DD 0;数字栈下标
curnum DD 0;当前域的数字数量
.data?
hInstance DD ?;当前实例
hEdit1 DD ? ;上显示框句柄
hEdit2 DD ? ;下显示框句柄
res real8 ?;临时存储浮点数
op1 real8 ?;临时存储浮点数
op2 real8 ?;临时存储浮点数
.const
HelpFile DB "help.hlp",0
ProgramName DB "计算器",0 ;程序名
DialogName DB "Calculate",0;对话框名
IconName DB "Icon",0;图标名
Sin1 DB "sin(",0
Cos1 DB "cos(",0
Tan1 DB "tan(",0
Abs1 DB "tan(",0
Sin2 DB ")",0
Sin3 DB "(",0
initdot qword 1.
E qword 2.718281828 ;e
.code
;处理数字键
pressNumButton proc Num:DWORD
xor eax,eax
mov isLeft,1
;判断是否是开始数字,若是存入0.0
.if isStart1==0
fldz
mov isStart1,1
;当前域数字数量+1
mov eax,curnum
inc eax
mov curnum,eax
.endif
;判断是否是PI或E
.if Num==IDC_PI
fldpi
mov eax,'p'
.elseif Num==IDC_E
fld E
mov eax,'e'
.else
;若不为浮点数
.if isFloat==0
fld [ten] ;st[0]=10
fmul ;st[0]=st[1]*10
fild Num ;st[0]=Num
mov tempnum,IDC_ZERO1
fisub tempnum ;st[0]=Num-IDC_ZERO1即当前数
.if isNeg==1 ;若当前数为负数,st[0]=-st[0]
fchs
.endif
fadd ;st[0]=st[1]+st[0]
.else
fld tempdot;st[0]=之前小数的阶即0.***1
fmul dot ;st[0]=st[0]*0.1为当前小数阶
fst tempdot
fild Num
mov tempnum,IDC_ZERO1
fisub tempnum ;st[0]=Num-IDC_ZERO1即当前数
fmul ;st[0]=st[0]*当前小数阶
.if isNeg==1 ;若当前数为负数,st[0]=-st[0]
fchs
.endif
fadd ;st[0]=st[
简单计算器-代码
最新推荐文章于 2024-04-09 23:49:52 发布