Assembly ^^
salve raga !! ho un problema su un programmino asembly .. ora vi spiego cosa deve fare ..
deve disegnare una schacchiera di "X" e di spazzi a video, a dimensione pari ( la dimensione la immette l'utente )
il problema è che ne il tasm ne il tlink mi danno errori ...
iul pèrogramma mi termina subiti dopo aver acquisito la dimensione della scacchiera, ho provato a controllare i salti ma a me sembra tutto a posto ...
beh se qualcuno di voi ha voglia di dragli un occhiata il listato è questo
.MODEL SMALL
.STACK 100h
.DATA
Mess1 db "1-Inserisci dimensione:",13,10,'$'
Mess2 db "2-Esci",13,10,'$'
Mess3 db "inserisci:",'$'
var db (?)
.CODE
MOV AX,Seg mess1
MOV DS,AX
MOV DX,OFFSET Mess1
MOV AH,09h
INT 21h
MOV AX,Seg mess2
mov DS,AX
MOV DX,OFFSET Mess2
MOV AH,09h
INT 21h
Acquisisciscelta:
MOV AH,01h
INT 21h
Acquisicinumero:
MOV AX,SEG MESS3
MOV DS,AX
MOV DX,OFFSET MESS3
MOV AH,09H
INT 21H
MOV AH,01h
INT 21h
MOV var,AL
MOV CL,AL
MOV BL,AL
Ciclo:
MOV AX,2
DIV VAR
CMP AH,0
JNE Fine
Disegna:
DEC BL
MOV DL,"X"
MOV AH,02h
INT 21h
DEC BL
MOV DL," "
MOV AH,02h
INT 21h
CMP BL,0
JNE Disegna
MOV DL,10d
MOV AH,02h
INT 21h
MOV AL,13d
INT 21h
LOOP CICLO
Fine:
MOV AH,4ch
INT 21h
END
deve disegnare una schacchiera di "X" e di spazzi a video, a dimensione pari ( la dimensione la immette l'utente )
il problema è che ne il tasm ne il tlink mi danno errori ...
iul pèrogramma mi termina subiti dopo aver acquisito la dimensione della scacchiera, ho provato a controllare i salti ma a me sembra tutto a posto ...
beh se qualcuno di voi ha voglia di dragli un occhiata il listato è questo


.MODEL SMALL
.STACK 100h
.DATA
Mess1 db "1-Inserisci dimensione:",13,10,'$'
Mess2 db "2-Esci",13,10,'$'
Mess3 db "inserisci:",'$'
var db (?)
.CODE
MOV AX,Seg mess1
MOV DS,AX
MOV DX,OFFSET Mess1
MOV AH,09h
INT 21h
MOV AX,Seg mess2
mov DS,AX
MOV DX,OFFSET Mess2
MOV AH,09h
INT 21h
Acquisisciscelta:
MOV AH,01h
INT 21h
Acquisicinumero:
MOV AX,SEG MESS3
MOV DS,AX
MOV DX,OFFSET MESS3
MOV AH,09H
INT 21H
MOV AH,01h
INT 21h
MOV var,AL
MOV CL,AL
MOV BL,AL
Ciclo:
MOV AX,2
DIV VAR
CMP AH,0
JNE Fine
Disegna:
DEC BL
MOV DL,"X"
MOV AH,02h
INT 21h
DEC BL
MOV DL," "
MOV AH,02h
INT 21h
CMP BL,0
JNE Disegna
MOV DL,10d
MOV AH,02h
INT 21h
MOV AL,13d
INT 21h
LOOP CICLO
Fine:
MOV AH,4ch
INT 21h
END
Risposte
secondo me l'errore sta nella divisione, ovvero hai invertito dividendo e divisore
la svista della divisione forse non è l'unico errore.
per esempio:
carichi il reg c (contatore di riga?) ma poi non lo sfrutti;
inoltre il reg b (contatore di colonna ?) non lo ripristini all'inizio di ogni riga;
o sbaglio?
tony
*** CORREZIONE A POSTERIORI ***
eliminata l'obiezione evidenziata in rosso "carichi il reg c (contatore di riga?) ma poi non lo sfrutti", palesemente infondata.
per esempio:
carichi il reg c (contatore di riga?) ma poi non lo sfrutti;
inoltre il reg b (contatore di colonna ?) non lo ripristini all'inizio di ogni riga;
o sbaglio?
tony
*** CORREZIONE A POSTERIORI ***
eliminata l'obiezione evidenziata in rosso "carichi il reg c (contatore di riga?) ma poi non lo sfrutti", palesemente infondata.
scusa se rispondo a rate ...
forse scordi che la funz 01 immette il valore ASCII del tasto pigiato; se l'operatore batte 8, entra un hex 38, equivalente a 40.
per avere una scacchiera di 8 caselle l'operatore dovrebbe invece battere (mi par di ricordare) ctrl+H, che darebbe hex 08: forse non è questo ciò che tu desideri.
inoltre non usi la risposta di "acquisisciScelta", ma questo fa parte del "non finito".
inoltre mi è assai oscura la logica di quella divisione per terminare il loop di riga.
tony
forse scordi che la funz 01 immette il valore ASCII del tasto pigiato; se l'operatore batte 8, entra un hex 38, equivalente a 40.
per avere una scacchiera di 8 caselle l'operatore dovrebbe invece battere (mi par di ricordare) ctrl+H, che darebbe hex 08: forse non è questo ciò che tu desideri.
inoltre non usi la risposta di "acquisisciScelta", ma questo fa parte del "non finito".
inoltre mi è assai oscura la logica di quella divisione per terminare il loop di riga.
tony
Ho apportato alcune modifiche al programma proposto.
Questo pare funzionare:
Acquisisce come dimensione un intero pari, al massimo 8;
per dimensioni maggiori, occorre modificare la fase di input.
Mancano gli opportuni commenti, ma credo sia comprensibile.
A disposizione per eventuali chiarimenti.
Questo pare funzionare:
.MODEL SMALL .STACK 100h .DATA mess DB 'dimensione scacchiera: ','\$' dim DW 4 ;dimensione p DB " " ;primo carattere riga s DB "X" ;succ. carattere riga .CODE Begin: CALL blvid MOV AX,SEG mess MOV DS,AX MOV DX,OFFSET mess MOV AH,09H INT 21H Acquisisci: MOV AH,01h INT 21h XOR AH,AH SUB AL,30H MOV dim,AX SHR AL,1 JC Begin MOV CX,dim CMP CX,0 JE Fine CALL blvid MOV BX,dim Disegna: MOV DL,p MOV AH,02h INT 21h MOV DL,s MOV AH,02h INT 21h DEC BX DEC BX CMP BX,0 JA Disegna MOV DL,10 MOV AH,02h INT 21h MOV DL,13 INT 21h MOV BX,dim MOV AX,CX SHR AL,1 JNC RigaPari MOV p," " MOV s,"X" JMP L1 RigaPari: MOV p,"X" MOV s," " L1: LOOP Disegna Fine: MOV AH,4ch INT 21h blvid Proc MOV AH,00H ; Pulizia video MOV AL,03H INT 10H RET blvid EndP END Begin
Acquisisce come dimensione un intero pari, al massimo 8;
per dimensioni maggiori, occorre modificare la fase di input.
Mancano gli opportuni commenti, ma credo sia comprensibile.
A disposizione per eventuali chiarimenti.
