Assembly ^^

davido1
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 :-D :-D




.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
itpareid
secondo me l'errore sta nella divisione, ovvero hai invertito dividendo e divisore

tony19
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.

tony19
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

lorven
Ho apportato alcune modifiche al programma proposto.
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.
:-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.