闰年 判断程序,初学汇编

[复制链接]
查看11 | 回复3 | 2021-1-27 06:05:17 | 显示全部楼层 |阅读模式
datasegment
bbdb'welcomemymasmworld!','$';定义欢迎词
xs1db0Dh,0Ah,'pleaseinputayear:','$';定义提示输入年份词
ncdb5,?,5dup(?);定义键盘输入缓存空间
crdb0Dh,0Ah,'Thisisaleapyear!','$';定义结果为闰年
crrdb0Dh,0Ah,'Thisisnotaleapyear','$';定义结果为非闰年
cuodb0Dh,0Ah,'yourinputeorr!','$';定义提示输入错误
contundb0Dh,0Ah,'areyoucontun(y/n?):','$';定义提示是否要继续
dataends
;数据段设置完毕。。。。。。
codesegment
assumeds:data,cs:code
start:movax,data
movds,ax;将ds设置为data地址
leadx,bb
movah,09h
int21h;在屏幕上显示提示信息,欢迎进入我的汇编
begin:leadx,xs1
movah,09h
int21h;在屏幕上显示提示信息,请输入年
leadx,nc
movah,0ah;输入年份,并将其在光标处显示,将年份字符按位
int21h;存入缓存nc中。输入回车占一个字符位,共5个位置。
callinputc;调用处理键盘输入数值的子程序
calljsyx;调用判断输入数值是否为闰年
jmpshortok1;当jsyx顺利回归即由ret回归时是年数被400整除,所以跳至OK1输出信息
s11:leadx,contun;S11为一次输入结束询问是否继续,键盘输入与'y'和'n'比较。
movah,09h;
int21h
leadx,nc
movah,0ah;输入年份,并将其在光标处显示,将年份字符按位
int21h
movdl,[nc+2]
cmpdl,'y'
jebegin
cmpdl,'n'
jneeorr
movax,4c00h
int21h
ok1:leadx,cr;ok1是结果为闰年的显示
movah,09h
int21h
jmpshorts11
ok2:leadx,crr;ok2是结果不是闰年的显示
movah,09h
int21h
jmpshorts11
eorr:leadx,cuo;输入错误的显示
movah,09h
int21h
jmpshorts11

inputcprocnear;子程序,处理键盘输入。
movcl,[nc+1]
movch,0
movsi,0
movax,0
s1:
movdi,cx
movcl,[nc+2+si]
subcl,30h
cmpcl,0
jbeorr
cmpcl,9
jaeorr
movch,0
movbx,10
mulbx
addax,cx
incsi
movcx,di
loops1
ret
inputcendp
jsyxprocnear;子程序,判断闰年。
;pushdx
;pushax
;pushbx
movcx,ax
movbx,4
divbx
cmpdx,0
jneok2
movax,cx
movbx,100
divbx
cmpdx,0
jneok1
movax,cx
movbx,400
divbx
cmpdx,0
jneok2
;popbx
;popax
;popdx
ret
jsyxendp
codeends
endstart
所编的程序有很多问题,子程序没有将涉及的寄存器入栈。主要是因为有JMP在里面,如果JMP了那么入栈的寄存器就不好出栈。这是这个程序的毛病之一啊。各位,这个毛病是能解决的。请高手指正啊。另外,自己一个人学编程。我贵在坚持,想寻找高手拜师,恐怕也不是那么容易。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
jmp出去就不会来了,保存不保存也没什么关系了吧
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
说错了,不是JMP出来时,是在子程序中用CMP比较后的处理,会转去运行其他行的代码。这样入栈的寄存器就没有出栈。
回复

使用道具 举报

千问 | 2021-1-27 06:05:17 | 显示全部楼层
这个,主要是程序结果方面的问题吧。就对子程来说,应该是功能上基本是独立和完整的。你这代码从子程里jmp出去了,就和子程有些相悖。判定是否闰年的子程,应该是可用独立的,输入年份,返回是否为闰年就可以了。其它方面的功能,在其它地方实现就是。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行