汇编课程设计四则运算
DSEG SEGMENT STR1 DB 0AH,0DH, '********************************************$' STR2 DB 0AH,0DH, '** **$' STR3 DB 0AH,0DH, '** welcome you ! **$' STR4 DB 0AH,0DH, '** **$' STR5 DB 0AH,0DH, '** this is programme of sizeyunshuan **$' STR6 db 0AH,0DH, '** **$' STR7 db 0AH,0DH, '** rang(-32768 to 32767) **$' STR8 DB 0AH,0DH, '** press p to exit ! **$' STR9 DB 0AH,0DH, '** maker:fishosoul·yu **$' STR10 DB 0AH,0DH, '********************************************',0AH,0DH,'$' SIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 SIGN3 DW 0 ; NUMB DW 20H DUP(0) ;保存输入的数值 MARK DB 'A' ;保存输入的运算符 DB 10H DUP(0) ; ERROR DB 'YOUR INPUT ARE WRONG$' DSEG ENDS DISP MACRO M LEA DX,M MOV AH,9 INT 21H ENDM CHOICE MACRO ASC1,HAO1,HH ;宏定义,给运算符赋权值 CMP AL,ASC1 ; JNE OTHER&HAO1 ; MOV CH,HH ; JMP OTHER7 ; ENDM CSEG SEGMENT ; ASSUME CS:CSEG,DS:DSEG START: CALL CLEAR MOV AX,DSEG ; MOV DS,AX ; LEA DI,NUMB ; LEA SI,MARK ; DISP STR1 DISP STR3 DISP STR4 DISP STR5 DISP STR6 DISP STR7 DISP STR8 DISP STR9 DISP STR10 ;CALL CLEAR CALL CR ;disp error MOV AX,0 MOV DX,0 MOV BX,0 MOV CX,0 STA1 : CALL CR INPUT: MOV AH,1 ; INT 21H ; CMP AL,'P' JE J_SHU0 CMP AL,'p' JE J_SHU0 CMP AL,'=' ; JE PD ;是等号,进一步判断输入括号是否配对 CMP AL,28H ; JB INPUT ; CMP AL,39H ; JA INPUT ; CMP AL,2FH ;判断是数字还是符号 JBE JUD ;是符号转入响应操作 INC WORD PTR SIGN1 ;将数字标志位加一 SUB AL,30H ;将asc码转16进制 MOV AH,0 ; XCHG AX,[DI] ; MOV BX,10 ; MUL BX ; XCHG AX,[DI] ; ADD [DI],AX ; JMP INPUT ; PD: CMP WORD PTR SIGN2,0 ;判断配对标志位 JE JUD ; JMP BC ; JUD: CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位 JE FUH1 ; ADD DI,2 ; MOV WORD PTR SIGN1,0; FUH1: CALL ADVANCE ;判定优先级, CMP CH,5 ;判断输入的是否是左括号 JNE PY ;不是则判断输入的是否是右括号 INC WORD PTR SIGN2 ;是左括号,括号标志位1 MOV WORD PTR SIGN3,1; PY: CMP CH,1 ;判断输入的是否是右括号 JNE AGAIN ; DEC WORD PTR SIGN2 ;是右括号,括号标志位减1 AGAIN: CMP BYTE PTR[SI],'A';判断运算符存储区是否为空 JE SAVE ; CMP CH,[SI] ; JA SAVE ; CMP BYTE PTR[SI],'(' JNE YIDO DEC SI JMP INPUT YIDO: DEC SI ; MOV CL,[SI] ; CALL MATCH ;判断是什么运算符并进行相应的计算 ;DEC SI ; JMP AGAIN ; Z_Z: JMP INPUT J_SHU0: JMP J_SHU ; SAVE: CMP CH,0 ; JE OVER1 ; CMP CH,1 ; JE Z_Z ;“)”不保存,输入下一个数 INC SI ; MOV [SI],AL ; INC SI ; CMP CH,5 ; JNE GO_ON ; MOV CH,2 ;改变(的权值 GO_ON: MOV [SI],CH ; JMP INPUT ; BC: LEA DX,ERROR ; MOV AH,9 ; INT 21H ; JMP J_SHU ; OVER1: JMP OVER ; MATCH PROC ;子程序,进行相应的运算 PUSH AX ; XOR AX,AX XOR BX,BX CMP CL,2AH ;乘法运算 JNE NEXT1 SUB DI,2 XCHG BX,[DI] SUB DI,2 XCHG AX,[DI] IMUL BX MOV [DI],AX ADD DI,2 JMP FINISH NEXT1: CMP CL,2FH ;除法运算 JNE NEXT2 SUB DI,2 XCHG BX,[DI] SUB DI,2 XCHG AX,[DI] CWD IDIV BX MOV [DI],AX ADD DI,2 JMP FINISH NEXT2: CMP CL,2BH ;加法运算 JNE NEXT3 SUB DI,2 XCHG BX,[DI] SUB DI,2 ADD [DI],BX ADD DI,2 JMP FINISH NEXT3: CMP CL,2DH ;减法运算 JNE FINISH SUB DI,2 XCHG BX,[DI] SUB DI,2 SUB [DI],BX ADD DI,2 FINISH: POP AX RET MATCH ENDP ADVANCE PROC CHOICE 28H,1,5 ;( OTHER1: CHOICE 29H,2,1 ;) OTHER2: CHOICE 2AH,3,4 ;* OTHER3: CHOICE 2FH,4,4 ;/ OTHER4: CHOICE 2BH,5,3 ;+ OTHER5: CHOICE 2DH,6,3 ;- OTHER6: CHOICE 3DH,7,0 ;= OTHER7: RET ADVANCE ENDP ;***清屏*** clear proc near push ax push bx push cx push dx mov ah,06h mov al,00h mov ch,0 mov cl,0 mov bh,0fH mov dh,18H 该汇编程序是一个简单的四则运算计算器,支持加、减、乘、除以及括号运算。用户通过键盘输入表达式,程序会解析输入并执行计算。以下是对程序关键部分的详细解释: 1. **数据段定义(DSEG)**: - `STR1` 到 `STR10` 用于存储屏幕显示的欢迎信息和提示信息。 - `SIGN1`、`SIGN2` 和 `SIGN3` 分别用于标记数字输入完成、括号匹配状态和当前处理的括号类型。 - `NUMB` 用于存储输入的数值,是一个双字节数组,最多可存储20个字节的数值。 - `MARK` 存储用户输入的运算符。 - `DB 10H DUP(0)` 是一个错误信息字符串。 2. **宏定义(MACRO)**: - `DISP` 宏用于在屏幕上显示字符串。 - `CHOICE` 宏用于根据用户输入的字符进行条件跳转,给运算符赋予优先级。 3. **代码段(CSEG)**: - `START` 是程序的入口点,首先调用 `CLEAR` 子程序进行清屏。 - `CR` 子程序可能用于换行。 - `CRINPUT` 之后的部分用于接收用户输入,根据输入的字符执行不同的操作。 - 当用户输入 'P' 或 'p' 时,程序结束。 - 输入数字时,先将 ASCII 码减去 30H 转换为十进制,然后通过乘法和加法计算数值并存储。 - 对于运算符,根据其 ASCII 码进行分类处理,如乘法、除法、加法和减法。同时,程序检查括号是否匹配,如果不匹配,输出错误信息。 - `MATCH` 子程序执行实际的四则运算,根据运算符类型调用相应的算法(如乘法、除法等)。 - `ADVANCE` 子程序用于处理运算符的优先级,根据输入的运算符类型进行相应操作。 4. **运算符处理**: - 程序使用栈来存储运算符和数字,遇到运算符时,会根据运算符的优先级进行相应的计算。 - 左括号 '(' 将运算符的优先级设为5,表示等待与之匹配的右括号 ')'。 - 右括号 ')' 减少括号计数器,表示找到了匹配的左括号。 5. **限制与范围**: - 程序处理的数值范围为 -32768 至 32767,这是 16 位无符号整数所能表示的范围。 6. **错误处理**: - 如果用户输入的表达式有误,如括号未正确配对,程序会显示错误信息 'YOUR INPUT ARE WRONG$'。 这个程序提供了一个基本的四则运算计算器功能,但并不完全符合实际计算器的逻辑,因为它没有考虑运算符的嵌套或复杂的表达式处理。例如,它无法正确处理带有多个括号和复杂运算顺序的表达式。在实际应用中,可能需要更复杂的数据结构和算法来实现一个完整的计算器。
- ybw8822013-10-04写的还不错,有一定帮助
- wx265012013-03-10功能太简单了,不符合我 的需求
- jyw199010082013-07-09代码简单,但排版有些混乱
- 慕流一2012-05-14汇编的不怎么会看,转换成C也有点难度,不过谢谢
- java迷2013-04-30代码有点乱哦。
- 粉丝: 5
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- vlmcsd-1113-2020-03-28-Hotbird64(最新版本KMS)
- 433.基于SpringBoot的冷链物流系统(含报告).zip
- com.harmonyos4.exception.PowerFailureException(怎么解决).md
- 使用 Python 字典统计字符串中每个字符的出现次数.docx
- com.harmonyos4.exception.SystemBootFailureException(怎么解决).md
- 球队获胜数据集.zip
- ERR-NULL-POINTER(解决方案).md
- <项目代码>YOLOv8 航拍行人识别<目标检测>
- 计算机网络-socket-inet-master.zip
- Java编程学习路线:从基础到实战全攻略