martedì 10 giugno 2008

ASSEMBLER 16bit

ciao a tutti a grande richiesta mi hanno chiesto di spiegare un pò di assembler. Fruttando il programma dosemu utilizziamolo per programmare se utilizzi Linux può fare da terminale

sudo apt-get install dosemu

premiamo tab e installiamo anche le librerie aggiuntive in effetti dobbiamo programamre :) adesso che sappiamo come si instalala adesso passiamo alla parte più semplice ma allo stesso tempo difficile
CREIAMO UN FILE e mettiamoci questo codice per iniziare

.186
.model tiny
.code
org 100h
inizio:
codice
end inizio
;il commento in assembler si fa mettendo solo il ";" come qui!


inizio è un etichetta dove inizia il programma ed è susseguito da un nome qualsiasi e da un ":" chiamato in arte due punti dopo mettiamo il codice e poi una chiusura del codice e così mettiamo end inizio per finire il codice.Questa struttura è buona ma allo stesso tempo no perchè si creano delle confusioni nel file ,quando dobbiamo chiamare una macro o funzioni aggiuntive al nostro programma.vi spiego poi cosa è una macro e le altre cosette ma prima vi do l'altra versione che secondo me è la migliore ma ovviamente una persona sceglie una strada o l'altra! dipende dalla vostra scelta

.186
include nostre_macro.txt
code segment
assume cs:code
org 100h
inizio:codice
codice
code ends
end inizio


la seconda versione è migliore perché possiamo richiamare una nostra libreria chiamata NOSTRE MACRO e dentro questo altro file mettiamo le nostre macro ma per adesso io utilizzalizzerò la 1° versione perché è quella più semplice da spiegare!
Dove c'e messo codice si mettono le parole che stanno qui sotto :

MOV ax,10h metti copia nel registro un certo dato
JMP inizio1 saltare all'etichetta da noi desiderata(inizio1 si chiama nel nostro caso).
MUL ax,bx moltiplica i registri e il risultato lo mette in ax
ADD dx,1 somma al registro dx 1
sub ax,bx sottrai dal registro ax il contenuto di bx e lo mette in ax!
JNE jamp not egual salta se non è uguale
JE saltare all'etichetta da noi desiderata se un registro è uguale ad un altro
CMP ax,0 confronta che nel registro ax ci sia zero se è vero va all'istruzione successiva(2° riga) se no va ad altrimenti va alla 3° riga
ret finisce il programma
hlt finisce il programma

adesso spieghiamo cosa sono i registri
i registri dato che lavoriamo a 16 bit abbiamo
ax,bx,cx,dx che sono registri per immagazzinare dati
cs,ss,sh registri di segmento per la grafica si utilizzano di più

per esempio ax (è un esempio ma si può prendere qualsiasi registro io vi consiglio a primi 4 che sono ax,bx,dx) si può suddividere in 2 infatti se noi mettiamo
mov ah,12h mettiamo nel registro ah il valore 12 esadecimale infatti la "h"sta per hexadecimal cioè il nostro alfabeto abbiamo 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
quindi in un registro possiamo mettere al massimo ff ff sono 4 le F perché nella parte destra dei ff sta la parte più alta e al contrario la parte più bassa quindi fate finta che avete uno scatolo e ci potete mettere solo 4 lettere dell'alfateto che prima dicevo che sono evidenziati in blu.Dimenticavo la lettera A quanto vale numericamente voi vi state chiedendo ......la lettera A vale il segno precedente +1 quindi 9+1 fa 10 facendoci dei conti quindi la f sta a 15 infatti se contiamo anche lo zero se ci fate caso sono 16 caratteri! per questo si chiama esadeciamale perche sono esa quindi 16
torniamo al fatto dei registri infatti io prima vi ho detto che il registro cx non si usa per metterci dati infatti cx serve a confrontare il suo valore con un altro.

attenzione chi ha sta usando la seconda versione dovrà creare un file chiamato con il nome di NOSTRE MACRO .TXT potete anche cambiare il nome se volte;)per chi ha la prima versione prima della riga di codice .186 inserisce queste cose qui sotto chiamate funzioni aggiuntive o macro
@waitkbd macro
mov ah,10h
int 16h
endm

@outstrb macro m
local wrk,fine
push ax
push bx
mov bx,offset m
wrk:mov al,[bx]
cmp al,0
je fine
mov ah,0eh
int 10h
inc bx
jmp wrk
fine:pop bx
pop ax
endm



@modvid macro n
local avanti,oltre
push ax
mov ah,0
mov al,n
int 10h
cmp al,3
je avanti
mov ax,0a000h
jmp oltre
avanti:mov ax,0b800h
oltre: mov es,ax
pop ax
endm


@linev macro x,y,l,c
local wrk
pusha
mov bx,320
mov ax,y
mul bx
add ax,x
mov di,ax
mov al,c
mov cx,l
wrk: stosb
add di,319
loop wrk
popa
endm


@lineh macro x,y,c,l
local work
pusha
mov bx,320
mov ax,y
mul bx
add ax,x
mov di,ax
mov al,c
mov cx,l
rep stosb
popa
endm


@putpix macro x,y,c
pusha
@modvid 13h
@calcdi x,y
mov al,c
mov es:[di],al
popa
endm

@time macro t
local qui,wrk
push cx
push ax
mov ax,10000
wrk: mov cx,t
qui: loop qui
dec ax
jnz wrk
pop ax
pop cx
endm

@movpixh macro x,y,c,n,t
local wrk
pusha
@modvid 13h
mov bx,320
mov ax,y
mul bx
add ax,x
mov di,ax
mov cx,n
mov al,c
wrk:mov es:[di],0
inc di
mov es:[di],al
@time t
loop wrk
@waitkbd
@modvid 3
popa
endm

@calcdi macro x,y
push ax
push bx
mov bx,320
mov ax,y
mul bx
add ax,x
mov di,ax
pop bx
pop ax
endm

@vgbox macro X1,Y1,X2,Y2,C
@lineh X1,Y1,X2-X1+1,C
@lineh X1,Y2,X2-X1+1,C
@linev X1,Y1+1,Y2-Y1-1,C
@linev X2,Y1+1,Y-Y1-1,C
endm

adesso potete fare le cose basilari tipo tracciare un punto e visualizzare un carattere queste sono le funzioni che possiamo richiamare ma nel programma principale quindi dove scrivo INIZIO ne lcodice potete richiamare la macro scrivendo il nome della macro e se ci sono parametri inseriteli tipo
@vgbox 1,5,7,4,3
senza la parola macro che questa parola serve a definire la funzione!
ok adesso che sapete più o meno come funziona mi riposo un pò dopo che ho chiuso l'anno scolastico :)

Nessun commento: