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 textDi 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 inizioEcco 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 textBene.
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 inizioEcco 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 textProcedura 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,Var1mettono 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