案例4加减乘除四则运算
这是从网上下载下来的一个计算程序,能实现加、减、乘、除的计算。该程序接受的是16进制数。
执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:
c:\masm>js 3+2
5
c:\masm>js 6*7
2A
c:\masm>js 10-4
c
c:\masm>js 12/3
6
B_P EQU BYTE PTR
W_P EQU WORD PTR
D_P EQU DWORD PTR
CODE SEGMENT
ASSUME CS:CODE,DS:CODEORG 100H
;主程序开始
NEWSTAR:JMP STAREVEN
NUM1 DW 0,0
NUM2 DW 0,0
NUM3 DW 0,0
JGV4 DW 0,0
YSF LABEL WORD
YSF1 DB 0
YSF2 DB 0
JUV DB 0
UV DB 0
;使DS:SI指向第一有效字符
OVERS LABEL NEARCLDPUSH AX
OVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET
;输出一个制表符
TAB LABEL NEARMOV AL,9JMP SHORT DISP
;输出一个回车换行符
CRLF LABEL NEARMOV AL,13CALL DISPMOV AL,10
;显示一个字符
DISP LABEL NEARPUSH AXPUSH DXMOV AH,2MOV DL,ALINT 21HPOP DXPOP AXRET
;检查是否为运算符
ISYSF LABEL NEARCLDLODSBCALL ISJJJZ ISYSF1CALL ISIIJZ ISYSF1DEC SI
ISYSF1:RET
;检查是否是加减运算
ISJJ LABEL NEARCMP AL,'+'JZ ISYSF1CMP AL,'-'RET
;检查是否为乘除运算
ISII LABEL NEARCMP AL,'*'JZ ISYSF1CMP AL,'/'JZ ISYSF1CMP AL,'\'RET
;数据输出
;CX=10 十进制
;CX=16 十六进制
DOUT LABEL NEARPUSH AXPUSH BXPUSH DXPUSH BPXOR BP,BP
DOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1
DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1
DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BXPOP AXRET
;输入数据在DX:AX中返回
;CX=0 数据为10进制
;CX#0 数据为16进制
DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DX
DATE1:MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'JA DATE6
DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4
DATE3:ADD DI,BXADC DX,BP
DATE4:ADD AX,DIADC DX,0JMP DATE1
DATE5:ADD AL,9JMP DATE2
DATE6:JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5
DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET
;数据1与数据2根据YSF1进行加减运算
JSJJ LABEL NEARMOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2
JSJJ1:ADD NUM1,AXADC NUM1+2,DX
JSJJ2:RET
;数据1与数据2根据YSF1进行乘除运算
JSII1 LABEL NEARMOV BX,OFFSET NUM1JMP SHORT JSII2_1
;数据2与数据3根据YSF2进行乘除运算
JSII2 LABEL NEARMOV BX,OFFSET NUM2
JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3
JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AX
JSII2_3:DB 66HMOV [BX],AXRET
;显示结果
XUJG LABEL NEARMOV AX,JGV4MOV DX,JGV4+2MOV CX,10CMP UV,10JZ XUJG0MOV CX,16
XUJG0:TEST DX,8000HJZ XUJG1CMP UV,10JZ XUJG2CALL DOUT
XUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISP
XUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,10JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRET
XUJG1:CALL DOUTRET
;计算结果放入DX:AX中
JSJG LABEL NEARCALL JSJJMOV AX,NUM1MOV DX,NUM1+2RET
;从DS:SI处取一个数据
LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数
LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRET
LOADATE1:PUSH NUM1 ;保存数据1数据2及运算符PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0
;进行四则运算
SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DX
SZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6
SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AX
SZYS3:MOV YSF1,ALMOV YSF2,ALCALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算JMP SZYS1 ; 结果保存在数据1中
SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DX
SZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4
SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算JMP SZYS4_1 ; 结果保存在数据2中
SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9
SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1+2POP NUM1RET
SZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AXMOV JGV4+2,DXJNZ SZYS12
SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7
SZYS10:MOV NUM1,AXMOV NUM1+2,DXJMP SZYS1
SZYS11:STCRET
SZYS12:CLCRET
;数制处理
UVIL LABEL NEARPUSH SI
UVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1
UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11CMP AX,'01'JNZ SZYS11PUSH SIMOV UV,10
UVIL3:MOV AL,13MOV [BX-1],AL
UVIL4:POP SICLCRET
;预置结果
YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,DS:[0CH]MOV CS:JGV4,AXMOV AX,DS:[0EH]MOV CS:JGV4+2,AXPUSH CSPOP DSPUSH CSPOP ESRET
;保存结果
BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,CS:JGV4MOV DS:[0CH],AXMOV AX,CS:JGV4+2MOV DS:[0EH],AXPUSH CSPOP DSPUSH CSPOP ESRET
STAR:MOV SI,81HCLDCALL OVERSJNZ STAR1
STAR0:MOV DX,OFFSET MESS1JMP STAR4
STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3
STAR4:MOV AH,9INT 21HINT 20H
SAVESP DW 0
MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$'
MESS2 DB 'Error in expression !$'
MESS3 DB 13,10,'$'
CODE ENDSEND NEWSTAR
案例4加减乘除四则运算相关推荐
- 每天一道LeetCode----位运算实现加减乘除四则运算
Divide Two Integers 原题链接Divide Two Integers 意思是重新实现除法运算,这里不要复习一下用位运算实现加减乘除四则运算 C++学习笔记-–用位运算实现加减乘除以前 ...
- Qt之加减乘除四则运算-支持负数
一.效果展示 如图1所示,是简单的四则运算测试效果,第一列为原始表达式,第二列为转换后的后缀表达式,冒号后为结果.表达式支持负数和空格,图中是使用了5组测试数据,测试结果可能不全,如大家发现算法有问题 ...
- java编程计算加减乘除_Java程序完成加减乘除四则运算
一.项目名称:加减乘除四则运算 二.设计思路: 1.在对话框中输入两个数,并转化为int类型 2.进行加减乘除四则运算 3.输出结果 三.流程图 四.源代码 import javax.swing.JO ...
- C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了! ...
- java分子分母的加减乘除_加减乘除四则运算
个人项目实战-四则混合运算 coding.net源码地址 :https://git.dev.tencent.com/qyj814/fours.git 一.实验要求 基本任务: 使用JAVA编程语言,独 ...
- java实现三位数加减乘除_用Java位运算实现加减乘除四则运算
感谢博客:http://blog.csdn.net/itismelzp/article/details/49621741 提供的思路. 要用位运算来实现四则运算,不仅仅要知道&,|,~,^, ...
- java 整数加减乘除_java实现超大整数加减乘除四则运算
packagecom.hdwang;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** 大数四则运算(超出long型的大数 ...
- python中加减乘除_Python基础算法综合:加减乘除四则运算方法
#!usr/bin/env python # -*- coding:utf-8 -*- #python的算法加减乘除用符号:+,-,*,/来表示 #以下全是python2.x写法,3.x以上请在pyt ...
- C++实用案例:整数四则运算计算器
前言 很多学习C++的人都想过要编一个计算器吧,有可能你没有想过,但你肯定对这个感兴趣.如果你再CSDN上搜一下,出来的一定是双栈啊,class啊什么的,因此你看不懂,所以你感觉没必要copy下来,因 ...
最新文章
- 记一次suse linux崩溃
- WebService在开发中的实际问题
- 计算机组装与维修属于什么类,《计算机组装与维修》课程学业水平测试卷(样卷 答案)...
- 自学it18大数据笔记-第三阶段Spark-day04——会持续更新……
- jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver...
- 【皇甫】☀一本好书 你值得浏览
- JavaScript 温故知新 00
- 创建相似对象,就交给『工厂模式』吧
- html网页之间怎么切换效果,HTML教程:网页页面切换的各种效果-♚付涛纪实阁♚...
- Redis学习总结(23)——Redis如何实现故障自动恢复?浅析哨兵的工作原理
- CSDN博客添加友情链接
- 如何批量修改文件后缀
- Maven仓库的下载和配置settings.xml文件
- 最新版校园招聘进大厂系列----------(3)字节篇 -----未完待续
- 谷哥学术2022年2月资源分享下载列表 08/20
- MQ入门之看MQ项目源码 XXL-MQ
- MySql使用if语句例子
- 大一微积分笔记整理_大一微积分知识点总结
- 自动驾驶研究生就业如何,自动驾驶的研究方向
- Linux内核发布时间表
热门文章
- 微信公众平台找自己APPID
- mysql取当前月份两位数_SQL获取当前时间月份为两位数
- Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
- vmware16中win7虚拟机怎么设置全屏显示
- C语言_函数可变参数列表
- linux服务器修改字体,Linux 字体修改
- CDN基于谷歌开源Katran四层负载均衡方案的应用 - 原理篇
- netfilter_queue
- Ubuntu20.04下面使用pycharm时候无法输入汉语的问题
- php curl模拟wss,使用Poco C++库创建websocket安全访问(wss)客户端