oregon ha scritto:
E no, gli array non funzionano come nel C che fa internamente il calcolo, tramite gli indici, della locazione di memoria da utilizzare nell'array.
In assembly i due registri non sono indici ma semplici valori che sono sommati e rappresentano una locazione di memoria. Quando scrivi
MOV MAT[SI][BX],AL
è come se scrivessi
MOV MAT[SI+BX],AL
e quindi ottieni la locazione in cui scrivere (a partire da MAT) all'indirizzo BX+SI.
Quindi se BX=0 SI=1 oppure BX=1 SI=0 vai a scrivere nella stessa locazione.
Dunque devi calcolare tu la posizione esatta in base al valore degli "indici" e di quanto è grande una riga.
Mi correggo , ho risolto in questo modo. Va bene? O è stata fortuna? Ci sarebbe un modo per renderlo più simile al C?
.MODEL MEDIUM
.STACK 100H
.DATA
MAT DB RIGHE*COLONNE DUP(?)
RIGHE EQU 2
COLONNE EQU 2
DOM DB 'INSERISCI',13,10,'$'
.CODE
.STARTUP
MOV AX,@DATA
MOV DS,AX
LEA BX,MAT
MOV CX,RIGHE*COLONNE
CICLO1:
MOV AH,09H
MOV DX,OFFSET DOM
INT 21H
MOV AH,01H
INT 21H
MOV MAT[BX][SI],AL
ADD SI,1
CMP SI,COLONNE
JNE CICLO2
ADD BX,COLONNE
MOV SI,0
CICLO2:
LOOP CICLO1
MOV BX,0
MOV CX,0
MOV SI,0
LEA BX,MAT
MOV CX,RIGHE*COLONNE
CICLO3:
MOV AH,02H
MOV DL,MAT[BX][SI]
INT 21H
ADD SI,1
CMP SI,COLONNE
JNE CICLO4
ADD BX,COLONNE
MOV SI,0
CICLO4:
LOOP CICLO3
MOV AH,4CH
INT 21H
END