注册 登录
编程论坛 汇编论坛

判断闰年程序无法输出结果

魔城侠客 发布于 2007-05-24 20:47, 2702 次点击

data segment
buf1 db 'yes$'
buf2 db 'no$'
buf3 dw 1995
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov si,offset buf3
mov ax,[si]
mov dx,0
mov bx,4
div bx
and dx,0FFFFH
jnz fal
mov bx,100
mov ax,[si]
mov dx,0
div bx
and dx,0FFFFH
jnz tru
mov bx,400
mov ax,[si]
mov dx,0
div bx
and ax,0FFFFH
jnz fal
jmp tru
fal: mov ah,9
lea dx,buf2
int 21h
tru: mov ah,9
lea dx,buf1
int 21h
code ends
end start

无法输出yes和no

21 回复
#2
爱以走远2007-05-24 23:04
data segment
buf1 db 'yes$'
buf2 db 'no$'
buf3 dw 1995
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov si,offset buf3
mov ax,[si]
mov dx,0
mov bx,4
div bx
and dx,0FFFFH
jnz fal
mov bx,100
mov ax,[si]
mov dx,0
div bx
and dx,0FFFFH
jnz tru
mov bx,400
mov ax,[si]
mov dx,0
div bx
and ax,0FFFFH
jnz fal
jmp tru
fal: mov ah,9
lea dx,buf2
int 21h
jmp exit
tru: mov ah,9
lea dx,buf1
int 21h
exit: mov ah,4ch
int 21h
code ends
end start
#3
爱以走远2007-05-24 23:05
呵呵 我给你改拉一哈
你犯的都是小问题
拿去对一对
#4
yujia4022007-05-25 16:42

还是不好运行的啊

#5
爱以走远2007-05-25 16:44
怎么会哦 我改的哪个 我运行起拉的
输出的no嘛 1995年不是闰年撒
#6
魔城侠客2007-05-25 17:22
结果是正确的啊,谢谢楼主
exit: mov ah,4ch
int 21h
为什么要加这个啊
是不是在调用完成返回时系统才交出口参数送到指定的寄存器,或是送屏幕

上面这句话是书写着的
#7
爱以走远2007-05-25 17:41
不是只加拉这一句哈
这句是当程序执行完后 带返回码终止
程序执行完后都有一句
#8
yujia4022007-05-25 19:19
我这怎么运行不了哦?
只有本站会员才能查看附件,请 登录

#9
魔城侠客2007-05-25 21:19
如果没有上面的jmp exit
exit:mov ah,4ch
int 21h
这些的话, 是程序没有终止也没有带返回码,返回码是指输出到屏幕上的字符吧???
楼上的,我的可以运行的,结果也正确的
你为什么会这样偶就不是很清楚了,初学者我
#10
爱以走远2007-05-25 21:46

呵呵 你理解错拉哈
那个jmp是为拉当为不是闰年的时候
输出拉no 就直接跳到exit去 不是他会执行下来 输出yes

#11
爱以走远2007-05-25 21:50
返回码是指输出到屏幕上的字符吧???
不是的哈 只是结束
你记到反正程序完拉要加一个
mov ah,4ch
int 21h 就行拉
还有就是8楼的 你运行出来没错呀 你是用的masm吧
呵呵 你link拉运行看看
#12
菜鸟上路2007-05-25 22:09
纠正下楼上的哈,如果程序中用到中断则结束时要用
mov ah,4ch
int 21h
#13
爱以走远2007-05-25 22:20
哦 谢谢 我查拉一哈书 他说带返回码终止
我还以为是结束标志也 记得老师讲过
不过忘拉
谢谢提醒
#14
魔城侠客2007-05-25 22:23

再问个问题
如果ax=24h
他是16进制,除以4h则得到9
如果把24h当十进制24计算,除以4得6
是不是要先把24h转换成十进制
如果先不转换要怎么做????

#15
菜鸟上路2007-05-25 23:05
还是转成10进制熟悉点,16进制也不知道怎么除
#16
魔城侠客2007-05-26 10:09
刚开始输入字符串,比如是1996
我已经把这变成1996H存在AX中
那是不是还要转成十进制
如果刚开始不转换成1996H,而是直接从1996字符串转换成十进制要怎么转换啊
#17
菜鸟上路2007-05-26 10:17
直接mov ax,buf3
#18
魔城侠客2007-05-26 10:19

哦,那个程序是刚开始写得就判断1995的,这个已经可以了
我现在又改了下,需要输入字符串的
比如输入1996,这是字符
我把他转换成1996H存在AX中,我把程序发上来吧
data segment
buf1 db 'please input a year:$'
yes db 'yes$'
no db 'no$'
buf2 db 7
db ?
db 7 dup(?)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax

lea dx,buf1 ;提示输入年份
mov ah,9
int 21h

lea dx,buf2 ;输入字符串
mov ah,0ah
int 21h

mov ah,[buf2+2] ;将输入的年份转换成十六进制存放在ax中
and ah,00fh
mov cl,4
shl ah,cl
mov bl,[buf2+3]
and bl,00fh
add ah,bl
mov al,[buf2+4]
and al,00fh
shl al,cl
mov bl,[buf2+5]
and bl,00fh
add al,bl

mov cx,ax
mov dx,0
mov bx,4h
div bx
and dx,0ffffh
jnz fal
mov bx,100
mov ax,cx
mov dx,0
div bx
and dx,0ffffh
jnz tru
mov bx,400
mov ax,cx
mov dx,0
div bx
and dx,0ffffh
jnz fal
jmp tru
fal: mov ah,9
lea dx,no
int 21h
jmp exit
tru: mov ah,9
lea dx,yes
int 21h
jmp exit
exit: mov ah,4ch
int 21h
code ends
end start

#19
魔城侠客2007-05-26 10:59
问题解决了
呵呵
谢谢各位啊,终于把这个程序搞懂了
#20
mengfanzhen12007-07-02 13:00
怎么看不到结果呢???
#21
mengfanzhen12007-07-02 13:12

Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

Object filename [4.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:

50820 + 415740 Bytes symbol space free

0 Warning Errors
0 Severe Errors

D:\masm5>link 4

Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved.

Run File [4.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment

D:\masm5>4
noease input a year:2005
D:\masm5〉
结果为什么是这样??

#22
魔城侠客2007-07-02 18:07

那是因为少了换行,把no直接输出在第一行了
在输出结果前,先换行就可以了

1