Inserito un numero da tastiera capire se e' divisibile per 3

di il
40 risposte

Inserito un numero da tastiera capire se e' divisibile per 3

Salve di nuovo all'intera sezione e grazie per l'aiuto e per il supporto che ci fornite,ma soprattutto per la pazienza! Arrivo al dunque,ho il seguente codice e ci sono dei passaggi che non mi sono chiari quindi vi sarei grati se mi poteste dare delle delucidazioni in merito.

.MODEL SMALL
.STACK 100H
.DATA
prompt db "Inserisci un numero: $"
numero db 6,?,6 dup(0)
answer_hit db "Il numero e' divisibile per 3",13,10,"$"
answer_fail db "Il numero non e' divisibile per 3",13,10,"$" 
invio db 13,10,"$"
.CODE
.STARTUP                                                                  
        mov ax,@DATA
        mov ds, ax
      
      lea dx,prompt           ;STAMPO LA RICHIESTA DI INSERIRE UN NUMERO 
       mov ah,9
       int 21h
       lea dx,numero
       mov ah,0ah
       int 21h 
       lea dx,invio
       mov ah,9
       int 21h
       
       sub ax,ax              ;azzero AX
       mov cl,numero+1        ; Inizializzo CX con la lunghezza della stringa letta 
       sub ch,ch
       sub si,si              ;si quindi vale 0
ciclo: mov dl,numero[si+2]    ; Converto il carattere numerico in cifra numerico
       sub dl,48              ;30h=48 decimale
       add al,dl
       adc ah,0
       inc si
       loop ciclo 
       mov bl,3
       div bl               ; Verifico AH che contiene dopo la divisione il resto se ; vale 0
       or ah,ah             ;se il risultato dell'or e' 1 il resto non e' 0
       jz successo
       lea dx, answer_fail
       jmp visualizza
successo: lea dx,answer_hit
visualizza:mov ah,9
           int 21h
           mov ah, 4ch ; Passa il controllo al sistema operativo
           int 21h 
 end ; 
Ora i miei dubbi sono i seguenti:
Perchè inizializzo numero proprio in quel modo? E' un vettore? Perchè se cambio la prima casella quella con il 6 con un altra cifra (per esempio non funziona più?
perchè faccio l'addizione usando ADC ossia considerando anche il carry?

Grazie della disponibilità!

40 Risposte

  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Il mio dubbio invece è ... ma l'hai scritto tu il codice?

    Se è così, questa parte

    lea dx,numero
    mov ah,0ah
    int 21h

    a cosa serve?
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Il codice non l'ho scritto io perciò chiedevo dei chiarimenti..Non capisco neanche io quel passaggio
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    X Cesc__
    quella sequenza serve per accettare una stringa nell'intenzione dell'autore il numero.
    ma questo metodo a la pecca di non verificare l'input.
    poi la sequenza con ADC serve per poter addizionare anche il riporto.
    esempio:
    e un pò come se facesse x = x + numero
    adesso se x + numero <= 9 allora il riporto e 0 altrimenti riporto = 1
    spero che gli argomenti su elencati adesso ti siano chiari.
    che altra sequenza non riesci a capire?
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Cesc__ ha scritto:


    Il codice non l'ho scritto io perciò chiedevo dei chiarimenti..
    Ah ecco ... questo non era chiaro ...
    neanche io
    Veramente io lo capisco ma ti chiedevo dato che non era chiaro se l'avessi scritto tu ...

    Quelle linee servono ad eseguire la funzione 0Ah della chiamata di sistema INT 21h come indicato in questo link che ti spiega il funzionamento



    Quando la chiami, DS:DX punta ad un buffer (quello che chiami numero) che come vedi deve essere fatto in un determinato modo perché la funzione possa operare correttamente ovvero così

    max ¦ count ¦ BUFFER (N bytes)

    in cui il primo numero (max) è il massimo numero di caratteri da leggere dalla tastiera (e lo fornisci tu ...), il secondo numero (count) è il numero di caratteri letti (e lo trovi dopo la chiamata alla INT 21h) e dal carattere seguente comincia il buffer (lungo almeno il numero di caratteri indicati come massimo) in cui troverai i caratteri digitati.
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    E' possibile farti una statua d'oro? Per quanto riguarda l'addizione con carry? che utilità ha in questo caso? Mentre l'or (come ho commentato lungo il codice) mi restituisce 1 se il resto è diverso da 0,right? ^^ Grazie ancora
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Prima di parlare dell' ADC, questo pezzo di codice
    
           sub ax,ax              ;azzero AX
           mov cl,numero+1        ; Inizializzo CX con la lunghezza della stringa letta 
           sub ch,ch
           sub si,si              ;si quindi vale 0
    ciclo: mov dl,numero[si+2]    ; Converto il carattere numerico in cifra numerico
           sub dl,48              ;30h=48 decimale
           add al,dl
           adc ah,0
           inc si
           loop ciclo 
    
    a cosa dovrebbe servire secondo te?
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Non capisco l'utilità di dover considerare anche il carry se poi sommo la parte alta di AX con 0..
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    La mia domanda era un'altra ...

    A cosa serve TUTTO quel codice?
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Serve ad azzerare i registri che userò in seguito,convertire i valori immessi dall'utente in un numero"puro"per poi svolgere le operazione aritmetiche .
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Ecco ... la conversione non mi pare che sia corretta ...

    Chiunque ti abbia scritto quel codice, dovrebbe spiegarti anche il suo funzionamento perché non mi pare che faccia quello per cui è pensato.
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Perchè è errata?
    Purtroppo l'ho trovato in un pdf,il problema è che funziona!
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Come fai a dire che funziona?

    Se tu scrivi il numero

    1 8 2

    cosa fa quel codice?
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Mi riferivo al funzionamento generale del programma non solo a quel frammento di codice. Ovviamente potrei implementare meglio il tutto facendo dei cmp per evitare vengano immessi dati scorretti..
  • Re: Inserito un numero da tastiera capire se e' divisibile per 3

    Ma io mi riferisco a quel pezzo di codice in particolare !

    Se mi vuoi/puoi rispondere bene, altrimenti non so più cosa dirti ...
Devi accedere o registrarti per scrivere nel forum
40 risposte