Introduzione alla programmazione Assembly

Materie:Appunti
Categoria:Informatica

Voto:

1 (2)
Download:101
Data:28.09.2001
Numero di pagine:5
Formato di file:.doc (Microsoft Word)
Download   Anteprima
introduzione-programmazione-assembly_2.zip (Dimensione: 9.09 Kb)
trucheck.it_introduzione-alla-programmazione-assembly.doc     38 Kb
readme.txt     59 Bytes


Testo

Introduzione alla programmazione assembly: Domande comuni
1. Che cos'è lo stack?
2. Strutture LIFO / FIFO
3. Utilizzi dello Stack
4. Sottoprogrammi
5. Il segmento video e la segmentazione
6. Traduzione delle strutture di alto livello

1. Che cos'è lo stack?
lo stack è un'area di memoria di tipo LIFO (Last Input / First Output) di lunghezza predefinita nelle impostazioni del suo segmento, che viene utilizzato in prevalenza per il salvataggio dei dati ed il loro ripristino. Gli oggetti che salva sono registri a 16 bit per default, tramite le funzioni push e pop.

ESEMPIO: USO DI PUSH E POP PER SALVARE 2 REGISTRI
.....
push ax ;salva ax nello stack
push bx ;salva bx nello stack
;DOPO QUESTA ISTRUZIONE IL PUNTATORE DI STACK E' INDIRIZZATO SULL'AREA CHE CONTIENE ;IL VALORE DI BX.
.....
mov bx,...
mov ax,...
.....
;QUESTE SOPRA ED ALTRE ISTRUZIONI VANNO A MODIFICARE BX OD AX, MA POI LE ;RIPRISTINIAMO
pop bx ;ripristina il contenuto di bx
pop ax ;ripristina il contenuto di ax
;L'ORDINE DEL POP E' GIUSTAMENTE INVERSO PERCHE' E' UNA STRUTTURA LIFO

