in
La comunitĂ  italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

c'è qlke anima buonake m dà una mano per piacere?

Ultimo messaggio ricevuto il 07-01-2005 16.58 da M]i[K. 0 risposta(e).
Pagina 1 di 1 (1 elemento/i)
Ordina messaggi: Precedente Successivo
  • 07-01-2005 16.58

    • M]i[K
    • Non Valutato
    • Registrato il 07-01-2005
    • Messaggi 1

    c'è qlke anima buonake m dà una mano per piacere?

    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
    • No log
Pagina 1 di 1 (1 elemento/i)
Prelevato da http://www.devspy.com/forums/p/2803/2803.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"