salve, avrei un problemino: dunque dovrei scrivere un programma in assembler ke mi rikieda di immettere da tastiera un vettore di 6 numeri interi, e una volta fatto cioè dovrei avere la visualizzazione di quanti numerti pari ho immesso, e di quanti numeri pari ho immesso. Sn riuscito a sviluppare l'imput da tastiera ma mi riconosce semnpre sei numeri pari anke se digito dei numeri dispari!avro sbagliato qlkosa nell'algoritmo per calcolare la quantità dei pari e dei dispari! Qlk1 ke padroneggia da un pò l'assembler potrebbe darmi una mano x piacere?grazie 1000:-)
;===============================SEGMENTO STACK===============================
STACK SEGMENT PARA STACK 'STACK'
DB 100h DUP(0)
STACK ENDS
;===============================SEGMENTO DATI================================
DATA SEGMENT PARA PUBLIC 'DATA'
dieci DB 10 ;conversione ASCII-numero
dieciw DW 10 ;conversione numero-ASCII
accapo DB 13,10,'$'
msg3 DB ' valore immesso >256 considerato come = $'
n_elem DB 6
VET DB 6 DUP(?)
MSG DB 'VETTORE: $'
Q DB 2
MEX1 DB ' NUMERO DEI PARI: $'
MEX2 DB ' NUMERO DEI DISPARI: $'
contapar db ?
contadis db ?
;....
DATA ENDS
;==============================SEGMENTO CODICE===============================
CODE SEGMENT PARA PUBLIC 'CODE'
MAIN PROC FAR
;------------------------------PROLOGO STANDARD------------------------------
ASSUME CS:CODE
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,data
MOV ES,AX
ASSUME ES:DATA
MOV DS,AX
ASSUME DS:DATA
;=====================================MAIN====================================
XOR AX,AX
MOV CL,n_elem
MOV SI,0
LEA DX,MSG
CALL VISUAL
CICLO_M: MOV AL,VET[SI]
LEA DX,ACCAPO
CALL VISUAL
CALL INPUT_N
LOOP CICLO_M
mov ax,255
call visascii
mov cl,n_elem
ciclopd: mov al,vet[si]
div Q
CMP AH,0
JZ PARI
JNZ DISPARI
JMP GO
PARI: INC CONTAPAR
JMP GO
DISPARI: INC CONTADIS
GO: INC SI
LOOP ciclopd
xor ax,ax
mov al,CONTAPAR
LEA DX,ACCAPO
CALL VISUAL
LEA DX,MEX1
CALL VISUAL
CALL STAMPA_N
XOR AX,AX
MOV AL,CONTADIS
LEA DX,ACCAPO
CALL VISUAL
LEA DX,MEX2
CALL VISUAL
CALL STAMPA_N
LEA DX,ACCAPO
CALL VISUAL
RET
MOV AH,4CH ;Ritorno al dos
INT 21H
;---------------------------------PROCEDURE di utility----------------------
;---------------------------------------------------------------------------
; input da tastiera (legge carattere ascii da keyboard in AL e lo sposta in DL)
CARATTERE PROC NEAR
MOV AH,1
INT 21H
MOV DL,AL
RET
CARATTERE ENDP
;----------------------------------------------------------------------------
; VISUALizzazione carattere con AL che contiene il carattere da VISUALizzare
VISASCII PROC NEAR
PUSH AX
PUSH BX
MOV AH,14
MOV BH,0
INT 10H
POP BX
POP AX
RET
VISASCII ENDP
;----------------------------------------------------------------------------
;VISUALizza su display la stringa puntata da DS:DX mediante INT 21h,09h
VISUAL PROC NEAR
PUSH AX
MOV AH,9
INT 21h
POP AX
RET
VISUAL ENDP
;----------------------------------------------------------------------------
;Input di un carattere '0'..'9' o INVIO restituito in DL
Char_N PROC NEAR
PUSH AX
Ripeti: MOV AH,1
INT 21h
MOV DL,AL
CMP DL,13
JE Char_N_Ok ;E' stato premuto INVIO?
CMP DL,'0'
JB Indietro ;Il carattere è < '0'?
CMP DL,'9'
JBE Char_N_Ok ;Il carattere <= '9'?
Indietro: PUSH BX
MOV AH,3 ;servizio 3:acquisizione cursore
MOV BH,0 ;pagina 0
INT 10h ;DH riga DL colonna
DEC DL
MOV AH,2 ;servizio 2:definizione cursore
INT 10h
POP BX
JMP Ripeti ;rilegge il carattere
Char_N_Ok: POP AX
RET
Char_N ENDP
;----------------------------------------------------------------------------
;Lettura di un numero (byte) da tastiera: risultato in AL
Input_N PROC NEAR
PUSH BX
PUSH CX
PUSH DX
XOR AX,AX ;Inizializza AX utilizzato
; implicitamente da MUL
MOV CX,3 ;Lettura di massimo 3 caratteri
Ciclo1: CALL Char_N ;Input di un carattere con echo mediante
; INT 21h,01h: codice ASCII in DL
CMP DL,13
JE VerificaB ;E' stato premuto INVIO?
SUB DL,'0' ;Conversione ASCII-numero
MUL dieci ;AX <- dieci * AL
ADD AL,DL
LOOP Ciclo1 ;Sono state lette meno di tre cifre?
VerificaB: CMP AX,256
JB Fuori ;E' stato effettivamente letto un byte?
LEA DX,msg3 ;' valore immesso >256 e valore considerato = $'
CALL VISUAL ;Stampa la stringa puntata da DS:DX
; mediante INT 21h,09h
XOR AH,AH
CALL Stampa_N ;Stampa del byte utilizzato
Fuori: LEA DX,accapo ;Passaggio alla riga successiva
CALL VISUAL ;Stampa la stringa puntata da DS:DX
; mediante INT 21h,09h
POP DX
POP CX
POP BX
RET
Input_N ENDP
;----------------------------------------------------------------------------
;Scrittura a video del valore di AX come stringa di cifre
Stampa_N PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,0 ;inizializza numro di cifre
Ciclo2: MOV DX,0
DIV dieciw ;AX <- DX:AX / dieciw
;DX <- resto(0..9)
ADD DX,'0' ;converione numero-cifra
PUSH DX ;salvataggio cifra
INC CX ;incrementa numero di cifre
CMP AX,0
JNE Ciclo2 ;Ci sono altre cifre?
MOV AH,2 ;servizio 02h: output di un carattere
Ciclo3: POP DX
INT 21h
LOOP Ciclo3 ;Ci sono altre cifre?
POP DX
POP CX
POP BX
POP AX
RET
Stampa_N ENDP
;----------------------------------------------------------------------------
MAIN ENDP
CODE ENDS
END MAIN