2010-11-28 17 views
2

Comment puis-je convertir les secondes de EPOCH au format de date dans l'assemblage?Convertir les secondes depuis l'époque à ce jour

voici ma tentative:

;get the system date 
    mov  dword eax, [ebx+0] 
    push eax 
    xor  edx, edx 
    mov  edi, 86400 
    div  edi    ;1day=86400secs, remainder in edx 
    add  edx, 4   ;day 0 was Thursday 
    mov  eax, edx 
    xor  edx, edx 
    mov  edi, 7 
    div  edi    ;find the day of the week 
    mov  [wday], edx 

Par ailleurs puis-je diviser correctement (afin d'obtenir le reste dans EDX)? Fondamentalement, ce code donne le nombre correct pour le jour (1 pour dimanche). Alors comment puis-je calculer le numéro du mois?

+0

Les devoirs par hasard? – aefxx

+2

Si ce n'est pas des devoirs, c'est du masochisme. –

+0

hehe ... non ce n'est pas un devoir, en fait c'est un essayer d'implémenter un algorithme que j'ai trouvé dans le net pour quelque chose d'autre mais je dois d'abord calculer le jour et le mois! –

Répondre

3

Je vous recommande vivement de travailler dans un langage de niveau supérieur avant de l'essayer en assembleur. La date mathématique est trop compliquée et irrégulière pour concevoir votre algorithme directement dans l'assemblage.

Vous avez déjà le nombre de jours depuis l'époque en divisant par 86400. Comme le nombre de jours dans une année varie, vous devez déterminer en quelle année vous êtes (et combien de jours dans l'année). Le moyen conceptuellement le plus simple de le faire est de le prendre année après année - soustraire 366 si une année bissextile, 365 sinon, jusqu'à ce que vous avez moins d'une valeur d'une année de jours. Ensuite, vous pouvez faire le même mois par mois (soustraire 31, ou 30, ou 29, ou 28!). Il y a des optimisations potentielles, bien sûr, mais elles peuvent venir plus tard. En ce qui concerne votre code actuel ... Je pense que vous utilisez accidentellement le nombre de secondes après minuit du jour actuel, au lieu du nombre de jours, lorsque vous essayez de calculer le jour de la semaine. (En d'autres termes, vous devriez travailler avec eax après cette première div, plutôt que edx.) Gardez également à l'esprit que le reste va de 0 à 6, donc si vous voulez une plage [1..7], vous devriez ajouter 1 après.

+0

merci l'homme, réponse très sincère. –