Pagina 3 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 35
  1. #21
    Ciao caro oregon, scusa se sto abusando della tua pazienza, ma davvero non riesco a risolvere il problema (ho appena finito di provarci anche con un mio collega, fino a quest'ora tarda).

    Ho dato un'occhiata al tuo codice ma ci sono cose che il prof non ci ha spiegato, te l'ho detto le lezioni sono state molto banali, so che è difficile a credersi ma è così... il problema è che io vorrei riuscire a farlo come faccio tutti gli altri programmi che vanno bene al prof ed ho quindi riprovato con il seguente codice:
    codice:
    org 100h
    .model small
    .stack 100h
    .data
    var db 6
    .code
    start: mov al,1
    mov bl,1
    mov dl,al 
    or  dl, 30h
    mov ah,2h
    int 21h
    mov dl,bl
    or  dl, 30h
    mov ah,2h
    int 21h
    mov cl,2
    ciclo: add al,bl
           mov dl,al
           or  dl, 30h
           mov ah,2h
           int 21h
           add bl,al
           mov dl,bl
           or  dl, 30h
           mov ah,2h
           int 21h
           add cl,2
           cmp cl,var
           jl ciclo 
    fine: mov ax,4c00h
          int 21h
    end start
    In questo codice inizializzo una variabile a 6 (voglio il sesto numero di fibonacci), metto in al 1 ed in bl 1, stampandoli (primi due numeri). Avendo già fatto i primi due numeri, inizializzo cl a 2. A questo punto entro nel ciclo. Sommo al con bl (risultato 2) e lo stampo; sommo bl con al (risultato 3) e stampo. Sommo a cl 2, perchè ho già calcolato altri 2 numeri della serie e comparo cl con la variabile che contiene il numero di elementi che voglio. Se cl è minore ritorno al ciclo, altrimenti finisco. Logicamente, a me sembra ok, l'unico problema è che il compilatore mi da il seguente risultato:


    A tal proposito, vorrei dire due cose:
    1) Il compilatore non mi fa 0+1, ho anche provato fuori dal ciclo a rimettere in al 0, in bl 1, ed a fare una semplice addizione ed il risultato è 2, come diavolo è possibile?
    2) I primi due numeri fuori dal ciclo li stampa (1,1); stessa cosa per i primi due dentro il ciclo, il problema sorge per gli ultimi due, come mai?

    Grazie mille per l'enorme disponibilità e generosità, spero riuscirai a schiarirmi l'idea, anche perchè l'esame è lunedi e per un po' di tempo non vorrò più sentire parlare di AASM

  2. #22
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Perché non mi dici cosa non ti è chiaro del codice che ti ho proposto? Magari lo sostituiamo con codice più semplice ed equivalente. E' più semplice che correggere il vostro codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #23
    Originariamente inviato da oregon
    Perché non mi dici cosa non ti è chiaro del codice che ti ho proposto? Magari lo sostituiamo con codice più semplice ed equivalente. E' più semplice che correggere il vostro codice ...
    Posso chiederti qual è il "problema" del nostro codice?

    Sicuramente non sarà ottimizzato come il tuo, però è stato fatto con il "metodo" che ci ha spiegato il professore.... tanto per darti un'idea, non so neanche il mov ah,0h cosa fa... o l'istruzione pop e push, non ce le ha mai fatte usare nelle esercitazioni, di conseguenza se gli faccio un programma del genere, potrebbe pensare che sia stato copiato da qualche posto...
    Riguardo il mio codice, sta diventando una vera e propria questione di puntiglio il volerlo risolvere, perchè non capisco se entra dentro il ciclo, se i primi due li stampa, se la verifica della condizione è corretta visto che stampa i primi 6 numeri, perchè degli ultimi due ne stampa il codice ascii?

  4. #24
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da rizzotti91
    non so neanche il mov ah,0h cosa fa...
    La h finale indica l'esadecimale. Nel caso dello 0 non ha importanza ed è come scrivere

    mov ah,0

    Dato che tu hai usato nel tuo codice

    mov ah,2h

    presumevo che tu sapessi a cosa serve e cosa fa ...

    o l'istruzione pop e push, non ce le ha mai fatte usare nelle esercitazioni
    Sono le istruzioni che utilizzano lo stack per conservare e ritrovare il valore di un registro.
    Puoi usare una variabile temporanea al posto del push con una mov che conserva il valore del registro e una mov che legge il valore dalla variabile al posto della pop.

    Per il resto, sul fatto dell'addizione (0+1) non capisco a quale parte di codice ti riferisci. Se fai una add tra 0 e 1 il risultato è 1 ... non c'è dubbio ...

    Per gli ultimi due numeri, hai provato a scrivere su carta i valori di tutti i registri durante il ciclo? Puoi farlo e mostrarmi tali valori?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #25
    Originariamente inviato da oregon
    La h finale indica l'esadecimale. Nel caso dello 0 non ha importanza ed è come scrivere

    mov ah,0

    Dato che tu hai usato nel tuo codice

    mov ah,2h

    presumevo che tu sapessi a cosa serve e cosa fa ...



    Sono le istruzioni che utilizzano lo stack per conservare e ritrovare il valore di un registro.
    Puoi usare una variabile temporanea al posto del push con una mov che conserva il valore del registro e una mov che legge il valore dalla variabile al posto della pop.

    Per il resto, sul fatto dell'addizione (0+1) non capisco a quale parte di codice ti riferisci. Se fai una add tra 0 e 1 il risultato è 1 ... non c'è dubbio ...

    Per gli ultimi due numeri, hai provato a scrivere su carta i valori di tutti i registri durante il ciclo? Puoi farlo e mostrarmi tali valori?
    Lo 0+1 non è presente, ma ho provato a fare:
    codice:
    mov al,0
    mov bl,1
    add al,bl
    mov dl,al
    OR dl,30h
    mov ah,2h
    int21h
    Ho scritto su carta i valori dei registri e per me è giusto, ecco i risultati:
    codice:
    var=6
    al=1
    bl=1
    cl=2
    ciclo: al=al+bl=1+1=2
            bl=bl+al=1+2=3
            cl=2+2=4<6? SI---->Ciclo
    Quando viene rieseguito per la seconda volta il ciclo:
            al=al+bl=2+3=5
            bl=bl+al=3+5=8
            cl=4+2=6<6? NO--->Fine
    Non riesco a capire quale sia il problema..

    PS grazie mille per la disponibilità, gentilezza e pazienza
    e mi veniva stampato il 2..

  6. #26
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il codice che hai mostrato per lo 0+1 dà il risultato corretto ovvero 1 (non so quale sia il problema ma non è in quel codice ...)

    Per il resto, guarda che, dopo che ha visualizzato il

    3

    la prossima volta che esegue il ciclo e quindi

    ciclo: add al,bl

    avrai il valore

    33h in al e bl

    e quindi la somma sarà 66h e con la or diventerà il carattere

    v

    che vedete ... e così anche per l'altro carattere.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #27
    Quindi la prima volta che esco dal ciclo avrò al=33h e bl=33h, giusto? Se si, perchè avranno questi valori e non al=2 e bl=3?

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

    or dl, 30h

    Ecco perché ti avevo suggerito di ottenere su carta il valore dei vari registri ... ma non hai tenuto conto di tutte le istruzioni eseguite.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #29
    Originariamente inviato da oregon
    Non tieni presente le

    or dl, 30h

    Ecco perché ti avevo suggerito di ottenere su carta il valore dei vari registri ... ma non hai tenuto conto di tutte le istruzioni eseguite.
    Perché scusa, la OR sul registro dl in che modo và a modificare al? Io ho anche provato ad eliminarlo l'or ma il risultato non và bene comunque.. ed in ogni caso non capisco se la Or crea problemi, perché i primi quattro numeri sono giusti?

  10. #30
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La INT 21 AH 2 serve a visualizzare il carattere con il codice ASCII contenuto in DL e restituisce in uscita in AL il carattere appena visualizzato.

    Ovvero, quando viene eseguita la INT 21h, AL contiene la copia di DL.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.