这是从网上下载下来的一个计算程序,能实现加、减、乘、除的计算。该程序接受的是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加减乘除四则运算相关推荐

  1. 每天一道LeetCode----位运算实现加减乘除四则运算

    Divide Two Integers 原题链接Divide Two Integers 意思是重新实现除法运算,这里不要复习一下用位运算实现加减乘除四则运算 C++学习笔记-–用位运算实现加减乘除以前 ...

  2. Qt之加减乘除四则运算-支持负数

    一.效果展示 如图1所示,是简单的四则运算测试效果,第一列为原始表达式,第二列为转换后的后缀表达式,冒号后为结果.表达式支持负数和空格,图中是使用了5组测试数据,测试结果可能不全,如大家发现算法有问题 ...

  3. java编程计算加减乘除_Java程序完成加减乘除四则运算

    一.项目名称:加减乘除四则运算 二.设计思路: 1.在对话框中输入两个数,并转化为int类型 2.进行加减乘除四则运算 3.输出结果 三.流程图 四.源代码 import javax.swing.JO ...

  4. C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算

    对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了! ...

  5. java分子分母的加减乘除_加减乘除四则运算

    个人项目实战-四则混合运算 coding.net源码地址 :https://git.dev.tencent.com/qyj814/fours.git 一.实验要求 基本任务: 使用JAVA编程语言,独 ...

  6. java实现三位数加减乘除_用Java位运算实现加减乘除四则运算

    感谢博客:http://blog.csdn.net/itismelzp/article/details/49621741  提供的思路. 要用位运算来实现四则运算,不仅仅要知道&,|,~,^, ...

  7. java 整数加减乘除_java实现超大整数加减乘除四则运算

    packagecom.hdwang;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** 大数四则运算(超出long型的大数 ...

  8. python中加减乘除_Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python # -*- coding:utf-8 -*- #python的算法加减乘除用符号:+,-,*,/来表示 #以下全是python2.x写法,3.x以上请在pyt ...

  9. C++实用案例:整数四则运算计算器

    前言 很多学习C++的人都想过要编一个计算器吧,有可能你没有想过,但你肯定对这个感兴趣.如果你再CSDN上搜一下,出来的一定是双栈啊,class啊什么的,因此你看不懂,所以你感觉没必要copy下来,因 ...

最新文章

  1. 记一次suse linux崩溃
  2. WebService在开发中的实际问题
  3. 计算机组装与维修属于什么类,《计算机组装与维修》课程学业水平测试卷(样卷 答案)...
  4. 自学it18大数据笔记-第三阶段Spark-day04——会持续更新……
  5. jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver...
  6. 【皇甫】☀一本好书 你值得浏览
  7. JavaScript 温故知新 00
  8. 创建相似对象,就交给『工厂模式』吧
  9. html网页之间怎么切换效果,HTML教程:网页页面切换的各种效果-♚付涛纪实阁♚...
  10. Redis学习总结(23)——Redis如何实现故障自动恢复?浅析哨兵的工作原理
  11. CSDN博客添加友情链接
  12. 如何批量修改文件后缀
  13. Maven仓库的下载和配置settings.xml文件
  14. 最新版校园招聘进大厂系列----------(3)字节篇 -----未完待续
  15. 谷哥学术2022年2月资源分享下载列表 08/20
  16. MQ入门之看MQ项目源码 XXL-MQ
  17. MySql使用if语句例子
  18. 大一微积分笔记整理_大一微积分知识点总结
  19. 自动驾驶研究生就业如何,自动驾驶的研究方向
  20. Linux内核发布时间表

热门文章

  1. 微信公众平台找自己APPID
  2. mysql取当前月份两位数_SQL获取当前时间月份为两位数
  3. Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
  4. vmware16中win7虚拟机怎么设置全屏显示
  5. C语言_函数可变参数列表
  6. linux服务器修改字体,Linux  字体修改
  7. CDN基于谷歌开源Katran四层负载均衡方案的应用 - 原理篇
  8. netfilter_queue
  9. Ubuntu20.04下面使用pycharm时候无法输入汉语的问题
  10. php curl模拟wss,使用Poco C++库创建websocket安全访问(wss)客户端