probleme procedure

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

probleme procedure

Message par Mesa »

Je ne comprends pas pourquoi ce code compile sans erreurs

Code : Tout sélectionner

; DWORD IsLeapYear(DWORD Y, DWORD Gregorian)
;
; This function determines if the given year is leap in the chosen calendar.
;
; Parameters:
;	Y - year,
;	Gregorian - chosen calendar (0 - Julian, 1 - Gregorian).
;
; Returned values:
;	* 1 if the year Y is leap, 0 - in opposite case,
;	* -1 for the invalid parameters.
;
;proc	IsLeapYear, Y, Gregorian
Procedure IsLeapYear(Y, Gregorian)
  
 EnableASM
PUSHFD
PUSH	ebx edx

!CheckParameters:
TEST	[Gregorian], -2					; 0 <= Gregorian <= 1
JNZ	Error						;

!IsYNegative:
MOV	eax, [Y]					; eax := Y
TEST	eax, eax
JZ	Error
JNS	CheckCalendar
; eax < 0 (Y < 0)
;
INC	eax						; eax := eax + 1
NEG	eax						; eax := -eax = -(Y + 1) = -Y - 1 =
;      = |Y| - [Y < 0] = Y'

!CheckCalendar:
CMP	[Gregorian], 0
JE	mod4

!Gregorian:
XOR	edx, edx					; eax := E(eax / 100) = E(Y' / 100)
MOV	ebx, 100					; edx := eax mod 100 = Y' mod 100
DIV	ebx						; 

TEST	edx, edx
JZ	mod4

MOV	eax, edx					; eax := edx = Y' mod 100
; 
; {(Y' mod 100) mod 4 = Y' mod 4} 

!mod4:
SHR	eax, 1						; eax := E(eax / 2); CF := eax mod 2
JC	Result						; 

SHR	eax, 1						; eax := E(eax / 2); CF := eax mod 2
JMP	Result						;

!Error:
MOV	eax, -1
JMP	Endd

!Result:
SETNC	al						; eax := not CF
MOVZX	eax, al						;

!Endd:

POP	edx ebx
POPFD

RET ;ProcedureReturn ? (renvoie eax ?)

DisableASM
EndProcedure



; ok=IsLeapYear(2000, 1)
; Debug ok
mais si je dé-commente
; ok=IsLeapYear(2000, 1)
; Debug ok
ça ne compile plus.

Une idée ?

M.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: probleme procedure

Message par Backup »

Mesa a écrit :Je ne comprends pas pourquoi ce code compile sans erreurs
mais si je dé-commente
; ok=IsLeapYear(2000, 1)
; Debug ok
ça ne compile plus.

Une idée ?

M.
ben tout simplement parceque commenté
cette ligne

Code : Tout sélectionner

; ok=IsLeapYear(2000, 1)
n'appelle pas la procedure
une procedure , si il n'y a pas d'erreur de syntaxe , tu peux bien mettre ce que tu veux dedans
comme erreur , du moment qu'elle n'est pas appelé , il n'y a pas de raison que ça plante !!

exemple

Code : Tout sélectionner


Procedure debile(x)
	; je suis une procedure débile
	toto:
	OpenWindow(1,1,1,100,100, "null",#PB_Window_SystemMenu )
	StartDrawing(1)
		goto toto
	StopDrawing()
	
EndProcedure


;debile(x)  ; commenté ça se compille 

; si tu decommentes , ça va planter :) 
; EPB
Répondre