Pari o dispari? Assembly 8086

di il
3 risposte

Pari o dispari? Assembly 8086

Salve a tutti, da pochi giorni sto studiando(da sola) l'assembly ma non è facile, sto cercando di fare un programma che data una stringa di caratteri numerici in input mi dica se ogni carattere è pari o dispari. esempio : stringa input 2 5 7 8
stringa output P D D P

questo è il mio programma ma non funziona
org 100h
jmp start

stampa macro x
    lea dx, x
    mov ah,09h
    int 21h
endm

acquisisci macro y
    lea dx, y
    mov ah,0ah
    int 21h
endm
     

;variabili

stringa db 10, ?, 10 dup(?)
msg1 db 'Stringa input$'
p db 'P$'
d db 'D$' 


start: stampa msg1
       acquisisci stringa
        
       mov si, 0  
      
       
ciclo:  
       mov si,2 ;punto al primo carattere?
       cmp stringa[si],'$'
       je fine
       
       mov al,stringa[si+2]
       mov ah,0
       mov bl, 2
       div bl
       cmp ah,0
       jz pari
       jnz dispari
       
pari : stampa p
         jmp incrementa
        
dispari: stampa d
         jmp incrementa
       
incrementa: inc si 
            loop ciclo 
 
fine: ret

3 Risposte

  • Re: Pari o dispari? Assembly 8086

    Ciao
    in che senso non funziona ?
    1) errore di compilazione ?
    2) risultato sbagliato?
    batti la scelta ?
    se hai premuto 1 devi indicare il tipo di errore che hai.
    se hai premuto 2
    ti posso dire che ci sono alcuni errori concettuali.
    visto che le macro acquisisci la usi una sola volta non ti serve la puoi mettere comodamene nel listato.
    la variabile stringa deve essere definita :
    stringa db 10 dup(?) e non stringa db 10, ?, 10 dup(?)
    poi tutta la parte del ciclo è sbagliata perchè
    cmp stringa[si],'$'
           je fine
    1) dovresti specificare il tipo di dato che utilizzi mettendo byte ptr tra cmp e stinga.
    2) stringa[si] non potrà mai essere = "$" perchè quando inserisci la stringa la termini con invio a meno che tu non inserici il "$" di proposito cosa che non credo!
    3) la stringa punterà sempre allo stesso elemento perchè prima della cmp hai inserito
    mov si,2 ;punto al primo carattere?
    4) il registro cx non è impostato cosi il ciclo sara fatto solo una volta.
    il ciclo corretto è :
    
    start: stampa msg1
           acquisisci stringa
           mov si,2
           mov cx, 0
           mov cl,stringa[1]
    ciclo: 
           mov al,stringa[si]
           mov ah,0
           mov bl, 2
           div bl
           cmp ah,0
           jz pari
           stampa d
    fine_ciclo: 
           inc si 
           loop ciclo
           mov ax,4c00h
           int 21h
    pari : stampa p
             jmp fine_ciclo
    
    se non riesci a capire non preoccuparti sarò lieto di aiutarti.
  • Re: Pari o dispari? Assembly 8086

    Grazie per la risposta..il tuo ciclo mi dava sempre dispari, in questi giorni credo di aver risolto il problema così:
    start: stampa msg1
           acquisisci stringa
           stampa acapo
           stampa msg2
           
           	mov cx,0
            mov cl,stringa[1]
            
           
    ciclo:  
           mov al, stringa[si+2] 
           mov ah, '$'
           cmp al,ah
           je fine
           
           mov ah,0
           mov bl, 2
           div bl
           cmp ah,0 
           je pari
           jne dispari
           
    pari : stampa p
            jmp incrementa
            
    dispari: stampa d
           jmp incrementa
           
    incrementa: inc si
                loop ciclo 
            
    
    fine:ret
  • Re: Pari o dispari? Assembly 8086

    Non dimenticare di azzerare si e risparmia qualche istruzione inutile ... questo il codice
    
    start: stampa msg1
           acquisisci stringa
           stampa acapo
           stampa msg2
                 
           mov cx,0
           mov cl,stringa[1]
    
            
           mov si,0
    ciclo:  
           mov al, stringa[si+2] 
           cmp al, '$'
           jne nxtch
           ret
    
    nxtch:
           mov ah,0
           mov bl, 2
           div bl
           cmp ah,0 
           jne disp
           
           stampa p
           jmp incr
            
    disp:  stampa d
           jmp incr
           
    incr:  inc si
           loop ciclo 
    
Devi accedere o registrarti per scrivere nel forum
3 risposte