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 inizioVediamone 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 21Accidenti: 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 21Il 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:
immediato | diretto |
a registro | indiretto 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