Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Introduzione alla programmazione assembly: Domande comuni

informatica



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 141f53b ax nello stack

push bx ;salva 141f53b 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:

Salvataggio dei dati (push ax, pop ax)

Salvataggio di puntatori (push SI, pop SI)

Semplice scambio di registri (push ax, push bx -> pop ax, pop bx)

La call lo usa per salvare il puntatore di programma e ripristinarlo (vedi sottoprogrammi)

Passaggio di parametri ai sottoprogrammi (vedi sottoprogrammi v.fotocopia)

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


                  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<x> 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<x> Etichetta o jn<x> 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à)




Privacy




Articolo informazione


Hits: 1948
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024