利用语言判断闰年、生肖及星座_第1页
利用语言判断闰年、生肖及星座_第2页
利用语言判断闰年、生肖及星座_第3页
利用语言判断闰年、生肖及星座_第4页
利用语言判断闰年、生肖及星座_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编语言与接口技术大作业题 目:基于汇编语言的闰年判断程序设计 ,年份生肖判断,以及星座查询系统 专业班级: 姓 名: 学 号: 2013 年 06月 基于汇编语言的闰年年份生肖及星座判断程序设计第一章 设计方案一、 设计内容根据提示信息输入任意年份,编写判断闰年的程序,如果是闰年,则在屏幕上输出“This is a leap year”,否则显示“This isnt a leap year”;在输入年份的基础上,进一步判断年份生肖,并输出“this is a year!”;进而根据提示输入月日,进行星座系统查询,并输出相应星座的英语拼写。二、 设计分析利用DOS 21H中断类型的10号键盘功

2、能调用,将键盘接受到的年份数值的字符串按字节存入缓冲区。将字符串中的每个字符转换为对应的十进制数值(利用0-9这10个数的ASC码值比其本身大30H的关系),判断某年为闰年的汇编语言表达式为:(AX) MOD 4 EQ 0) AND (AX) MOD 100 EQ 0) OR (AX) MOD 400 EQ 0)其中,(AX)中存放的是从键盘输入的年份值。在本程序运行后,只要输入年份就能判断是否为闰年。在输入年份已经转化为十进制数值的基础上,考虑到公元4年是鼠年,生肖属性12年一轮回,我们先对输入的年份减4再除以12并取余,根据余数的不同进行不同的输出。在输入月和日之后,先将输入的前两位转换为

3、月份,再将输入的末两位转化为日期,再根据月份和日期进行星座判断。三、 程序流程图本框图列出了此次课程设计的总流程,显示信息,输入数据,判断格式,判断闰年和结束程序。客观显示了设计的顺序结构,循环结构及分支结构。 程序流程图设计 一、 程序分析主程序:显示提示输入年份以及输入的字符内容,和最后输出的判断。子程序:1. 判断输入:该模块是对输入的年份的格式的判断,若是错误则显示错误Error,正确则进行下面的操作。2. 字符串转换格式:将数字字符串转换成数字,以便进行下面的程序操作。3. 判断闰年:判断输入的年份是否为闰年,若是则输出“This is a leap year!”,若不是则输出“Th

4、is is not a leap year!”,然后退出。二、 汇编程序.model small.386DIPMSG MACRO MSG;输出信息的宏定义PUSH DXPUSH DSMOV DX,SEG MSGMOV DS,DXLEA DX,MSGMOV AH,09hINT 21HPOP DSPOP DXENDMdata segment infon db 0dh,0ah, input a year: $;闰年输出信息 Y db 0dh,0ah,This is a leap year! $ N db 0dh,0ah,This is not a leap year! $ E db 0dh,0ah,

5、Input year has error! $ rat db 0dh,0ah,This is the year of rat!$年份生肖输出信息; ox db 0dh,0ah,This is the year of ox!$ tiger db 0dh,0ah,This is the year of tiger!$ rabbit db 0dh,0ah,This is the year of rabbit!$ dragon db 0dh,0ah,This is the year of dragon!$ snake db 0dh,0ah,This is the year of snake!$ hor

6、se db 0dh,0ah,This is the year of horse!$ sheep db 0dh,0ah,This is the year of sheep!$ monkey db 0dh,0ah,This is the year of monkey!$ chick db 0dh,0ah,This is the year of chick!$ dog db 0dh,0ah,This is the year of dog!$ pig db 0dh,0ah,This is the year of pig!$ w dw 0 ;用于保存输入的年份的数值,因为输入的年份是字符串,因此需要转换

7、为数 buf db 8 ;定义输入缓冲区 db ? db 8 dup(?) BUF1 db 6 db ? db 6 DUP(0)MESS1 DB Please ENTER THE MONTH AND DATE(both include two numbers):DIVIDED By /,13,10,$ARR DB 19,18,20,20,20,21,22,23,22,22,21,21;星座输出信息ARR1 DB 31,29,31,30,31,30,31,31,30,31,30,31MESS2 DB ENTER WRONG!,13,10,$FUNC DB CAPRICORN$ DB AQUARI

8、US$ DB PISCES$ DB ARIES$ DB TAURUS$ DB GEMINI$ DB CANCER$ DB LEO$ DB VIRGO$ DB LIBRA$ DB SCORPIO$ DB SAGITTARIUS$ DB CAPRICORN$ ,13,10,$ tab dw s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11 data endsstack segment stack db 200 dup(0)stack endscode segment assume ds:data,ss:stack,cs:code.startup DIPMSG infon

