Procedure Date vers Rang du jour en ASM MDToDayNum

Pour discuter de l'assembleur
Mesa
Messages : 1092
Inscription : mer. 14/sept./2011 16:59

Procedure Date vers Rang du jour en ASM MDToDayNum

Message par Mesa »

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)

Mesa.