Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 46
  1. #1

    Programma Assembly

    ciao a tutti
    Devo fare un programma in assembly che accetti due date e calcoli la differenza di giorni tra le due date.Volevo chiedervi come fare,una volta che l'utente introduce una data (es: 31/05/1986),a copiare il giorno(es.31) in una variabile o in un elemento di un array...ho provato con 'mov' ma mi dà problemi di dimensioni diverse...rispondetemi,grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Indica la CPU (x86 ?) e gli strumenti con cui operi (MASM, TASM ...).

    Mostra il codice e descrivi la riga con l'errore ...

  3. #3

    PROBLEMA SPOSTAMENTO DATI

    si è un x86 e uso il tasm...ma non c'è un errore nel codice,il problema è che non so come memorizzare il giorno,il mese o l'anno introdotto dall'utente in una memoria che non sia un registro,tipo variabile o array...se io introduco una data,esempio 31/06/1986,nell'array non riesco a mettere il giorno per intero perchè non mi permette di inserire più di una cifra in ogni suo elemento,posso solo fare cosi:giorno DB '3,1' e non giorno DB '31'..ciò è dovuto a un problema di dimensione ma se dovessi cambiarla in DW,non riesco a copiarlo all'interno di tale array poichè il registro ke memorizza i caratteri introdotti dall'utente è sempre AL (usando l'istruzione read char 01h int 21h)il quale mi permette di fare solo copie su memorie DB.Se avete un'idea su come copiare un dato(giorno,mese,anno) in una memoria fatemi sapere...aiutatemi!!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se lo devi conservare in un byte puoi scrivere

    DB 31

  5. #5

    voglio sapere come copiarlo...

    31 era un esempio...io non so cosa digita l'utente,puoi digitare 29/03/2000 oppure 18/12/2001 non lo so,qualsiasi data...il problema è ke non so come memorizzare il giorno (il mese o l'anno)che l'utente digita in una memoria qualsiasi(variabile o elementi di array)che non sia un registro

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Senti ... per evitare confusione ... fai vedere il codice che hai scritto ...

  7. #7

    ma non è completo....

    ma non è completo....mi sono fermato perchè se il giorno introdotto dall'utente è di due cifre negli elementi dell' array GIORNO non me riesce a mettermele in quanto sono elementi DB...se li cambio in DW non mi copia da AL a giorno in quanto AL è DB...se uso AX al posto di AL,non mi và in quanto sorgente è di DB...se continuo e cambio in DB anche sorgente non mi và in quanto i caratteri introdotti dall'utente vanno memorizzati solo in AL (usando l'istruzione 01h con int 21h)...è una catena insomma,non riesco a copiare il giorno in una memoria...lo stesso dicasi per mese e anno


    ;************************************************* *******************************************
    pila SEGMENT STACK ;viene allocata una zona di
    DB 400H DUP(?) ;memoria di 1024 bytes per
    pila ENDS ;lo stack
    ;************************************************* *******************************************




    ;************************************************* *******************************************
    DSEG SEGMENT ;Definizione delle costanti
    ;e delle variabili
    LF EQU 0AH
    CR EQU 0DH
    TAB EQU 09H
    DOS EQU 21H
    BIOS_VIDEO EQU 10H
    RTN_DOS EQU 4CH
    PRINT_STRING EQU 09H
    READ_CHAR EQU 01H
    SET_MODE EQu 00H
    max_len EQU 10D


    ANNO DW ''
    MESE DB ''
    MES30 DB 4,6,9,11
    TITOLO DB CR,LF,CR,LF,TAB,TAB,TAB,'-CORSO DI CALCOLATORI ELETTRONICI-$'
    TITOLO1 DB CR,LF,TAB,TAB,'Compito n. 45 - diff tra due date - versione A$'
    TITOLO2 DB CR,LF,TAB,TAB,TAB,'Autore: Serracca Enrico, mat. 164708 $'
    TITOLO6 DB CR,LF,CR,LF,'Inserire la prima data nel formato(giorno/mese/anno): $'
    TITOLO7 DB CR,LF,CR,LF,'Messaggio cifrato: $'
    TITOLO8 DB CR,LF,CR,LF,'Giorno corretto $'
    TITOLO9 DB CR,LF,CR,LF,'Data errata $'
    TITOLOE DB CR,LF,'Riavviare il programma? (S/N): $'
    SPAZI DB CR,LF,CR,LF,'$'


    GIORNO DB max_len DUP(?)
    sorgente DB max_len DUP(?)
    destinazione DB max_len+1 DUP(?)


    DSEG ENDS
    ;************************************************* ********************************************




    ASSUME CS:SEG CSEG, DS:SEG DSEG, SS:SEG pila
    CSEG SEGMENT 'CODE'


    ;-------------------------------------------------------------------------------------------;
    ; Corpo principale del programma ;
    ;-------------------------------------------------------------------------------------------;

    main:
    PUSH DS ; Istruzioni da lasciare SEMPRE
    MOV AX,00H ; al principio dei programmi
    CALL INIZIALIZZAZIONE
    CALL CONTROLLO

    EXIT:
    MOV DX, OFFSET TITOLOE ; chiedo all'utente se vuole riavviare il programma
    CALL STAMPA_STRINGA
    MOV AH, READ_cHAR
    INT DOS
    CMP AL, 'S'
    JE main
    CMP AL, 's'
    JE main



    MOV AH, RTN_DOS ; Ritorno al Sistema Operativo
    INT DOS


    ;------------------------------------------------------------------------------------------;
    ; Procedura di inizializzazione ;
    ; ;
    ; REGISTRI UTILIZZATI: AH, AL, DX, DS ;
    ;------------------------------------------------------------------------------------------;

    INIZIALIZZAZIONE PROC NEAR

    MOV AH, SET_MODE ;pulisce lo schermo e
    MOV AL, 03H ;cambia modo video tipo 80x25 16+8 colori
    INT BIOS_VIDEO
    MOV DX, OFFSET TITOLO
    CALL STAMPA_STRINGA
    MOV DX, OFFSET TITOLO1
    CALL STAMPA_STRINGA
    MOV DX, OFFSET TITOLO2
    CALL STAMPA_STRINGA
    RET

    INIZIALIZZAZIONE ENDP


    ;-----------------------------------------------------------------------------------------;
    ; Procedura di controllo formato ;
    ; ;
    ; REGISTRI UTILIZZATI: AX, CX, DX, SI, DI ;
    ;-----------------------------------------------------------------------------------------;

    CONTROLLO PROC NEAR


    MOV DX, OFFSET TITOLO6
    CALL STAMPA_STRINGA
    MOV SI, 0
    prossimo_car:
    CMP SI, max_len
    JG intermediate
    MOV AH, READ_CHAR ;leggo un carattere dalla tastiera
    INT DOS
    CMP AL, CR ;è = a return ?
    JE fine_lettura ;se si smetto di leggere
    MOV sorgente[SI], AL;sposto il carattere in sorgente
    INC SI ;incremento si
    JMP prossimo_car ;leggo il prossimo car
    fine_lettura:
    MOV sorgente[SI], '$'
    MOV DX, OFFSET SPAZI
    CALL STAMPA_STRINGA
    MOV DX, OFFSET sorgente
    CALL STAMPA_STRINGA
    MOV DX, OFFSET SPAZI
    CALL STAMPA_STRINGA
    MOV CX, SI ;sposto in CX la lunghezza del messaggio sorgente


    controllo_giorni:
    MOV SI,0
    MOV DI,0
    MOV BH,sorgente[SI]
    MOV AL,sorgente[SI+1]
    CMP BH,'3'
    JG intermediate
    CMP BH,'0'
    JL intermediate
    CMP AL,'9'
    JG intermediate
    CMP AL,'0'
    JL intermediate
    CMP BH,'0'
    JE giorno0
    CMP BH,'1'
    JE giorno1
    CMP BH,'2'
    JE giorno2
    CMP BH,'3'
    JE giorno3


    intermediate:
    jmp errore

    giorno0:
    CMP AL,'0'
    JE intermediate
    MOV AL,GIORNO[0]
    JMP controllo_Barra
    giorno1:
    ADD AL, 10
    MOV AL,GIORNO[0]
    JMP controllo_Barra
    giorno2:
    ADD AL,20
    MOV AL,GIORNO[0]
    JMP controllo_Barra
    giorno3: CMP AL,'1'
    JG intermediate
    ADD AL,30
    MOV AL,GIORNO[0]
    JMP controllo_Barra



    controllo_Barra:
    MOV AH,sorgente[SI+2]
    MOV BH,sorgente[SI+5]
    CMP AH,'/'
    JNE intermediate
    CMP BH,'/'
    JNE intermediate
    JMP controllo_mese

    controllo_mese:
    MOV AH,sorgente[SI+3]
    MOV BH,sorgente[SI+4]
    CMP AH,'1'
    JG intermediate
    CMP AH,'0'
    JL errore
    CMP BH,'9'
    JG errore
    CMP BH,'0'
    JL errore
    CMP AH,'0'
    JE mese0
    CMP AH,'1'
    JE mese1
    mese0:
    CMP BH,'0'
    JE errore
    MOV MESE,BH
    RET
    mese1:
    CMP BH,'2'
    JG errore
    ADD BH,10
    MOV MESE,BH
    RET




    errore: MOV DX, OFFSET TITOLO9
    CALL STAMPA_STRINGA
    MOV DX, OFFSET SPAZI
    CALL STAMPA_STRINGA

    RET

    CONTROLLO ENDP
    ;-----------------------------------------------------------------------------------------;
    ; Procedura per stampare una stringa ;
    ; ;
    ;PARAMETRI: l'indirizzo della stringa e' memorizzato in DSX ;
    ;REGISTRI UTILIZZATI: AX, DX, DS ;
    ;-----------------------------------------------------------------------------------------;

    STAMPA_STRINGA PROC NEAR

    MOV AX,SEG DSEG ;Inizializzazione segmento dati
    MOV DS,AX ;tramite il registro AX.
    MOV AH,PRINT_STRING ;Servizio DOS 'Print String'; la
    INT DOS ;stringa e' puntata da DSX.
    RET ;Ritorno alla procedura chiamante

    STAMPA_STRINGA ENDP







    CSEG ENDS
    ;************************************************* ******************************************
    END main
    ;************************************************* ******************************************

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: ma non è completo....

    Originariamente inviato da paolomail3
    ma non è completo.... ...è una catena insomma,non riesco a copiare il giorno in una memoria...lo stesso dicasi per mese e anno
    Calma ...

    Qual e' il punto del codice in cui accetti la data ...?

  9. #9

    :(

    ma te ne intendi?...facciamo così ti dò la traccia:
    Scrivere un programma in Assembly che:

    Accetti in ingresso due date (giorno/mese/anno) nel formato: gg/mm/aa, dove:

    gg varia da 01 a 30

    mm varia da 01 a 12

    aa varia da 1950 a 2050

    Calcoli e stampi il numero di giorni intercorsi tra le due date.
    Esempio:
    Prima data: 01 /12/1994
    Seconda data: 13 /10 /1995
    Giorni trascorsi: ????

    Per calcolarmi la differenza tra i giorni occorre memorizzare il giorno,il mese e l'anno di entrambe le date introdotte dall'utente in delle memorie(variabili,arraty ecc,l'importante ke non sia un registro) ma non so come fare...se hai qualche idea fammi sapere...

  10. #10
    ma te ne intendi?...facciamo così ti dò la traccia:
    Certo che se ne intende, ma (come tutti gli altri utenti del forum) non credo che abbia né il tempo né la voglia di spulciare il tuo codice dal principio alla fine... Ecco perché ti ha chiesto di indicare il punto preciso nel quale avviene il malfunzionamento.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.