dosbox汇编语言设计四则运算计算器,功能如下:1,屏幕提示输入四则算术表达式,以等号结束,要求表达式至少包含2个运算符,至多4个运算符,例如 3*2+6*2-3=, 40/2+9=等。2,如果算术表达式非法,则通过显示输出“Error”进行提示。3,如果算术表达式正确,则计算出表达式的值,并显示输出。4,如果输入字符“Q”或“q”加回车,则退出返回DOS系统。

时间: 2023-06-11 19:10:11 浏览: 145
这是一个比较复杂的项目,需要涉及到字符串处理、表达式求值等多个方面的知识。下面是一个基本的实现思路,可能还需要进行一些调试和优化。 1. 读取用户输入的表达式字符串,可以使用 DOS 中断 21h 的 0Ah 功能。 2. 将字符串解析为数字和运算符,可以使用字符串处理函数和 ASCII 码表。 3. 检查表达式的合法性,例如检查是否有非法字符、是否符合运算符优先级等。 4. 根据运算符的优先级,使用栈进行表达式求值,可以使用汇编语言中的栈操作指令。 5. 输出计算结果或错误提示信息。 6. 循环执行上述步骤,直到用户输入 Q 或 q。 以下是一个基本的伪代码实现: ``` ; 定义数据段 data segment stack dw 100 dup(0) ; 定义栈,存储数字 top dw 0 ; 栈顶指针 num1 dw 0 ; 第一个操作数 num2 dw 0 ; 第二个操作数 op db 0 ; 运算符,使用 ASCII 码表示 result dw 0 ; 计算结果 buffer db 20 dup(0) ; 输入缓冲区 prompt db 'Please input an expression: $' ; 提示信息 error db 'Error$' ; 错误提示信息 quit db 'Q'$ ; 退出命令 data ends ; 定义代码段 code segment assume cs:code, ds:data start: ; 初始化栈指针 mov ax, 0 mov ds:top, ax ; 输出提示信息 mov ah, 9 lea dx, prompt int 21h ; 读取用户输入的表达式 mov ah, 0Ah lea dx, buffer int 21h ; 解析表达式 lea si, buffer mov ax, ds:num1 mov bx, ds:num2 mov cl, 0 ; 运算符优先级 parse: ; 解析下一个数字或运算符 mov al, [si] cmp al, '=' je calc ; 如果是等号,跳转到计算阶段 cmp al, '+' je addop ; 如果是加法运算符,跳转到加法处理 cmp al, '-' je subop ; 如果是减法运算符,跳转到减法处理 cmp al, '*' je mulop ; 如果是乘法运算符,跳转到乘法处理 cmp al, '/' je divop ; 如果是除法运算符,跳转到除法处理 cmp al, '0' jb error ; 如果是非法字符,跳转到错误处理 cmp al, '9' ja error ; 如果是非法字符,跳转到错误处理 sub al, '0' ; 将 ASCII 码转换为数字 mov bx, ax ; 将数字保存到第二个操作数寄存器 ; 检查是否有下一个字符 inc si cmp [si], 0 jne parse ; 如果还有下一个字符,继续解析 ; 计算表达式的值 calc: ; 如果栈为空,直接保存第二个操作数 cmp ds:top, 0 jne stackop mov ds:num1, bx jmp output ; 如果栈不为空,根据运算符优先级进行计算 stackop: mov ax, ds:num1 mov cl, ds:op cmp cl, '*' je mulstack cmp cl, '/' je divstack cmp cl, '+' je addstack cmp cl, '-' je substack ; 如果运算符优先级不对,直接输出错误信息 error: mov ah, 9 lea dx, error int 21h jmp start ; 加法处理 addop: mov ds:op, '+' jmp parse addstack: pop ax add ds:num2, ax dec ds:top jmp stackop ; 减法处理 subop: mov ds:op, '-' jmp parse substack: pop ax sub ds:num2, ax dec ds:top jmp stackop ; 乘法处理 mulop: mov ds:op, '*' jmp parse mulstack: pop ax imul ds:num2, ax dec ds:top jmp stackop ; 除法处理 divop: mov ds:op, '/' jmp parse divstack: pop ax cwd ; 将 AX 扩展为 DX:AX idiv ds:num2 mov ds:num2, ax dec ds:top jmp stackop ; 输出计算结果或错误信息 output: mov ax, ds:num1 mov bx, ds:num2 mov cl, ds:op cmp cl, '+' je addresult cmp cl, '-' je subresult cmp cl, '*' je mulresult cmp cl, '/' je divresult jmp error ; 如果没有运算符,说明表达式非法 addresult: add ax, bx mov ds:result, ax jmp printresult subresult: sub ax, bx mov ds:result, ax jmp printresult mulresult: imul ax, bx mov ds:result, ax jmp printresult divresult: cwd ; 将 AX 扩展为 DX:AX idiv bx mov ds:result, ax jmp printresult printresult: mov ah, 2 mov dl, ' ' int 21h ; 输出空格 mov ah, 2 mov bx, ds:result call printnum ; 输出计算结果 mov ah, 2 mov dl, '$' int 21h ; 输出换行符 jmp start ; 打印数字 printnum: push ax push cx push dx mov cx, 0 ; 计算数字位数 mov dx, 1 ; 计算数字的最高位 mov ax, bx cmp ax, 0 jge numloop mov ah, 2 mov dl, '-' int 21h ; 如果是负数,输出符号 neg ax ; 取反 numloop: inc cx cmp ax, 0 je printloop imul dx, 10 ; 计算下一位的权值 mov bx, dx mov dx, 0 div bx ; 除以权值,得到当前位的数字 push dx ; 将当前位的数字保存到栈中 jmp numloop printloop: pop dx ; 从栈中取出数字位 add dl, '0' ; 将数字转换为 ASCII 码 mov ah, 2 mov dl, dl int 21h ; 输出数字 loop printloop pop dx pop cx pop ax ret ; 处理退出命令 cmp [si], 'q' je quit cmp [si], 'Q' je quit jmp start quit: ; 退出程序 mov ah, 4Ch int 21h code ends end start ```

相关推荐

最新推荐

recommend-type

汇编程序DOSBox实验1.doc

1.在数据段DATA中有两个字数据X和Y, 假设X=1122H, Y=3344H, 编程求两个字的和,结果存放到Z单元中. 2.从SOURCE_BUFFER单元开始存放了20个字母A, 编程将这20个字母A的字符串传送到DEST_BUFFER开始的单元中. 3.从SOURCE...
recommend-type

汇编语言钢琴程序课程设计.doc

计算机钢琴程序——编写程序,运用端口进行控制外设,程序运行时使PC机成为一架可弹奏的钢琴,当用户按下数字键1-8时,计算机能进行判断,对应的依次发出1,2,3,4,5,6,7,i音调。按CTRL-C则退出钢琴状态。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

未定义标识符CFileFind

CFileFind 是MFC(Microsoft Foundation Class)中的一个类,用于在Windows文件系统中搜索文件和目录。如果你在使用CFileFind时出现了“未定义标识符”的错误,可能是因为你没有包含MFC头文件或者没有链接MFC库。你可以检查一下你的代码中是否包含了以下头文件: ```cpp #include <afx.h> ``` 另外,如果你在使用Visual Studio开发,还需要在项目属性中将“使用MFC”设置为“使用MFC的共享DLL”。这样才能正确链接MFC库。