JavascriptProva

martedì 22 maggio 2012

Etichette e tabella dei simboli...ripasso generale.

Torno a ripassare gli elementi sulle variabili.
Dunque le etichette in assembly vengono messe, come già avevo studiato in passato, nella tabella dei simboli in questo modo:
Symbols:

                N a m e                 Type     Value    Attr

Variab . . . . . . . . . . . . . Word  0002   text 
XXX00  . . . . . . . . . . . . . L Near  0004   text 
XXX01  . . . . . . . . . . . . . L Near  000D   text 
inizio . . . . . . . . . . . . . L Near  0000   text 
 
Di esse vengono ricordati soltanto il tipo, il valore e il segmento.
Per quanto riguarda il valore, esso è invariabilmente l'indirizzo di memoria e non il contenuto della locazione di memoria.
E' poi l'istruzione che decide se prendere l'indirizzo o il contenuto.
Come dice Giobe, l'assemblatore ritiene etichette non incluse nelle sue tabelle di conversione.
Le etichette vengono distinte in:
  • etichette con i due punti;
  • etichette senza i due punti, di cui:
    • costanti, definite dalla direttiva EQU
    • variabili, definite dalle direttive DB o DW.
Bene.
Quelle con i due punti, in questo programmuscolo di cui sto trattando, sono "schedate" come L Near, mentre quella definita con la direttiva DW è "schedata" come Word.
Adesso mi faccio un programmuscolo-esercizio con i seguenti scopi:
Fare in modo che nella tabella dei simboli mi appaiano etichette di tutti i tipi.
text SEGMENT

inizio: JMP     XXX00
Var1 DW 4142H
Var2 DB 43H
Cost EQU 44H

XXX00:  
 MOV AH,00H
 MOV AL,03H
 INT 10H

 MOV CX,0AH

XXX01:  MOV AH,0EH
 MOV AL,41H
        INT 10H


        LOOP    XXX01
        
        MOV     AX,Var1
        MOV     BX,OFFSET Var1
        LEA     CX,Var1
        MOV     DX,XXX01
        LEA     AX,XXX01
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H


text ENDS
END inizio
Ecco la tabella dei simboli:
Symbols:

                N a m e                 Type     Value    Attr

Cost . . . . . . . . . . . . . . Number  0044h  
Var1 . . . . . . . . . . . . . . Word  0002   text 
Var2 . . . . . . . . . . . . . . Byte  0004   text 
XXX00  . . . . . . . . . . . . . L Near  0005   text 
XXX01  . . . . . . . . . . . . . L Near  000E   text 
inizio . . . . . . . . . . . . . L Near  0000   text
Bene.

E che ne è delle direttive che delimitano le procedure?
Ripassiamo...
text SEGMENT

inizio: JMP     Procedura
Var1 DW 4142H
Var2 DB 43H
Cost EQU 44H

Procedura PROC   
 MOV AH,00H
 MOV AL,03H
 INT 10H

 MOV CX,0AH

XXX01:  MOV AH,0EH
 MOV AL,41H
        INT 10H


        LOOP    XXX01
        
        MOV     AX,Var1
        MOV     BX,OFFSET Var1
        LEA     CX,Var1
        MOV     DX,XXX01
        LEA     AX,XXX01
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
Ecco la tabella:
Procedures,  parameters and locals:

                N a m e                 Type     Value    Attr

Procedura  . . . . . . . . . . . P Near  0005   text Length= 002B Private


Symbols:

                N a m e                 Type     Value    Attr

Cost . . . . . . . . . . . . . . Number  0044h  
Var1 . . . . . . . . . . . . . . Word  0002   text 
Var2 . . . . . . . . . . . . . . Byte  0004   text 
XXX01  . . . . . . . . . . . . . L Near  000E   text 
inizio . . . . . . . . . . . . . L Near  0000   text 
Procedura viene catalogata non come simbolo ma come procedura, e identificata come P Near.
Non ricordo quando è che viene usato un P Far e un L Far... Mi pare di ricordare che esistessero anche queste...
Comunque quello che mi interessa adesso è vedere bene le variabili.
Rivediamo il programmuscolo...

Queste istruzioni:
        MOV     AX,Var1
        MOV     BX,OFFSET Var1
        LEA     CX,Var1
mettono rispettivamente, nei vari registri, il contenuto di Var1, l'indirizzo di Var1 e ancora l'indirizzo di Var1.
Come vengono tradotte dal debug?
1802:0016 2E            CS:
1802:0017 A10200        MOV     AX,[0002]
1802:001A BB0200        MOV     BX,0002
1802:001D 8D0E0200      LEA     CX,[0002]
...laddove Var1 viene tradotto come l'indirizzo fra parentesi quadre quando non preceduto da OFFSET, viene tradotto come l'indirizzo semplice quando preceduto da OFFSET, viene tradotto ancora fra parentesi quadre quando l'istruzione è LEA.
Coms si può rendere tutto questo in termini umani?

L'istruzione MOV è riferita all'indirizzo. Di per sè, MOV mette nel registro il numero che le viene presentato.
Facciamo un'aggiunta con l'immissione in un registro di un numero puro e isoliamo l'istruzione:
MOV     AX,51H
che viene tradotta dal debugger:
1802:0016 B85100        MOV     AX,0051
Semplicemente "metti in AX il numero 0051.
Semplice, lineare.
Ma allora perchè
MOV     AX,Var1
...è tradotta come
1802:0019 2E            CS:
1802:001A A10200        MOV     AX,[0002]
...? Lasciamo stare il CS, che si riferisce al segmento...
Semplicemente perchè quando l'istruzione MOV ha a che fare con un'etichetta probabilmente prende per buono che debba scrivere il valore contenuto all'indirizzo dell'etichetta, non il valore dell'indirizzo dell'etichetta!
E devo rispolverarmi tutte le nozioni relative all'indirizzamento.

Nessun commento:

Posta un commento