Un semplice programmino in Assembly per pd32, che si occupa di
calcolare il saldo in base ad una serie di movimenti positivi o negativi.
SALDO CONTO BANCARIO
tutti i dati sono a 16 bit; il saldo iniziale è memorizzato in 0000 1b00
i movimenti sono memorizzati in locazioni consecutive a 0000 1f00;
l’ultimo movimento è seguito da una posizione di memoria contente 0
Assunzioni arbitrarie
- realisticamente il saldo parte da zero;
- ottimisticamente il saldo termina positivamente.
codice C:
#include
int main(int argc, char *argv[]){
int saldo=0, i=0;
int mov[]={1,-2,-8,10,20,0};
printf ("saldo = %d \n",saldo);
do{
saldo+=mov[i];
i++;
}while( mov[i]!=0);
printf ("saldo finale= %d \n",saldo);
return 0;
}
che diventa:
org 400h
SALDO equ 1b00h ; indirizzo saldo
MOV equ 1f00H
code
; inserisco movimenti
movl #mov,r0 ; ind movimenti in R0
movw #1,(R0)+
movw #-2,(R0)+
movw #-8,(R0)+
movw #10,(R0)+
movw #20,(R0)+
movw #0,(R0)+ ; fine movimenti
movl #mov,r0 ; r0= indirizzo di MOV
xorw r1,r1 ; azzera r1 (inutile in questo caso)
ADD:
movw (r0)+,r2 ; muovi il valore del mov in r2, incrementa ind. mov
cmpw #0,r2 ; (valore all’indirizzo contenuto in r0) – 0
jz FINE ; se = 0 vai a SAVE
addw r2,r1 ; altrimenti somma movimento a saldo
jmp ADD
FINE:
movw r1,SALDO
halt
end
; risultato 15h = 00010101 = 5+16= 21 😉
codice evidenziato grazie a source-highligth