JavascriptProva

martedì 22 maggio 2012

Ripasso di indirizzamento immediato, diretto, a registro e indiretto con registro

Adesso un po' di ripasso e messa a posto sulle modalità di indirizzamento.
Vediamo quante ne conosciamo...

Ora mi scrivo un programmuscolo con indirizzamento immediato, diretto e a registro.
text SEGMENT

inizio: JMP     Procedura
Var     DW 0BABAH


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


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

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
Vediamone la traduzione nel debug:
-u
1802:0000 EB02          JMP     0004
1802:0002 BABAB4        MOV     DX,B4BA
1802:0005 00B003CD      ADD     [BX+SI+CD03],DH
1802:0009 10B8DADA      ADC     [BX+SI+DADA],BH
1802:000D 2E            CS:
1802:000E A10200        MOV     AX,[0002]
1802:0011 B400          MOV     AH,00
1802:0013 CD16          INT     16
1802:0015 B44C          MOV     AH,4C
1802:0017 CD21          INT     21
Accidenti: traduzione fasulla!
Ecco:
-u 0004
1802:0004 B400          MOV     AH,00
1802:0006 B003          MOV     AL,03
1802:0008 CD10          INT     10
1802:000A B8DADA        MOV     AX,DADA
1802:000D 2E            CS:
1802:000E A10200        MOV     AX,[0002]
1802:0011 B400          MOV     AH,00
1802:0013 CD16          INT     16
1802:0015 B44C          MOV     AH,4C
1802:0017 CD21          INT     21
Il valore della variabile è messo fra parentesi quadra. Questo significa che va preso in considerazione l'indirizzo corrispondente a qual numero.
Ed ecco l'esecuzione passo-passo:
AX=0003  BX=0000  CX=0019  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000A   NV UP EI PL NZ NA PO NC
1802:000A B8DADA        MOV     AX,DADA
-p

AX=DADA  BX=0000  CX=0019  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000D   NV UP EI PL NZ NA PO NC
1802:000D 2E            CS:
1802:000E A10200        MOV     AX,[0002]                          CS:0002=BABA
-p

AX=BABA  BX=0000  CX=0019  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=0011   NV UP EI PL NZ NA PO NC
1802:0011 B400          MOV     AH,00
-
Il valore della variabile, riportato nella tabella dei simboli, è:
Symbols:

                N a m e                 Type     Value    Attr

Var  . . . . . . . . . . . . . . Word  0002   text 
inizio . . . . . . . . . . . . . L Near  0000   text 
Sì: come già visto, è bastato inserire il nome di una variabile nell'istruzione MOV per far sì che si avesse un indirizzamento diretto e non immediato: non viene posto nel registro il valore della variabile come riportato nella tabella dei simboli del listato, ma il numero posto nell'indirizzo corrispondente al valore della variabile.

Bene.
Adesso cerchiamo di fare un indirizzamento a registro.

text SEGMENT

inizio: JMP     Procedura



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


        MOV     BX,0DADAH
        MOV     AX,BX
        
        
        MOV AH,00H
        INT 16H

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
Eccolo in debug:
-u
1802:0000 EB00          JMP     0002
1802:0002 B400          MOV     AH,00
1802:0004 B003          MOV     AL,03
1802:0006 CD10          INT     10
1802:0008 BBDADA        MOV     BX,DADA
1802:000B 8BC3          MOV     AX,BX
1802:000D B400          MOV     AH,00
1802:000F CD16          INT     16
1802:0011 B44C          MOV     AH,4C
1802:0013 CD21          INT     21
1802:0015 B44C          MOV     AH,4C
1802:0017 CD21          INT     21
Ed eccone l'esecuzione passo-passo:
AX=0003  BX=0000  CX=0015  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=0008   NV UP EI PL NZ NA PO NC
1802:0008 BBDADA        MOV     BX,DADA
-p

AX=0003  BX=DADA  CX=0015  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 8BC3          MOV     AX,BX
-p

AX=DADA  BX=DADA  CX=0015  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000D   NV UP EI PL NZ NA PO NC
1802:000D B400          MOV     AH,00
-


Facciamo un po' di filosofia...
Per farla intendere agli idioti come me:
Se io ho un numeretto che si chiama Pasquale, nel caso in cui nell'istruzione io scrivo MOV AX,Pasquale, metto in AX il valore di Pasquale. Credo che questa si possa considerare come una forma di indirizzamento immediato: se io scrivo il numeretto direttamente o scrivo il nome del numeretto che si chiama Pasquale, la cosa non cambia.
Ora nel caso in cui il numeretto si trovi nel registro BX posso considerare di avere un numeretto che si chiama BX: Se io scrivo MOV AX,BX è come se scrivo il nome del numeretto quando il numeretto si chiama Pasquale, e quindi questa sarebbe assimilabile alla situazione di un indirizzamento immediato...
...credo!

C'è poi l'indirizzamento diretto: anzichè usare nell'istruzione il valore del numeretto che si chiama Pasquale, uso il valore che sta scritto all'indirizzo corrispondente al valore di Pasquale, e questo si specifica con la parentesi quadra.
Stessa cosa per l'indirizzamento indiretto con registro: non voglio il valore del numeretto che si chiama BX, ma voglio il valore che sta scritto all'indirizzo corrispondente al valore del numeretto che si chiama BX.

Quindi possiamo stabilire una cosa del genere:

immediatodiretto
a registroindiretto con registro

Ora facciamo un programuscolo con un indirizzamento indiretto con registro:
text SEGMENT

inizio: JMP     Procedura

Var     DW 0FAFAH

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


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

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
    
Traduzione (disassemblato):
--u
1802:0000 EB02          JMP     0004
1802:0002 FA            CLI
1802:0003 FA            CLI
1802:0004 B400          MOV     AH,00
1802:0006 B003          MOV     AL,03
1802:0008 CD10          INT     10
1802:000A BB0200        MOV     BX,0002
1802:000D 2E            CS:
1802:000E 8B07          MOV     AX,[BX]
1802:0010 B400          MOV     AH,00
1802:0012 CD16          INT     16
1802:0014 B44C          MOV     AH,4C
1802:0016 CD21          INT     21
1802:0018 2100          AND     [BX+SI],AX
1802:001A 0000          ADD     [BX+SI],AL
1802:001C 0000          ADD     [BX+SI],AL
1802:001E 0000          ADD     [BX+SI],AL
-
Ed esecuzione passo-passo:
AX=0003  BX=0000  CX=0018  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000A   NV UP EI PL NZ NA PO NC
1802:000A BB0200        MOV     BX,0002
-p

AX=0003  BX=0002  CX=0018  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=000D   NV UP EI PL NZ NA PO NC
1802:000D 2E            CS:
1802:000E 8B07          MOV     AX,[BX]                            CS:0002=FAFA
-p

AX=FAFA  BX=0002  CX=0018  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=17F2  ES=17F2  SS=1802  CS=1802  IP=0010   NV UP EI PL NZ NA PO NC
1802:0010 B400          MOV     AH,00
-
Ecco. In pratica, questo indirizzamento indiretto con registro è in qualche modo simile all'indirizzamento diretto che fa uso dell'indirizzo contenuto nel valore di una variabile: qui l'indirizzo è contenuto nel valore di un registro.

C'è poi tutta una serie di concetti da ripassare e rimettere a posto a proposito di quel CS: che appare prima delle istruzioni di indirizzamento diretto e indiretto con registro...

Nessun commento:

Posta un commento