JavascriptProva

mercoledì 23 maggio 2012

Ripasso sui registri di segmento e la direttiva ASSUME...

E ora affrontiamo il ripasso e la rimessa a punto delle nozioni sui segmenti.

Nel caso dell'indirizzamento diretto e indiretto con registro, quelli in cui si usa (o si dovrebbe usare) la parentesi quadra, si specifica un indirizzo, ma nel sistema in cui ci muoviamo un indirizzo non si può specificare con un numero a 16 bit!.

Tralasciando per ora il ripasso della famosa questione degli indirizzi logici e di quelli fisici (che ricordo bene, anche se come al solito ia mia mente iper-iper-ipercritica mi fa sempre credere di non ricordare mai un tubo costringendomi al ripasso ossessivo perpetuo), ribadisco il concetto secondo cui un indirizzo ha bisogno, per essere specificato, anche di un altro valore di 16 bit che è contenuto nei registri di segmento.
Come dice il Profeta, nel momento in cui l'assemblatore incontra delle etichette, o dei nomi di variabili, deve puntare le etichette con un preciso registro di segmento, ossia deve comprendere per filo e per segno l'indirizzo completo, e quindi ha bisogno anche dell'altra metà dell'indirizzo, che deve essere messa su un registro di segmento (CS, DS, ES, SS).
(In realtà per qualunque istruzione è necessario avere il valore di un registro di segmento, in quanto ogni istruzione viene messa in un indirizzo preciso, che non può essere specificato se non si fa riferimento anche all'"altra metà", ma adesso non mi voglio impicciare la testa...

Questo assemblatore che sto usando io usa tranquillamente il registro CS per tutte le sue operazioni, anche per ottenere l'indirizzo completo specificato dalle variabili. Lo fa automaticamente.
Ecco perchè genera istruzioni come queste:
802:000A 2E            CS:
802:000B A10200        MOV     AX,[0002]
802:000E 2E            CS:
802:000F 8B1E0200      MOV     BX,[0002]
Se vado a usare il vecchio assemlatore MASM, invece, ecco cosa accade nel suo lavoro con il medesimo sorgente:
C:\Arch-Lab\Lavoro\old>masm mio
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988.  All rights reserved.

Object filename [mio.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:
mio.ASM(3): error A2062: Missing or unreachable CS
mio.ASM(7): error A2062: Missing or unreachable CS
mio.ASM(13): error A2068: Cannot address with segment register

  48604 + 394623 Bytes symbol space free

      0 Warning Errors
      3 Severe  Errors

C:\Arch-Lab\Lavoro\old>
L'errore di cui parla il "Profeta".
Questo assemblatore non riconosce automaticamente il registro CS come portatore dell'"altra metà dell'indirizzo" delle istruzioni e delle etichette varie, e pertanto segnala errore.

Ecco la correzione:
text SEGMENT
ASSUME CS:text
inizio: JMP     Procedura

Var     DW 0FAFAH

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


        MOV     AX,Var
        
        
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
che dice all'assemblatore di considerare come "altra metà degli indirizzi" il numero situato nel registro CS.
C:\Arch-Lab\Lavoro\old>masm mio
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988.  All rights reserved.

Object filename [mio.OBJ]:
Source listing  [NUL.LST]:
Cross-reference [NUL.CRF]:

  48604 + 394623 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors

C:\Arch-Lab\Lavoro\old>
E vediamo com'è adesso l'istruzione che prevede un indirizzamento diretto, tramite una variabile:
1802:000B 2E            CS:
1802:000C A10300        MOV     AX,[0003]

Mettiamoci pure un'istruzione che prevede un indirizzamento indiretto tramite registro.
text SEGMENT
ASSUME CS:text
inizio: JMP     Procedura

Var     DW 0FAFAH

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


        MOV     AX,Var
        MOV     BX,OFFSET Var
        MOV     CX,[BX]
        
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
Disassemblato:
1802:000B 2E            CS:
1802:000C A10300        MOV     AX,[0003]
1802:000F BB0300        MOV     BX,0003
1802:0012 8B0F          MOV     CX,[BX]
Esecuzione passo-passo:
AX=0003  BX=0000  CX=001C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000B   NV UP EI PL NZ NA PO NC
1802:000B 2E            CS:
1802:000C A10300        MOV     AX,[0003]                          CS:0003=FAFA
-p

AX=FAFA  BX=0000  CX=001C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000F   NV UP EI PL NZ NA PO NC
1802:000F BB0300        MOV     BX,0003
-p

AX=FAFA  BX=0003  CX=001C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=0012   NV UP EI PL NZ NA PO NC
1802:0012 8B0F          MOV     CX,[BX]                            DS:0003=009F
-p

AX=FAFA  BX=0003  CX=009F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=0014   NV UP EI PL NZ NA PO NC
1802:0014 B400          MOV     AH,00
-
Ecco: per l'istruzione di un indirizzamento indiretto con registro, invece, come "altra metà" dell'indirizzo viene assunto il registro DS, non il CS nonostante sia stata usata la direttiva ASSUME per quest'ultimo.
C'è ancora da ragionare...

Nessun commento:

Posta un commento