JavascriptProva

venerdì 25 maggio 2012

Programmi con più segmenti e ASSUME: ripasso definitivo.

In realtà non ha molto senso assumere diversi registri di segmento per un segmento. Scrivo adesso un programmino che utilizza più di un segmento
dati SEGMENT
Dato1 DW 0BABAH
Dato2 DW 0CACAH


dati ENDS

text SEGMENT
assume CS:text,DS:dati
inizio: JMP     Procedura

Var     DW 0FAFAH

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

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

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
-u
141E:0000 EB03          JMP     0005
141E:0002 90            NOP
141E:0003 FA            CLI
141E:0004 FA            CLI
141E:0005 B400          MOV     AH,00
141E:0007 B003          MOV     AL,03
141E:0009 CD10          INT     10
141E:000B 2E            CS:
141E:000C A10300        MOV     AX,[0003]
141E:000F 8B1E0000      MOV     BX,[0000]
141E:0013 B400          MOV     AH,00
141E:0015 CD16          INT     16
141E:0017 B44C          MOV     AH,4C
141E:0019 CD21          INT     21
AX=0003  BX=0000  CX=002B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=000B   NV UP EI PL NZ NA PO NC
141E:000B 2E            CS:
141E:000C A10300        MOV     AX,[0003]                          CS:0003=FAFA
-p

AX=FAFA  BX=0000  CX=002B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=000F   NV UP EI PL NZ NA PO NC
141E:000F 8B1E0000      MOV     BX,[0000]                          DS:0000=20CD
-p

AX=FAFA  BX=20CD  CX=002B  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=0013   NV UP EI PL NZ NA PO NC
141E:0013 B400          MOV     AH,00
-
In pratica ho detto all'assemblatore di assumere come parte alta dell'indirizzo il registro CS per le variabili contenute nel segmento text, e di assumere come parte alta dell'indirizzo il registro DS per le variabili contenute nel segmento dati.

. Posso anche associare il segmento dati con ES, volendo:
dati SEGMENT
Dato1 DW 0BABAH
Dato2 DW 0CACAH


dati ENDS

text SEGMENT
assume CS:text,ES:dati
inizio: JMP     Procedura

Var     DW 0FAFAH

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

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

        MOV AH,4CH
        INT 21H

Procedura ENDP
text ENDS
END inizio
-u
141E:0000 EB03          JMP     0005
141E:0002 90            NOP
141E:0003 FA            CLI
141E:0004 FA            CLI
141E:0005 B400          MOV     AH,00
141E:0007 B003          MOV     AL,03
141E:0009 CD10          INT     10
141E:000B 2E            CS:
141E:000C A10300        MOV     AX,[0003]
141E:000F 26            ES:
141E:0010 8B1E0000      MOV     BX,[0000]
141E:0014 B400          MOV     AH,00
141E:0016 CD16          INT     16
141E:0018 B44C          MOV     AH,4C
141E:001A CD21          INT     21
AX=0003  BX=0000  CX=002C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=000B   NV UP EI PL NZ NA PO NC
141E:000B 2E            CS:
141E:000C A10300        MOV     AX,[0003]                          CS:0003=FAFA
-p

AX=FAFA  BX=0000  CX=002C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=000F   NV UP EI PL NZ NA PO NC
141E:000F 26            ES:
141E:0010 8B1E0000      MOV     BX,[0000]                          ES:0000=20CD
-p

AX=FAFA  BX=20CD  CX=002C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=140D  ES=140D  SS=141D  CS=141E  IP=0014   NV UP EI PL NZ NA PO NC
141E:0014 B400          MOV     AH,00
-
In pratica, tanto per rendermi sicuro di aver capito (ci riuscirò mai, con la mia incertezza cronica?) ecco il significato della direttiva ASSUME:

La direttiva ASSUME dà istruzioni all'assemblatore su quale registro prendere per stabilire la parte "alta" dell'indirizzo specificato nelle variabili per un contenuto della memoria.

Nessun commento:

Posta un commento