Code : Tout sélectionner
; DWORD MDToDayNum(DWORD M, DWORD D, DWORD LeapYearFlag)
;
; This function calculates the ordinal number of the day in the year.
;
; Parameters:
; M - month,
; D - day,
; LeapYearFlag - flag determining if the year is leap (0 - normal year, 1 - leap year).
;
; Returned values:
; * 1, 2, ..., 365 for the normal year, 1, 2, ..., 366 for the leap year,
; * -1 for the invalid parameters.
Procedure.l MDToDayNum(M.l, D.l, LeapYearFlag.l)
EnableASM
leapyearflag:
TEST LeapYearFlag, -2 ; 0 <= LeapYearFlag <= 1
JNZ l_mdtodaynum_error ;
month:
CMP M, 1
JB l_mdtodaynum_error ; 1 <= M <= 12
CMP M, 12
JA l_mdtodaynum_error
day:
CMP D, 1 ; D >= 1
JB l_mdtodaynum_error
MOV eax, LeapYearFlag ; eax := LeapYearFlag
LEA eax, [eax + 2*eax] ; eax := 3*eax = 3*LeapYearFlag
SHL eax, 2 ; eax := 4*eax = 12*LeapYearFlag
LEA ecx,[monthlen2] ;eax => MonthLen[M - 1 + 12*LeapYearFlag]
DEC ecx ;-1
MOV edx, M ;+M
ADD ecx, edx
ADD ecx, eax ;+12*LeapYearFlag
MOV edx, eax ; Sauvegarde de 12*LeapYearFlag
MOVZX eax, byte [ecx]
CMP D, eax ; D <= MonthLen[M - 1 + 12*LeapYearFlag]
JA l_mdtodaynum_error ;
calculatedaynum:
SHL edx, 1 ; edx := 2*edx = 24*LeapYearFlag (2 parce que word et non byte)
;MOVZX eax, [DaySum - 2 + edx + 2*M]
LEA ecx,[daysum]
DEC ecx ;-1
DEC ecx ;-1
ADD ecx, edx ;+24*LeapYearFlag
MOV edx, M
ADD ecx, edx ;+M
ADD ecx, edx ;+M
MOVZX eax, word [ecx]
ADD eax, D ; eax := eax + D = DaySum(M, LeapYearFlag) + D
JMP l_mdtodaynum_theend
error:
MOV eax, -1
theend:
DisableASM
ProcedureReturn
!monthlen2:
!DB 31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31
!daysum:
!DW 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
!DW 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335
EndProcedure
Debug MDToDayNum(1, 1, 0) ; M, D, LeapYearFlag
Debug MDToDayNum(3, 1, 0)
Debug MDToDayNum(3, 1, 1)
Debug MDToDayNum(12, 31, 0)
Debug MDToDayNum(12, 31, 1)
Debug " "
Debug "Test error"
Debug MDToDayNum(0, 1, 0)
Debug MDToDayNum(1, 0, 0)
Debug MDToDayNum(1, 1, 2)
Debug MDToDayNum(-1, 1, 0)
Debug MDToDayNum(1, -1, 0)
Debug MDToDayNum(1, 1, -1)