Correzione Assembler 28/6/2005

A e'una matrice di 100 righe e 200 colonne
gli interi occupano 4 bytes
la memoria e' indirizzata al byte

i=1;
while((i<N)&&(A[k,k]!=0))
{
  if(A[k,i]<A[k,i+1])
  {
    if(A[k,i]<A[k,i+2])
    {
      A[k,i+2]=A[k,i]+A[k,N];
    }
    i++;
  }
  else
  {
    A[k,i+1] = A[k,i]+A[k,1];
  }    
  i++;  
}

- A[k,k] che e' nella guardia del while non e' costante, e bisogna 
  ricaricarlo quando cambia

- A[k,N] e' costante, perche' potrebbe essere modificato alle iterazioni N-1 e N-2, 
  ma sarebbero l'ultima iterazione.

- A[k,1] e' costante, perche' la prima iterazione e' i=1, ma possono essere 
  modificati solo gli elementi  A[k,1+1] e A[k,1+2]

- A[k,i] non va ricaricato ogni volta perche' in entrambi i rami dell'if viene 
  caricato il prossimo elemento, che  potrebbe essere A[k,i+1] o A[k,i+2].

soluzione 

la N R1
ld R1 R0 R1                     R1=N
mv 1 R2                         R2=i=1
la A R3                         R3=ind(A)
la k R4
ld R4 R0 R4                     R4=k
mul R4 800 R5
add R3 R5 R3                    R3=ind(A[k,0])

// caricamento A[k,1]
ld  R3 4  R7                    R7=A[k,1]
mv  R7 R30                      R30=A[k,i]

// caricamento A[k,k]
mul R4 4  R6                    
ld  R3 R6 R8                    R8=A[k,k]

// caricamento A[k,N]
mul R1 4  R9
ld  R3 R9  R10                  R10=A[k,N]

loop
if>= R2 R1 esciwhile            i>=N
if=  R8 0  esciwhile            A[k,k]=0

// caricamento A[k,i+1]
add R2  1 R20                   R20=i+1
mul R20 4 R21                   R21=offset(i+1)
ld  R3 R21 R31                  R31=A[k,i+1]

if>= R30 R31 else

// caricamento A[k,i+2]
add R21 4 R22                   R22=offset(i+2)
ld  R3 R22 R32                  R32=A[k,i+2]

if>= R30 R32 finesecif 

add R30 R10 R32
st R3  R22 R32

// controllo se e' stato assegnato A[k,k], in tal caso aggiorno il valore in R8
add R20 1 r23                   R23=i+2
if!= R23 R4 finesecif           i+2 != k                                
mv R32 R8

finesecif
add R2 2 R2
mv R32 R30
go to loop

else

add R30 R7 R30
st  R3 R21 R30

// controllo se e' stato assegnato A[k,k], in tal caso aggiorno il valore in R8
if!= R20 R4 fineelse            i+1 != k                                
mv R30 R8

fineelse
incr R2
go to loop

esciwhile
la i R63
st R63 0 R2