trucchi-com

assembler per principianti


Cap. 7 Un esempioA proposito di utility, che ne dite di un esempio di programmino in assembler che può anche tornare utile in qualche modo? Dunque partiamo:Vi piacerebbe un programma di pochi bytes che vi da' la data del giorno di Pasqua per l'anno che voi desiderate?. Ci proviamo?. OK, let's go.Org 0100 ;Istruzione per il compilatore è un .COMJmp start ; salta a startAg DB ? ;variabile ag con valore indefinito tipo byteBg DB ?Cg DB ?Hg DB ?Dg DB ?Fg DB ?Kg DB ?Eg DB ?Gg DB ?Mg DB ?Anno DW ? ;variabile di tipo wordNocom DB 'Inserire un anno per calcolare la data di Pasqua$'Noanno DB 'Inserire un anno a 4 cifre (es. 1998)!$'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 datajz okmov dx, offset Noanno ;punta alla stringa di erroremov ah, 9 ;per il DOS 9 in ah significa stampaint 33 ;chiama il DOSmov ax, 04c00 ;per il DOS 04c in ah significa esci dal progr.int 33 ;chiama il DOS Ok: ;questa è l'etichetta a cui saltarexor bx, bx ;azzera bxxor ah, ah ;ed anche ahmov cx, 1000mov al, [082] ;in al la cifra dei millenni (1 nel nostro caso)sub al, 48 ;convertila nell'intervallo 0-9mul cx ;moltiplica per cxmov bx, ax ;e spostala in bxxor ah, ah ;azzera di nuovo ahmov al, [083] ;leggi le centinaiasub al, 48 ;convertilamov cx, 100 ;moltiplicatore in cxmul cx ;esegui la moltiplicazioneadd bx, ax ; ed aggiungila alle migliaiaxor ah, ah ; ripeti tutto per le decinemov cx, 10mov al, [084]sub al, 48mul cxadd bx, axmov al, [085]sub al, 48xor ah, ahadd ax, bx ;il risultato finale in axmov anno, ax ;salvalo in anno;ora eseguiamo il calcolo vero e propriomov dx, 0mov cx, 19div cx ;anno /19 quoziente in ax e resto in dxmov ag, dlmov dx, 0mov ax, annomov cx, 4div cx ;anno/4 come sopramov bg, dlmov ax, annomov dx, 0mov cx, 7 ;anno/7div cxmov cg, dlmov al, ag ;hg=19*ag+24mov ah, 0mov cl, 19mul cladd ax, 24mov hg, almov dx, 0 ;dg=hg mod 30mov cx, 30div cxmov dg, dlmov al, bg ;kg=5+2*bg+4*cg+6*dgadd al, aladd al, 5mov bl, almov al, cgmov ah,0mov cl, 4mul cladd bl, almov al, dgmov cl, 6mul cladd bl, almov kg, blmov al, bl ;eg=kg mod 7mov ah, 0mov cl, 7mul clmov eg, ahmov bl, dg ;mg=dg+egadd ah, blmov mg, ahcmp ah, 9 ;se mg>9 allora vai a L1ja L1mov al, 22mov ah, mgsub al, ahmov giorno, almov mese, 3 ;marzojmp fineL1:mov al, mgsub al, 9mov fg, alcmp al, 26jne L2mov giorno, 19move mese, 4 ;aprilejmp fineL2:mov al, fgcmp al, 25jne L5mov ah, dgcmp ah, 28je L3mov giorno, almov mese, 4jmp fineL3:mov giorno, 18mov mese, 4jmp fineL5:mov al, fgmov giorno, almov mese, 4Fine:mov bx, offset giorno ;trasforma i numeri in caratterimov ah, 0mov al, ggmov dx, 0mov cx, 10div cxadd dl, 48add al, 48mov [bx], alinc bxmov [bx], dlmov bx offset mesemov al, mesemov ah, 0mov dx, 0mov cx, 0div cxadd dl, 48add al, 48mov [bx], alinc bxmov [bx], dlmov dx, offset messaggiomov ah, 9Int 33Exit:mov ax, 04c00int 33Fine del listato.Come potete vedere in assembler è molto più complicato e lungo scrivere dei programmi, anche piccoli, per questo ho detto subito che serve per piccole routine dove occorre il controllo sulle operazioni da fare oppure una grande velocità, he si perché in assembler l'esecuzione del programma è velocissima, oserei dire che questo programmino viene eseguito quasi istantaneamente (BOOOOM).Vi sarete chiesti perché c'è un carattere '$' alla fine delle stringhe da stampare, ebbene è un indicatore che indica al DOS la fine della stringa, infatti non viene neanche stampato.Bene dopo tutto questo tormentone, vi sembrerà di avere in mano il vostro processore, ma ecco che arriva la randellata:Ebbene il sistema di programmazione che abbiamo considerato si chiama 'Modo reale'. In che senso? Nel senso che opera in modo aperto verso il sistema, è l'unico programma in esecuzione sul vostro computer, ed inoltre può fare della memoria quello che gli pare. Non vi sembra una cosa potenzialmente pericolosa? pensate con un programmino del genere potrei cancellare il DOS e costringere l'utente a resettare il computer. In fondo i primi virus ci sguazzavano in queste cose.Ebbene la Intel, dal 80386 in poi ha costruito una nuova serie di processori che oltre a possedere delle nuove istruzioni più potenti consentivano al sistema operativo (leggi Windows 95 o altro) di operare in modalità protetta.Cioè? Be la modalità protetta è una cosa alquanto complicata, essa prevede che solo il sistema operativo può effettuare determinate operazioni, inoltre i registri di segmento non possono più indirizzare direttamente i segmenti, ma solo indicare il segmento desiderato al processore, sarà questi poi a verificare se il programma che ha chiesto l'accesso alla memoria è autorizzato a farlo o no, se avete windows 95 sicuramente vi sarà capitato con qualche programma di ricevere il seguente messaggio "Questo programma ha eseguito un'operazione non valida e sarà terminato", ebbene quel programma ha tentato di accedere ad un segmento di memoria su cui non era stato autorizzato da Windows.Questo fatto comporta molte cose, che più programmi possono essere contemporaneamente in esecuzione, ognuno nel suo spazio assegnatogli, che non potrà interferire con altre applicazioni né tanto meno cancellare Windows.Ed il nostro programmino?: Bè, Windows gli assegnerà una finestra in modo virtuale, ossia una parvenza di reale, e lui non si accorgerà di niente e farà il suo dovere. A presto!!!P.S. Per compilare i programmi assembler avete bisogno ovviamente di un compilatore. Con una ricerca sul web potrete trovarne decine in formato shareware o freeware, oppure se disponete di visual C++ il compilatore è già compreso nel pacchetto. Buon divertimento.Corso di assembler per principianti scritto da Gennaro Cifariello.Da http://corsoassembler.dadacasa.supereva.it/default.htm?p