PureBasic

Forums PureBasic
Nous sommes le Sam 24/Aoû/2019 19:41

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 1 message ] 
Auteur Message
 Sujet du message: Procedure Date vers Rang du jour en ASM MDToDayNum
MessagePosté: Mar 26/Nov/2013 18:45 
Hors ligne

Inscription: Mer 14/Sep/2011 16:59
Messages: 904
Code:
; 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.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 1 message ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye