汇编语言程序设计——打印水仙花数
实验目的
在对80x86系列编程结构和指令系统有了较深入的理解、已掌握了汇编语言程序设计的基本方法和技巧、熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法的基础上,进一步理解和掌握较复杂程序的设计方法,掌握子程序结构、宏指令的设计和友好用户界面的设计。
实验任务
采用DOSBox模拟Intel 8086(16位)处理器,使用汇编语言编写16位程序,完成以下实验程序设计任务及要求:
- 使用键盘输入一个整数n(100≤n≤999);
- 将小于等于n的水仙花数打印出来;
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number)。水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
- 程序采用子程序结构或宏指令,结构清晰;
- 友好清晰的用户界面,能识别输入错误并控制错误的修改。
程序设计说明与描述
功能简述
启动程序,用户可以输入一个三位数,若输入有误则提示错误,并提示重新输入;若输入正确,系统将显示出所有大于等于100,并且小于等于该输入数字的水仙花数。
此后,程序提示是否继续。若用户输入’y’或’Y’,则系统回到最开始的状态;若输入’n’或’N’,则退出系统;若输入其他则提示错误,并提示重新输入。
程序流程图
数据段设计
设计了BUFFER_TRANSFORM、OUTPUT1~ OUTPUT7、BUFFER数据段、RESULT共计11个数据段。这些数据段存储的数据的含义如下:
- BUFF_TRANSFORM:存储数字的每一位的ASCII码(存储数字转换成的字符串)。在判断是否是水仙花数时,用于临时存储该数字的每一位数字的ASCII码;在输出水仙花数时,用于临时存储该数字的每一位数字的ASCII码。
- OUTPUT1:存储输入数字的提示。
- OUTPUT2:存储输入错误的提示。
- OUTPUT3:存储是否继续的提示。
- OUTPUT4:存储输出水仙花数(Narcissistic Number)的提示。
- OUTPUT5:存储未找到水仙花数的提示。
- OUTPUT6:存储程序结束的提示。
- OUTPUT7:存储空格。
- OUTPUT8:存储回车换行符。
- BUFFER:设置输入字符串长度为4,存储输入的字符串长度,存储输入信息。
- RESULT:存储计算结果。
DATA SEGMENT;存储数字的每一位的ASCII码(存储数字转换成的字符串)BUFFER_TRANSFORM DB 0,0,0,'$'OUTPUT1 DB "Please input a number (100<=number<=999):",'$' ;存储输入数字的提示OUTPUT2 DB "Input error , please input again ! ",0AH,0DH,'$' ;存储输入错误的提示OUTPUT3 DB "Do you want to continue (y/n) ? ",'$' ;存储是否继续的提示OUTPUT4 DB "Narcissistic Number: ",'$' ;存储输出水仙花数(Narcissistic Number)的提示OUTPUT5 DB "Not Found!",'$' ;存储未找到水仙花数的提示OUTPUT6 DB "Press any key to continue ! ",0AH,0DH,'$' ;存储程序结束的提示OUTPUT7 DB ' ','$' ;存储空格OUTPUT8 DB 0AH,0DH,'$' ;存储回车换行符BUFFER DB 4,0,4 DUP (0) ;设置输入字符串长度为4,存储输入的字符串长度,存储输入信息RESULT DW 4 DUP (0) ;存储计算结果
DATA ENDS
子程序设计与描述
- 子程序名称:CHANGE_LINE
子程序功能:输出回车换行。
子程序参数:无。 - 子程序名称:OUTPUT_ERROR_INFO
子程序功能:输出错误提示。
子程序参数:无。 - 子程序名称:DTOC
子程序功能:将数字转化为十进制字符串。
子程序参数:获取AX每一位的值,转换成ASSCII码,存入BUFFER_TRANSFORM。 - 子程序名称:CHECK_Narcissistic_Number
子程序功能:判断数字是否为水仙花数。
子程序参数:判断AX是否为水仙花数。若该数是水仙花数,CX=0;若该数不是水仙花数,CX≠0。 - 子程序名称:WRITE
子程序功能:将水仙花数写入RESULT区。
子程序参数:将水仙花数AX写入RESULT区,DI加二。
源程序代码
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA SEGMENT;存储数字的每一位的ASCII码(存储数字转换成的字符串)BUFFER_TRANSFORM DB 0,0,0,'$'OUTPUT1 DB "Please input a number (100<=number<=999):",'$' ;存储输入数字的提示OUTPUT2 DB "Input error , please input again ! ",0AH,0DH,'$' ;存储输入错误的提示OUTPUT3 DB "Do you want to continue (y/n) ? ",'$' ;存储是否继续的提示OUTPUT4 DB "Narcissistic Number: ",'$' ;存储输出水仙花数(Narcissistic Number)的提示OUTPUT5 DB "Not Found!",'$' ;存储未找到水仙花数的提示OUTPUT6 DB "Press any key to continue ! ",0AH,0DH,'$' ;存储程序结束的提示OUTPUT7 DB ' ','$' ;存储空格OUTPUT8 DB 0AH,0DH,'$' ;存储回车换行符BUFFER DB 4,0,4 DUP (0) ;设置输入字符串长度为4,存储输入的字符串长度,存储输入信息RESULT DW 4 DUP (0) ;存储计算结果
DATA ENDSSTACK SEGMENTDW 8 DUP (0)
STACK ENDSCODE SEGMENTSTART:MOV AX,DATA ;初始化MOV DS,AXMOV AX,STACK ;建栈MOV SS,AXMOV SP,16MOV DI,0MOV CX,4
CLEAR_RESULT: ;清除由上一个输入计算出来的水仙花数MOV WORD PTR [RESULT+DI],0ADD DI,2LOOP CLEAR_RESULTINPUT: ;输入数字MOV AH,09H ;显示提示MOV DX,OFFSET OUTPUT1INT 21HMOV AH,0AH ;获取输入的字符串MOV DX,OFFSET BUFFERINT 21HCALL CHANGE_LINEMOV AL,[BUFFER+1] ;检查字符串长度MOV AH,0CMP AX,3JE CHECK_NUM ;若长度为3,检查每一个字符是否在范围内INPUT_ERROR_1: ;输入错误CALL OUTPUT_ERROR_INFO ;输出输入错误提示JMP INPUT ;返回,重新输入CHECK_NUM: ;检查输入的每一位字符的ASCII码是否符合要求(是否是符合要求的数字)CMP BYTE PTR [BUFFER+2],'0' ;检查第一位字符JBE INPUT_ERROR_1 ;小于等于'0',输入错误CMP BYTE PTR [BUFFER+2],'9'JA INPUT_ERROR_1 ;大于'9',输入错误CMP BYTE PTR [BUFFER+3],'0' ;检查第二位字符JB INPUT_ERROR_1 ;小于'0',输入错误CMP BYTE PTR [BUFFER+3],'9'JA INPUT_ERROR_1 ;大于'9',输入错误CMP BYTE PTR [BUFFER+4],'0' ;检查第三位字符JB INPUT_ERROR_1 ;小于'0',输入错误CMP BYTE PTR [BUFFER+4],'9'JA INPUT_ERROR_1 ;大于'9',输入错误;将输入的数计算出来,放入DXMOV AL,[BUFFER+2]SUB AL,30H ;计算出百位上的数字MOV BL,100MUL BL ;乘以100MOV DX,AX ;百位乘以100的结果存储到DXMOV AL,[BUFFER+3]SUB AL,30H ;计算出百位上的数字MOV BL,10MUL BL ;乘以10ADD DX,AX ;DX加上十位乘以10的结果MOV AL,[BUFFER+4] ;计算出百位上的数字SUB AL,30HMOV AH,0ADD DX,AX ;DX加上个位,得到输入的数MOV AX,DX ;将输入的数据存储到AXMOV DI,0
LOOP_CHECK_Narcissistic_Number:CALL CHECK_Narcissistic_Number ;检查AX是否为水仙花数CMP CX,0JNE NEXT ;若CX≠0,则该数不是水仙花数,检查AX-1是否为水仙花数CALL WRITE ;若CX=0,则该数是水仙花数,记下该水仙花数
NEXT:DEC AX ;AX自减CMP AX,100 ;若AX>=100,继续循环JAE LOOP_CHECK_Narcissistic_NumberMOV AH,09H ;输出水仙花数提示MOV DX,OFFSET OUTPUT4INT 21HCMP WORD PTR [RESULT],0JNE FOUND ;若第一个结果不等于0,则找到了水仙花数MOV AH,09H ;输出未找到水仙花数的提示MOV DX,OFFSET OUTPUT5INT 21HFOUND:MOV CX,4MOV DI,0 ;DI:输出寻址控制
SHOW_NUM: ;将记下水仙花数输出MOV AX,[RESULT+DI]ADD DI,2CMP AX,0JE END_SHOW_NUM ;若该数为0,结束输出CALL DTOC ;将水仙花数的每一位变成ASCII码放入BUFFER_TRANSFORMMOV AH,09H ;输出该水仙花数(ASCII码)MOV DX,OFFSET BUFFER_TRANSFORMINT 21HMOV AH,09H ;输出空格MOV DX,OFFSET OUTPUT7INT 21HLOOP SHOW_NUM ;循环输出END_SHOW_NUM:CALL CHANGE_LINEAGAIN:MOV AH,09H ;输出是否继续提示MOV DX,OFFSET OUTPUT3INT 21HMOV AH,1 ;获取输入的字符INT 21HCALL CHANGE_LINECMP AL,'n'JE END_PROGRAM ;输入'n',程序结束CMP AL,'N'JE END_PROGRAM ;输入'N',程序结束CMP AL,'y'JE BACK ;输入'y',程序继续CMP AL,'Y' ;输入'y',程序继续JNE INPUT_ERROR_2BACK: ;返回程序开始部分,程序继续JMP FAR PTR START ;跳转回(JMP FAR)程序开始部分INPUT_ERROR_2: ;输入错误CALL OUTPUT_ERROR_INFO ;输出输入错误提示JMP AGAIN ;返回,重新输入END_PROGRAM:MOV AH,09H ;输出程序结束提示MOV DX,OFFSET OUTPUT6INT 21HMOV AX,4C00HINT 21H;名称:CHANGE_LINE
;功能:输出回车换行
;参数:无
CHANGE_LINE:MOV AH,09HMOV DX,OFFSET OUTPUT8INT 21HRET;名称:OUTPUT_ERROR_INFO
;功能:输出错误提示
;参数:无
OUTPUT_ERROR_INFO:MOV AH,09HMOV DX,OFFSET OUTPUT2INT 21HRET;名称:DTOC
;功能:将数字转化为十进制字符串
;参数:获取AX每一位的值,转换成ASSCII码,存入BUFFER_TRANSFORM
DTOC:MOV SI,2MOV CX,3MOV BL,10
GET_NUM: ;获取该数每一位的值,转换成ASSCII码,存入BUFFER_TRANSFORMDIV BL ADD AH,30HMOV [BUFFER_TRANSFORM+SI],AHMOV AH,0DEC SILOOP GET_NUMRET;名称:CHECK_Narcissistic_Number
;功能:判断数字是否为水仙花数
;参数:判断AX是否为水仙花数
;返回:若该数是水仙花数,返回CX≠0;若该数不是水仙花数,返回CX=0
CHECK_Narcissistic_Number:PUSH AX ;保护数据CALL DTOC ;计算AX每一位的数字MOV CX,3MOV DX,0MOV SI,0
ADD_NUM: ;计算每一位的立方和MOV AL,[BUFFER_TRANSFORM+SI]SUB AL,30HMOV AH,0MOV BL,ALMUL BLMUL BLADD DX,AXINC SILOOP ADD_NUMPOP AX ;恢复数据MOV CX,AXSUB CX,DX ;原数与计算结果相减,若该数是水仙花数,CX=0;若该数不是水仙花数,CX≠0RET;名称:WRITE
;功能:将水仙花数写入RESULT区
;参数:将水仙花数AX写入RESULT区,DI加二
WRITE:MOV [RESULT+DI],AXADD DI,2RETCODE ENDSEND START
文章推荐
博客:汇编语言程序设计(第三版,王爽著)实验
参考文献
[1]王爽.汇编语言程序设计(第三版), 北京:清华大学出版社,2013.
[2]钱晓捷.汇编语言程序设计(第五版),北京:电子工业出版社,2018
[3]王元珍,曹忠升,韩宗芬.80x86汇编语言程序设计,湖北:华中科技大学出版社,2005
汇编语言程序设计——打印水仙花数相关推荐
- 一个数三位立方和相加等于本身_【题解信奥】打印水仙花数(粉丝求助)
前言 本题来源于粉丝的求助. 关于粉丝求助的问题,我们会按照先后顺序来解答,并从公众号后台回复答案和解析. 打印水仙花数时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 打 ...
- Bailian2685 打印水仙花数【进制+宏定义】
2685:打印水仙花数 总时间限制: 1000ms 内存限制: 65536kB 描述 打印出所有得"水仙花数",所谓"水仙花数"是指一个3位数,其各位数字的立方 ...
- Bailian2685 打印水仙花数【入门】
打印水仙花数 总时间限制: 1000ms 内存限制: 65536kB 描述 打印出所有得"水仙花数",所谓"水仙花数"是指一个3位数,其各位数字的立方和等于该数 ...
- 7-6 打印水仙花数(10 分)
7-6 打印水仙花数(10 分) 打印水仙花数.水仙花数是一个三位数,其各位数字的立方和与原数相等. 输出格式: 按递增顺序输出所有水仙花数,每个数输出占5列. 输出样例: 153 370 371 4 ...
- JavaScript打印水仙花数
JavaScript打印水仙花数: <!DOCTYPE html> <html lang="en"> <head><meta charse ...
- java 打印水仙花数(通俗易懂)
目录 前言 : 思路 : 代码 : 总结 : 前言 : Hi,guys.今天和大家分享一下java打印所有水仙花数的两种方式.先来说说什么是水仙花数?水仙花数指的是一类三位数,它的个位.十位,百位上的 ...
- 打印水仙花数--C语言
使用函数输出水仙花数 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身.例如:153=13+53+33. 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小 ...
- JAVA打印水仙花数
水仙花数是指:一个n位数( n23 ),它的每个位上的数字的n 次所谓的水仙花数是指:一个n位数(N23),它的每个位上的数字的n次幂之和等于它本身幂之和等于它本身. 例如:153,370,371,4 ...
- 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
javaScript实现回文数.水仙花数判断和输出斐波那契数列 发布时间:2020-07-22 01:15:37 来源:51CTO 阅读:422 作者:Cynthia_xie // 判断一个数是不是回 ...
最新文章
- SQLServer2014 安装错误:等待数据库引擎恢复句柄失败
- XP系统限制修改IP有新招
- 如何快速掌握一门新技术/语言/框架…
- Vue + Element UI + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十)问题管理页面
- Linux CentOS命令行界面字体重复问题解决记录
- Android 省份城市搜索,android - 非常不错的 城市省份的选择组件: citypicker
- 工作312:uni-时间戳处理
- http请求502_从知乎页面的502说一说测试人员应该知道的HTTP协议状态码!
- 并查集——食物链(poj1182)
- mysql的条件语句_mysql条件语句
- 这里是武汉(1)——汉阳造文化创意产业园
- php 引入echarts路径,angular4中引入echarts的方法(代码示例)
- [asp.net]非静态方法需要一个目标
- 可悲的外企Infrastructure - 些须感触(杂)
- 小程序发布提审被驳回,提示当前提审小程序代码包中地理位置相关接口wx.getLocation暂未开通
- java messagedigest_Java MessageDigest.getInstance返回的实例非线程安全
- 1.10全角色FCR,FBR,FHR表
- a轮融资1亿多不多_A轮融资一共就三件重要的事情 B轮最重要的两件事
- 【MySQL】MySQL入门笔记
- 三进制计算机未来的发展趋势,如果研制出三进制计算机会怎样?