www.spartan.3000.it  ASSEMBLER HOME PAGE ASSEMBLER  www.spartan.da.ru 

 ASSEMBLER  Lezione 1 Lezione 2 Lezione 3 Lezione 4 Lezione 5 Lezione 6 Lezione 7  ASSEMBLER 

LEZIONE 8




  Un esempio di programmino in assembler che ci indica la data di un giorno di un anno qualsiasi (esemp. Pasqua):

Org 0100       (Istruzione per il compilatore è un .COM)
Jmp start       (salta a start)

Ag DB ?       (variabile ag con valore indefinito tipo byte)
Bg DB ?
Cg DB ?
Hg DB ?
Dg DB ?
Fg DB ?
Kg DB ?
Eg DB ?
Gg DB ?
Mg DB ?
Anno DW ?       variabile di tipo word
Nocom DB 'Inserire un anno per calcolare la data di Pasqua$'
Noanno DB 'Inserire un anno a 4 cifre (es. 2001)!$'
Messaggio DB 'Il giorno di Pasqua cade il: '
Giorno DB '00/'
Mese DB '00$'

Start:
mov al,[080]       all'indirizzo 80 la lunghezza del comando.
cmp al,5       se è diverso da 5, non abbiamo inserito la data
jz ok mov dx, offset Noanno       punta alla stringa di errore
mov ah, 9       per il DOS 9 in ah significa stampa
int 33        chiama il DOS
mov ax, 04c00       per il DOS 04c in ah significa esci dal progr.
int 33       chiama il DOS

Ok:       questa è l'etichetta a cui saltare
      xor bx, bx       azzera bx
      xor ah, ah       ed anche ah
      mov cx, 1000
      mov al, [082]       in al la cifra dei millenni (1 nel nostro caso)
      sub al, 48       convertila nell'intervallo 0-9
      mul cx       moltiplica per cx
      mov bx, ax       e spostala in bx
      xor ah, ah       azzera di nuovo ah
      mov al, [083]       leggi le centinaia
      sub al, 48       convertila
      mov cx, 100       moltiplicatore in cx
      mul cx       esegui la moltiplicazione
      add bx, ax       ed aggiungila alle migliaia
      xor ah, ah       ripeti tutto per le decine
      mov cx, 10
      mov al, [084]
      sub al, 48
      mul cx
      add bx, ax
      mov al, [085]
      sub al, 48
      xor ah, ah
      add ax, bx       il risultato finale in ax
      mov anno, ax       salvalo in anno

      ora eseguiamo il calcolo vero e proprio

      mov dx, 0
      mov cx, 19
      div cx       anno /19 quoziente in ax e resto in dx
      mov ag, dl

      mov dx, 0
      mov ax, anno
      mov cx, 4
      div cx       anno/4 come sopra
      mov bg, dl

      mov ax, anno
      mov dx, 0
      mov cx, 7       anno/7
      div cx
      mov cg, dl
      mov al, ag ;hg=19*ag+24       mov ah, 0
      mov cl, 19
      mul cl
      add ax, 24
      mov hg, al

      mov dx, 0       dg=hg mod 30
      mov cx, 30
      div cx
      mov dg, dl

      mov al, bg ;kg=5+2*bg+4*cg+6*dg       add al, al
      add al, 5
      mov bl, al
      mov al, cg
      mov ah,0

      mov cl, 4
      mul cl
      add bl, al
      mov al, dg
      mov cl, 6
      mul cl
      add bl, al
      mov kg, bl
      mov al, bl       eg=kg mod 7
      mov ah, 0
      mov cl, 7
      mul cl
      mov eg, ah
      mov bl, dg       mg=dg+eg
      add ah, bl
      mov mg, ah

      cmp ah, 9       se mg>9 allora vai a L1
      ja L1
      mov al, 22
      mov ah, mg
      sub al, ah
      mov giorno, al
      mov mese, 3       marzo
      jmp fine
L1:
      mov al, mg
      sub al, 9
      mov fg, al
      cmp al, 26
      jne L2
      mov giorno, 19
      move mese, 4       aprile
      jmp fine
L2:
      mov al, fg
      cmp al, 25
      jne L5
      mov ah, dg
      cmp ah, 28
      je L3
      mov giorno, al
      mov mese, 4
      jmp fine
L3:
      mov giorno, 18
      mov mese, 4
      jmp fine
L5:
      mov al, fg
      mov giorno, al
      mov mese, 4
Fine:
      mov bx, offset giorno       trasforma i numeri in caratteri
      mov ah, 0
      mov al, gg
      mov dx, 0
      mov cx, 10
      div cx
      add dl, 48
      add al, 48
      mov [bx], al
      inc bx
      mov [bx], dl
      mov bx offset mese
      mov al, mese
      mov ah, 0
      mov dx, 0
      mov cx, 0
      div cx
      add dl, 48
      add al, 48
      mov [bx], al
      inc bx
      mov [bx], dl
      mov dx, offset messaggio
      mov ah, 9
      Int 33
Exit:
      mov ax, 04c00
      int 33

Fine del listato. Da notare che in assembler è molto più complicato e lungo scrivere dei programmi, anche piccoli.
'$' indica al DOS la fine della stringa, infatti non viene neanche stampato.



 
 




@2ooo-2oo1 SPARTAN