Andres7X
22-06-2009, 10:24
Ciao a tutti, sono nuovi di questo forum e spero di potermi trovare bene :)
Entro un paio di giorni devo consegnare un programma in Assembly che calcoli l'MCD tra n numeri. Ho utilizzato il metodo di Euclide e la ricorsione: ovvero, il primo l'ho usato per calcolare l'MCD tra due numeri. Siccome l'MCD è associativo, una volta calcolato quell'MCD passo a confrontare l'MCD ottenuto con un terzo numero, e così via.
Il codice è questo, ma non mi dà il risultato che vorrei:
MOV ESI,num
XOR EAX,EAX
XOR EBX,EBX
MOV EBX,intArray[ESI-1]
CDQ
Ciclo2: DEC ESI
CMP ESI,0
JE Fine
MOV EAX,intArray[ESI-1]
Ciclo: CMP EBX,0
JE Fine ; Se EBX è 0, allora è il M.C.D.
CDQ
DIV EBX ; Dividiamo EDX:EAX per EBX (il quoziente è in EAX e il resto in EDX)
CMP EDX,0
JE Ciclo2 ; Se EDX (il resto) è 0, allora EBX è l'M.C.D.
MOV EAX,EBX
MOV EBX,EDX
JMP Ciclo
Fine: MOV MCD,EBX
Certe volte, inoltre, con numeri troppo grandi la divisione mi dà overflow. Come mai?
Entro un paio di giorni devo consegnare un programma in Assembly che calcoli l'MCD tra n numeri. Ho utilizzato il metodo di Euclide e la ricorsione: ovvero, il primo l'ho usato per calcolare l'MCD tra due numeri. Siccome l'MCD è associativo, una volta calcolato quell'MCD passo a confrontare l'MCD ottenuto con un terzo numero, e così via.
Il codice è questo, ma non mi dà il risultato che vorrei:
MOV ESI,num
XOR EAX,EAX
XOR EBX,EBX
MOV EBX,intArray[ESI-1]
CDQ
Ciclo2: DEC ESI
CMP ESI,0
JE Fine
MOV EAX,intArray[ESI-1]
Ciclo: CMP EBX,0
JE Fine ; Se EBX è 0, allora è il M.C.D.
CDQ
DIV EBX ; Dividiamo EDX:EAX per EBX (il quoziente è in EAX e il resto in EDX)
CMP EDX,0
JE Ciclo2 ; Se EDX (il resto) è 0, allora EBX è l'M.C.D.
MOV EAX,EBX
MOV EBX,EDX
JMP Ciclo
Fine: MOV MCD,EBX
Certe volte, inoltre, con numeri troppo grandi la divisione mi dà overflow. Come mai?