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.
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,51Hche viene tradotta dal debugger:
1802:0016 B85100 MOV AX,0051Semplicemente "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