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了那么入栈的寄存器就不好出栈。这是这个程序的毛病之一啊。各位,这个毛病是能解决的。请高手指正啊。另外,自己一个人学编程。我贵在坚持,想寻找高手拜师,恐怕也不是那么容易。
分 -->
|