9、lea dx,buf ;从键盘输入年份字符串 mov ah,0Ah ;0AH功能调用从键盘接受字符串到内存的输入缓存区 int 21h mov cl, buf+1 mov bl,cl movzx cx,bl ;把输入的字符的个数保存在cl中 lea di,buf+2 ;把从键盘输入字符的首地址存放到di中 push ax a0: ;实现检错功能 mov al,di cmp al,0dh ;换行,回车 jz a1 cmp al,9 jg a3 cmp al,0 jl a3 inc di jmp a0 a1: pop ax call datacate ;调用datacate子程序 call ify

10、ears ;调用ifyears子程序 jc a2 ;如果进位则跳转 DIPMSG n jmp exit a2: DIPMSG y;输出是闰年 jmp exit a3: DIPMSG e;错误提示 exit: nop push cx push ax push bx mov cx,w mov ax,cx mov dx,0 sub ax,4 mov bx,12 div bx shl dx,1 lea bx,tab add bx,dx jmp near ptr bx s0: DIPMSG rat jmp OVER s1: DIPMSG ox jmp OVER s2: DIPMSG tiger jmp

11、OVER s3: DIPMSG rabbit jmp OVER s4: DIPMSG dragon jmp OVER s5: DIPMSG snake jmp OVER s6: DIPMSG horse jmp OVER s7: DIPMSG sheep jmp OVER s8: DIPMSG monkey jmp OVER s9: DIPMSG chick jmp OVER s10: DIPMSG dog jmp OVER s11: DIPMSG pigOVER: pop bx pop ax pop cx MOV DL,0DH ;回车换行 MOV AH,2 INT 21H MOV DL,0A

12、H MOV AH,2 INT 21H DIPMSG MESS1 MOV DX,OFFSET BUF1 MOV AH,0AH INT 21H LEA SI,BUF1 MOV DI,0 LEA BP,FUNC MOV AL,0 ;将月份转化为十进制 SUB BYTE PTR SI+2,30H ADD AL,BYTE PTR SI+2 MOV CL,10 MUL CL SUB BYTE PTR SI+3,30H ADD AL, BYTE PTR SI+3 MOV CH,1CALL STAR LEA DX,BP ;将相应的星座输出 MOV AH,9 INT 21H MOV DL,0DH ;回车 MOV

13、 AH,2 INT 21H MOV DL,0AH ;换行 MOV AH,2 INT 21H.exit datacate proc near ;用于把表示年份的字符串转换为数值 push cx; dec cx ;让cx寄存器自减1 lea si,buf+2 ;把字符串的首地址保存在源地址寄存器SI中让si指向字符串的最低位 p1: inc si loop p1 ;将si指向输入的最后一个值 pop cx mov dh,30h mov bx,10 mov ax,1 mov dh,0 p2: push ax sub byte ptr si,30h ;ASCII码字符,减去30H后转换十进制数 mov

14、 dl,si mul dx ;计算某一位上的值 add w,ax ;把计算结果累加,并保存在w中 pop ax ;出栈操作,去除上一次操作后的倍数 mul bl ;乘以bl,计算当前的倍数 dec si ;修改源地址寄存器si的值,使得si指向下一个字符(即高位) loop p2 ;循环直到所有字符处理完毕( ret ;子程序返回指令datacate endpifyears proc near ;此子程序用来判断年份是否为闰年 push bx push cx push dx mov ax,w ;把转换后的年份的数值存入AX mov cx,ax mov dx,0 ;将dx清零 mov bx,4

15、;把4存放到寄存器bx中(除数) div bx ;除法指令 cmp dx,0 ;将dx中的余数与0进行比较,看似否整除 jnz lab1 ;若不相等跳转 mov ax,w ;判断年份是否位100的整数倍 mov bx,100 ;将100赋给bx寄存器,做div的源操作数 div bx cmp dx,0 ;将dx中的余数与0进行比较,看似否整 jnz lab2 ;余数非零则跳转 mov ax,cx ;判断年份是否是400的倍数 mov bx,400 div bx cmp dx,0 jz lab2 lab1: clc ;清除进位标志,即非闰年 jmp lab3 lab2: stc ;设置进位标志,

16、即闰年 lab3: pop dx pop cx pop bx ret ;子程序返回指令 ifyears endp STAR PROC nearP: CMP AL,12 JA P2 CMP AL, CH JE P1 INC CH INC DI INC BX ADD BP,12 JMP P P1: MOV AL,0 ;将月份转化为十进制并判错 SUB BYTE PTR SI+5,30H ADD AL,BYTE PTR SI+5 MOV CL,10 MUL CL SUB BYTE PTR SI+6,30H ADD AL, BYTE PTR SI+6 CMP AL,ARR1DI JA P2 CMP AL,ARRDI JBE P3 ADD BP,12 JMP P3P2: LEA DX,MESS2 MOV AH,9 INT 21HP3: MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21HEXITS: RETSTAR ENDPcode endsend第二章 程序调试 由于所编写程序较大,我先对程序实现的不同模块(即子程序)先分别设计和调试,在确定各模块运行和输出正确后,将各模块进行拼接和整体上的调试。在Masm for windows集成环境2012软件中调试,运行上面的程序,初始界面:如图4-1图4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论