计算闰年的题目!不解?

liangfei1983 2011-11-09 07:29:47


data segment ;定义数据段
infon db 0dh,0ah,'Please input a year: $'
Y db 0dh,0ah,'This is a leap year! $'
N db 0dh,0ah,'This is not a leap year! $'
w dw 0
buf db 8
db ?
db 8 dup(?)
data ends

stack segment stack
db 200 dup(0)
stack ends

code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax

lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h

lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h

mov cl, [buf+1]
lea di,buf+2
call datacate
call ifyears
jc a1

lea dx,n
mov ah,9
int 21h
jmp exit
a1: lea dx,y
mov ah,9
int 21h
exit: mov ah,4ch
int 21h



datacate proc near
push cx;
dec cx
lea si,buf+2
tt1: inc si
loop tt1
;lea si,cx[di]
pop cx


mov dh,30h
mov bl,10
mov ax,1
l1: push ax
sub byte ptr [si],dh
mul byte ptr [si]
add w,ax
pop ax
mul bl
dec si
loop l1
ret
datacate endp


ifyears proc near
push bx
push cx
push dx
mov ax,w
mov cx,ax
mov dx,0
mov bx,4
div bx
cmp dx,0
jnz lab1
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz lab2
mov ax,cx
mov bx,400
div bx
cmp dx,0
jz lab2
lab1: clc
jmp lab3
lab2: stc
lab3: pop dx
pop cx
pop bx
ret
ifyears endp
code ends
end start



子程序datacate到底起到个什么作用啊?硬是没看懂!
...全文
104 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fatter001 2011-11-21
  • 打赏
  • 举报
回复
刚开始学的时候也是总忘
liangfei1983 2011-11-10
  • 打赏
  • 举报
回复
经过我的实践,发现这道在网上公认的计算闰年的编程结果是个错的!几个错误的地方!
第一,是那个 mov cl, [buf+1],这里,因为buf是肯定有值的,那么这个循环结果就白白的循环了很多道,要改
第二,是字符串转成年份存储到w的时候,明显有个错误,就是乘数用的bl,这就造成了类似于1800,1900,100都会变成闰年,这明显是错误的,经过我的修改,正确的应该是如下!真不知道为什么这个程序能成为汇编经典题目!


data segment ;定义数据段
infon db 0dh,0ah,'Please onput a year: $'
Y db 0dh,0ah,'This is a leap year! $'
N db 0dh,0ah,'This is not a leap year! $'
w dw 0
buf db 8
db ?
db 8 dup(?)
data ends

stack segment stack
db 200 dup(0)
stack ends

code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax

lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h

lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h

mov cl, [buf+1]
mov ch,0
lea di,buf+2
call datacate
call ifyears
jc a1

lea dx,n
mov ah,9
int 21h
jmp exit
a1: lea dx,y
mov ah,9
int 21h
exit: mov ah,4ch
int 21h



datacate proc near
push cx;
dec cx
lea si,buf+2
tt1: inc si
loop tt1
;lea si,cx[di]
pop cx



mov bh,0
mov bl,10
mov ax,1
l1: push bx
push ax
mov dh,30h
sub byte ptr [si],dh
mov bl,byte ptr [si]
mov bh,0
mul bx
add w,ax
pop ax
pop bx
mov bh,0
mul bl
dec si
loop l1
ret
datacate endp


ifyears proc near
push bx
push cx
push dx
mov ax,w
mov cx,ax
mov dx,0
mov bx,4
div bx
cmp dx,0
jnz lab1
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz lab2
mov ax,cx
mov bx,400
div bx
cmp dx,0
jz lab2
lab1: clc
jmp lab3
lab2: stc
lab3: pop dx
pop cx
pop bx
ret
ifyears endp
code ends
end start


绿领巾童鞋 2011-11-09
  • 打赏
  • 举报
回复
搞定就好了。
liangfei1983 2011-11-09
  • 打赏
  • 举报
回复
刚刚自己看懂了,原来,我输出进去的是字符串,而不是数值,这里面要把他转为数值进行处理,晕死!思想僵化了!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