|
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.
|