Ciao
allora hai commesso alcuni errori
vedrò di farteli capire.
iniziamo ad analizzare
PUSH AX
PUSH SI
PUSH DI
MOV AX,LUNG ;Genera un numero casuale tra 0 e 20
CALL Random
qui in teoria non hai commesso errori ma mi sembra strano che la routine Random usi anche i registri si e di.
se hai fatto le tre push iniziali per salvaguardare i registri hai sprecato solo del codice perchè sono i programmi e non le subroutine a dover gestire questo compito.
perchè i registri normalmente servono per passare i dati tra subroutine e programma.
comunque in ottica didattica ci può stare.
LEA SI,StarVY ;Vettore dove sono memorizzate le righe
LEA DI,starVX ;Vettore dove sono memorizzate le colonne
PUSH AX
qui hai fatto bene peccato però che saranno fonte di guai nelle righe successive.
SHL AX,1 ;Moltiplico per 2 AX perchè il Vettore è DW
questa riga non serve a nulla in quanto ax è gia di per se una word.
ADD SI,AX ;Sposto SI e DI in modo tale che puntano sulle coordinate
ADD DI,AX ;del quadrato memorizzate nei due Vettori
POP AX
qui c'è la prima nota dolente
in quanto di e si contengono gli indirizzi dei vettori mentre ax è un numero casuale quindi ammeno che tu non hai definito 2 vettori talmente grandi da poter contenere tutti i possibili numeri generati,levando la shl perchè altrimenti sarebbero il doppio!, ciò costituisce un errore perchè andresti a sovrascrivere locazioni di memoria che non hanno nulla a che vedere con i vettori.
CMP StarVY[SI],0 ;Confronto se il quadrato è gia stato creato
JNZ Esci ;se si ,esce
gravissimo errore
perchè usi si come un indice di vettore ma si contiene l'indirizzo del vettore e probbabilmente il vettore non è cosi grande quindi vai ad indirizzare locazioni di memoria che non hanno nulla a che vedere con i vettori.
la forma corretta è
cmp word ptr [si],0
MOV BX,15
MUL BX ;moltiplico il numero casuale per 15
INC AX
questa parte va bene
MOV StarVX[DI],AX ;salvo la coordinata delle colonne del nuovo quadrato
gravissimo errore vedi spiegazione della cmp
la forma corretta è mov word ptr [di],ax
MOV Column,AX
va bene
MOV AX,StarVY[SI]
ADD AX,1 ;incremento la coordinata delle righe
qui c' è errore perchè si contiene sempre l'indirizzo del vettore.
forma corretta : mov ax,word ptr [si]
MOV Row,AX
MOV StarVY[SI],AX ;salvo la coordinata delle righe del nuovo quadrato
gravissimo errore vedi spiegazione della cmp
M_Brick Column,Row,COLStar ;Macro che mi Visualizza il quadrato appena creato
qui e corretto
Esci: POP DI
POP SI
POP AX
RET
vedi discorso delle push iniziali.
per gli indirizzamenti
ricordati che se usi la lea devi usare la forma "[registro]" e poi il registro deve essere incrementato 1 x i byte
2 x le word
4 X le dword
esempio mov word ptr [di],5
mentre se non vuoi usare la lea la forma corretta e nomevariabile[registro] dove registro deve avere un valore <= alla dimensione del registro -1.
perchè i vettori in assembler cominciano da 0.
se non hai capito come modificare il programma ti darò una mano.
spero di esserti stato d'aiuto