2. Strutture LIFO / FIFO
L prima sigla indica che l'ultimo elemento che entra in questa pila di dati è il primo ad essere richiamato (tipo lo stack), l'altra invece indica che il primo ingresso in entrata è anche il primo ad essere eventualmente richiamato.
3. Utilizzi dello Stack
Lo stack ha svariati indirizzi che elenco brevemente:
1. Salvataggio dei dati (push ax, pop ax)
2. Salvataggio di puntatori (push SI, pop SI)
3. Semplice scambio di registri (push ax, push bx -> pop ax, pop bx)
4. La call lo usa per salvare il puntatore di programma e ripristinarlo (vedi sottoprogrammi)
5. Passaggio di parametri ai sottoprogrammi (vedi sottoprogrammi v.fotocopia)
6. Dfinizione di variabili locali nei sottoprogrammi (vedi sottoprogrammi)
4. Sottoprogrammi
I sottoprogrammi sono delle funzioni o procedure che terminano con la RET e sono richiamabili se ben fatte da qualsiasi programma tramite la funzione CALL. A differenza dell'utilizzo di una semplice jump, con la quale saltare alla parte di programma da fare e poi ritornare con un'altra che salta all'etichetta dell'istruzione dopo, la CALL esegue il sottoprogramma e ritorna con IP (Puntatore di Programma) nel punto esatto (l'istruzione successiva).

ESEMPIO: SOTTOPROGRAMMA DI RITARDO + MEMORIA VIDEO
;VARIABILI DI SUPPORTO
att1 db ?
att2 db ?
START PROC NEAR
;CI SI SPOSTA NEL SEGMENTO VIDEO
mov ax,0d800h
mov es,ax
mov SI,0
;SCRIVO ‘NOME’ A VIDEO UNA LETTERA PER VOLTA CON UNA PROCEDURA DI RITARDO
mov es:[SI],'N'
call ritardo
mov es:[SI],'O'
call ritardo
mov es:[SI],'M'
call ritardo
mov es:[SI],'E'

jmp fine

ritardo: mov att1,0Fh
cicloes: mov att2,0FFFFh
cicloin: dec att2
jnz cicloin
dec att1
jnz cicloes
RET ;QUESTA RET E' QUELLA DEL SOTTOPROGRAMMA
fine: RET ; QUESTA E' LA RET DI FINE PROGRAMMA
Immaginate se ogni volta che salto al ritardo dovessi tornare con un altro jump alla lettera dove ero arrivato, dovrei scrivere + funzioni tutte diverse, oppure salvare IP in una variabile e poi ripristinarlo, ma...
...
CALL ritardo = push IP
{blocco istruzioni}
pop IP
...
il vantaggio della call rispetto a salvare IP in una variabile e poi ricaricarlo sta nel fatto che a volte si devono fare + chiamate
e lo stack è utile per non fare sbagli e per la ricorsione!!!!!!
Posso passare al sottoprogramma dei parametri tramite lo stack oppure utilizzando dei registri(tutti i passaggi sono per valore), salvando un puntatore nello stack potrò inoltre allocare al di sopra di esso delle aree di memoria da utilizzare e questo è utile in quanto favorisce le chiamate ad altri sottoprogrammi o al sottoprogramma stesso per la ricorsione.
ESEMPIO: PARAMETRI IN STACK (spezzone di ipotetico programma)
...
push ax
push bx

push bp

variabile1 equ word ptr [bp+2] ; parte alta = BP+1, bassa = BP+2 (ecco perchè word ptr...)
variabile2 equ word ptr [bp+4]
call sottoprogramma
...
sottoprogramma:
;nel sottoprogramma:
mov cx,variabile1
mov variabile2,DI
...
RET
;In pratica l’istruzione equ associa l’etichetta variabile ad un valore puntato da BP+n nello stack. ;Occhio perchè è difficile...

ESEMPIO: PARAMETRI TRAMITE REGISTRI + FUNZIONE STAMPASTRINGHE

;variabili
thematrixer db ‘thematrixer è',13,10,0 ;13 =ritorno di carrello, 10 =nuova linea, 0 =/0 dell’ANSI C
ferrari db 'Ferrari Mattia',13,10,0

;main
START PROC NEAR
mov SI,offset thematrixer
call stampastringa
mov SI,offset ferrari
call stampastringa
jmp ESCI

; STAMPASTRINGA : procedura che stampa a video una stringa formato ANSI C ( /0 )
;
; INPUT : Registro SI (Offset stringa)
;
; REG DISTRUTTI: ax, bx, dx , SI
;
; REG RITORNATI: /
;

stampastringa:
CICLO: mov dl,[SI]
cmp dl,0
jz FINE
inc SI
mov ah,2
int 21h
jmp CICLO
FINE: RET

ESCI: RET



5. Il segmento video e la segmentazione
Il segmento video è un'area di memoria utilizzata per la visualizzazione sul display.
Ogni carattere è caricato in questa memoria riservata e descritto attraverso 2 byte: uno per la codifica e uno per gli attributi.
Bisogna solamente vedere il segmento video come un'array di 4000 byte puntato da un registro SI

La segmentazione è rappresentabile come es:[SI], perchè es è il segmento ed SI l'offset:
in tutto sono 32 bit che il microprocessore fa diventare 20 così:

1) moltiplico x 16 il registro di segmento (aggiungo 4 zeri in fondo od uno se esa...)
2) sommo ad esso l'offset
3) ho così il mio valore da 20 bit che mi indirizza da qualche parte nel mio MB disponibile (2^20=...)

ESEMPIO: SEGMENTAZIONE VIDEO
mov ax,0D800h
mov es,ax
mov SI,7D0h ;2000d
mov es:[SI],’A’

SIGNIFICA:
MOV D800 * 16+ 7D0, A
D8000 +
7D0 =
-------------
D87D0 -> EFFETTIVO PUNTAMENTO RAM

6. Traduzione delle strutture di alto livello
tranne il for che è fatto direttamente con la loop, il resto lo si fa posizionando correttamente le istruzioni cmp e test secondo uno schema intuibile realizzando un breve programma di flusso.

cmp ax,bx
j Etichetta o jn Etichetta

carry se bx è maggiore (senza segno): jb, jc
ncarry se ax è maggiore (senza segno): ja, jnc
overflow se bx è maggiore (con segno): jo
noverflow se ax è maggiore (con segno): jno
zero se uguali: jz,je
nzero se diversi: jnz,jne

generalmente l'etichetta a cui saltare indica la parte da fare se falso (pura comodità)
1

Esempio