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

[求助]我的求闰年子程序代码错在什么地方啊

彭现陈 发布于 2007-08-05 19:20, 1230 次点击
这是我的判断闰年的子程序代码,形参yy传入的是年份:
IsRunNian proc yy:DWORD
mov eax,yy
xor ebx,ebx
mov bx,4
div bx
shr eax,16
.if ax==0
mov bx,100
mov eax,yy
div bx
shr eax,16
.if ax==0
mov bx,400
mov eax,yy
div bx
shr eax,16
.if ax==0
mov eax,TRUE
.else
mov eax,FALSE
.endif
.else
mov eax,TRUE
.endif
.else
mov eax,FALSE
.endif
ret
IsRunNian endp
执行时出错.弹出如下窗口:
只有本站会员才能查看附件,请 登录

当我把子程序种的div bx全部去掉后,再执行,就不出错了.
为了完成判断闰年的功能,我该怎么办啊??错在哪里啊??好几天了,哪位高手看出来帮下忙啊.
5 回复
#2
yege2007-08-13 08:17

不知道你用的是那種工具﹐
我記得匯編里的子程序是不能帶參數的。

.386
.model small
.data
yy dd 1949
true dd 1
false dd 0

.code

start:
IsRunNian proc ;yy:DWORD

mov eax,yy
xor ebx,ebx
mov bx,4
div bx
shr eax,16
.if ax==0
mov bx,100
mov eax,yy
div bx
shr eax,16
.if ax==0
mov bx,400
mov eax,yy
div bx
shr eax,16
.if ax==0
mov eax,TRUE
.else
mov eax,FALSE
.endif
.else
mov eax,TRUE
.endif
.else
mov eax,FALSE
.endif
ret

IsRunNian endp
end start

#3
casm2007-08-14 20:41

IsRunNian proc uses ebx edx yy:DWORD

#4
彭现陈2007-08-15 11:00
回复:(yege)不知道你用的是那種工具﹐我記得匯編里...

我用的masm32开发包.
子程序是可以带参数的,使用invoke语句调用子程序,编译器会自动为我们把参数传递的工作做好.
我在网上找到了正确的答案,程序可以正确判断闰年.
并且基本搞懂了为什么我的代码会出错.

这是我找到的正确的代码:
IsRunNian proc dwYear:DWORD

xor eax,eax
pushad
mov ebx,dwYear
mov eax,ebx
xor edx,edx
mov ecx,400
div ecx
or edx,edx
je loc002
mov eax,ebx
xor edx,edx
mov ecx,100
div ecx
or edx,edx
je loc001
mov eax,ebx
xor edx,edx
mov ecx,4
div ecx
or edx, edx
jne loc001
loc002: inc dword ptr [esp+1Ch] ;returnEAX
loc001: popad
ret


我想,用子程序返回值的时候,必须把返回的值存放进[esp+1Ch],编译后自动将他的值放入eax.
而不是在程序中自己用代码将返回值放入eax,因为编译器可能在函数返回时处理eax,这样,返回值就丢失了.
这是我猜想的.

#5
彭现陈2007-08-15 11:01
回复:(casm)IsRunNian proc uses ebx edx yy:DWORD...
不需要uses也可以的.
#6
无理取闹2007-08-15 17:34

可以这样
IsRunNian proc :dword
local @return
pushad
.
.
.
.
mov @return,eax
popad
mov eax,@return
IsRunNian endp

1