Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Assembly 8086] Stampa stringa caratteri

    Ciao a tutti! Vorrei creare un programma che consenta all'utente di inserire una stringa di caratteri (un numero indefinito) e che successivamente mi indichi se il numero di caratteri inseriti è pari oppure dispari.
    La traccia sembra molto semplice, eppure dopo svariati tentativi non riesco a digitare la stringa (o meglio riesco a scrivere solo il primo carattere) ed il resto non fa bene il suo dovere. Chi saprebbe dirmi gentilmente dove sbaglio?? Grazie!

    Posto qui il mio codice:

    ;Scrivere un programma in linguaggio Assembly che ha in Input una stringa
    ;di caratteri o numeri e calcolare il numero DI CARATTERI inseriti, dividere
    ;questo numero per 2, e stampare a video come Output se il numero dei caratteri e' pari
    ;o dispari. Utilizzare macro per stampa a video.


    ;name "6" ;Output file name.


    include 'emu8086.inc'


    ORG 100h

    ;#MAKE_COM#


    LEA SI, msg1 ;Ask for the character string
    CALL GET_STRING
    CALL PRINT_STRING
    MOV AH, 1
    INT 21h

    MOV SI, 0
    MOV DI, 5

    vettore PROC
    CMP A[DI], 5 ;Controlla se zero (Criterio di stop)
    JE even_or_odd


    MOV DL, A[SI] ;Legge il prossimo carattere ASCII ;Voglio visualizzare il vettore
    MOV AH, 2 ;di interi(senza spazi, per ora)
    INT 21h

    INC SI ;Incrementa l'indice dell'Array
    DEC DI ;Decrementa il DI

    vettore ENDP

    even_or_odd: MOV AX, SI
    MOV BL, 2
    MOV BH, 0
    DIV BX
    CMP AH, 0 ;NON L'HO CAPITA!!!!
    PRINTN 'The number of characters is odd!'

    CMP AH, 0
    PRINTN 'The number of characters is even!'

    JMP stop

    stop: RET ;Return to Operating System.


    msg1 DB 'Enter a character string : ', 0
    A DB 5 DUP (?)

    DEFINE_PRINT_STRING
    DEFINE_GET_STRING


    END ;Directive to stop the compiler.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma la funzione GET_STRING qual è ?

    Commenta le varie parti che hai scritto (perchè in inglese ...? Ma il codice è tuo ?) e inserisci il codice tra i tag CODE, altrimenti è difficile individuare le varie parti ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ciao! La funzione GET_STRING l'ho presa dalla Library of common functions nel Tutorials, per cercare di facilitarmi un po' di più la vita, forse... Non so se sbaglio ad usarla così, ma non ho buon materiale da cui studiare, se non quel Tutorals. Purtroppo non mi basta e faccio sempre gli stessi errori banali.
    Ho preso spunto da un altro programma solo per la funzione even_or_odd, ma il resto l'ho scritto io, in inglese perchè mi piace questa lingua, ma davvero a poco conta, se il programma non fa il suo dovere!
    Riposto qui il mio codice.. Scusa, l'avevo messo come citazione!

    codice:
    ;Scrivere un programma in linguaggio Assembly che ha in Input una stringa 
    ;di caratteri o numeri e calcolare il numero DI CARATTERI inseriti, dividere 
    ;questo numero per 2, e stampare a video come Output se il numero dei caratteri e' pari 
    ;o dispari. Utilizzare macro per stampa a video.
    
    
    ;name "6"               ;Output file name.
    
    
    include 'emu8086.inc'
    
    
    ORG 100h
    
    ;#MAKE_COM# 
    
    
    LEA SI, msg1           ;Ask for the character string 
    CALL GET_STRING
    CALL PRINT_STRING
    MOV AH, 0Ah
    INT 21h  
    
    MOV SI, 0
    MOV DI, 5 
    
    vettore PROC
       CMP A[DI], 5        ;Controlla se zero (Criterio di stop)
       JE even_or_odd
          
        
       MOV DL, A[SI]      ;Legge il prossimo carattere ASCII ;Voglio visualizzare il vettore 
       MOV AH, 2           ;di interi(senza spazi, per ora)
       INT 21h
        
       INC SI                 ;Incrementa l'indice dell'Array
       DEC DI                ;Decrementa il DI
    
    vettore ENDP 
    
    even_or_odd: MOV AX, SI
        MOV BL, 2
        MOV BH, 0
        DIV BX
        CMP AH, 0         
        PRINTN 'The number of characters is odd!' 
        
        CMP AH, 0
        PRINTN 'The number of characters is even!' 
    
        JMP stop
             
    stop: RET               ;Return to Operating System.
    
    
    msg1 DB 'Enter a character string : ', 0
    A DB 5 DUP (?)               
                   
    DEFINE_PRINT_STRING
    DEFINE_GET_STRING  
    
    
    END                       ;Directive to stop the compiler.
    Purtroppo - mi vergogno un po' a dirlo, perchè per voi è una cosa scontata - ma io non so come si fa a stabilire se un numero è pari o dispari con l'Assembly.. Devo utilizzare una procedura?? E lascio perdere le funzioni comuni della libreria?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Per capire se il numero è pari o dispari devi semplicemente effettuare una

    AND

    con il valore 1 per testare il bit 0

    Se il bit vale 0, il numero è pari, altrimenti è dispari
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Grazie del suggerimento, ma non riesco ancora a capire, purtroppo.. Ho fatto di nuovo diversi tentativi.. L'ultimo dei quali è quello che posterò sotto.

    Per capire se il numero è pari o dispari devi semplicemente effettuare una

    AND

    con il valore 1 per testare il bit 0

    Se il bit vale 0, il numero è pari, altrimenti è dispari
    Non ho mai usato l'AND.. Ho sbagliato, vero? Sinceramente non ho capito proprio perchè devo utilizzare l'AND per stabilire se un numero è pari o dispari.. Attraverso i bit di flag?? Quindi devo poi usare l'istruzione di salto condizionato JZ? Ho fatto tutto ciò, ed il risultato in Output è il seguente:

    "This interrupt is not defined yet, it is available for custom functions. you can define this
    interrupt by modifying interrupt vector table refer to the list of supported interrupts and global memory table."


    codice:
    include 'emu8086.inc'
    
    
    ORG 100h
    
    ;#MAKE_COM# 
    
    
    LEA SI, msg1          ;Ask for the character string 
    CALL GET_STRING
    CALL PRINT_STRING
    MOV AH, 0Ah
    INT 21h  
    
    MOV BL, 1
    AND BL, AL            ;E'cosi' che si usa AND??
    JZ odd 
        
    odd: PRINTN 'The number of characters is odd!'
    
    JMP stop
     
    even: PRINTN 'The number of characters is even!'   
    
    JMP stop
    
    stop: RET
              
              
    msg1 DB 'Enter a character string : ', 0
    A DB 5 DUP (?)               
                   
    DEFINE_PRINT_STRING
    DEFINE_GET_STRING  
    
    
    END                   ;Directive to stop the compiler.

    .. Non mi voglio lamentare, ma con sole 4 lezioni di Assembly e con due slide del cavolo, comincio a scoraggiarmi un po', dato che non riesco a svolgere le tracce più stupide! Ma che tristezza!

  6. #6
    Nessuno mi può aiutare?? Oregon, mi fai per favore un piccolo esempio di come devo utilizzare l'AND??

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Intanto devi avere un registro in cui conti i caratteri inseriti. Supponiamo che questo registro "contatore" sia BX ... allora dovrai semplicemente scrivere

    AND BL,1
    JNZ dispari
    pari ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Ho capito bene ciò che dici, teoricamente so bene come si usano l'AND, l'OR, XOR, NOT.. Infatti sarebbe una soluzione quella dell'AND che va a testare i bit di flag. Ma tutte le volte che vado ad implementare anche un semplice programmino come questo, nulla funziona più.. Forse sbaglio in qualcos'altro, tipo dichiarazione di una stringa (che non ho ancora ben capito come si fa), registro contatore.. Eppure ero sicura di me su questo esame, invece ora sto cambiando opinione.
    Ti ringrazio, Oregon, ma purtroppo devo arrendermi. Non so che altro fare..

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 © 2026 vBulletin Solutions, Inc. All rights reserved.