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 inizioDisassemblato:
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