Trovare lunghezza di una stringa

di il
12 risposte

Trovare lunghezza di una stringa

Salve a tutti! Come molti di voi sanno per la gestione delle stringhe in c si usano vari comandi particolari con il prefisso STR e io sarei interesso a sapere quale è la traduzione della STRLEN in assembly che serve a trovare una lunghezza della stringa. Mi spiego meglio. Vorrei scrivere un programma che immessa una stringa mi dice quanti caratteri contiene. Purtroppo non so come implementare il tutto,avete consigli da dare? Aspetto vostre news!

12 Risposte

  • Re: Trovare lunghezza di una stringa

    Consideralo come un vettore di char (di byte). Scorri tutto il vettore, carattere per carattere, cercando il NULL (0 binario); ad ogni carattere diverso da NULL aumenti un contatore, al NULL termini il ciclo. Nel contatore ci sarà la lunghezza.
  • Re: Trovare lunghezza di una stringa

    Grazie oregon della risposta,però non dovrei cercare il carattere dollaro,che è il terminatore di una stringa? Scusa l'ignoranza ^^
  • Re: Trovare lunghezza di una stringa

    Se parliamo di strlen del C allora parliamo di stringhe terminate da NULL.

    Il terminatore $ è usato dalle funzioni del BIOS, anzi, solo dalla

    AH = 09h - WRITE STRING TO STANDARD OUTPUT

    dell'INT 21h

    ma è un'altra storia.
  • Re: Trovare lunghezza di una stringa

    Giustissimo,quindi in linea di massima se mi viene chiesto di calcolare la lunghezza di una stringa cerco il carattere null Ho svolto l'esercizio come da te suggerito e per una verifica ho preferito stampare a video il risultato,solo che non stampo a video solo la lunghezza (che è giusta) ma anche la I ? xD Ti posto il codice così gli dai un occhiata,scusa ancora il disturbo
    
    .MODEL SMALL
    .STACK 100H
    .DATA
         FRASE DB 8 DUP (?)
         CONT DB ?
         DOM1 DB 'INSERISCI LA FRASE','$'
         RIS1 DB 'LA FRASE CHE HAI INSERITO E ','$'
         ACAPO DB 13,10,'$'
    .CODE
    .STARTUP
            MOV AX,@DATA
            MOV DS,AX
            
            MOV SI,0                      ;XOR SI,SI
            
            MOV AH,09H
            LEA DX,DOM1                   ;LEA=LOAD EFFECTIVE ADDRESS
            INT 21H  
      
      CICLO:CMP SI,7
            JG FINCICLO
            MOV AH,01H
            INT 21H
            CMP AL,0DH                    ;0DH = INVIO DELLA TASTIERA,VUOL DIRE CHE HO TERMINATO
            JE FINCICLO
            MOV FRASE[SI],AL 
            INC SI
            JMP CICLO
            
    FINCICLO:MOV AH,09H
             LEA DX,RIS1
             INT 21H
             
             MOV SI,0
             
     CICLO2: MOV AH,02H
             MOV DL,FRASE[SI]
             INT 21H
             INC SI
             CMP SI,7
             JLE CICLO2
             
             XOR DI,DI
             
     CICLO3: CMP FRASE[DI],000
             JE FINESE
             INC DI
             INC CONT
             JMP CICLO3
             
     FINESE: ADD CONT,30H
             MOV AH,02H
             MOV DL,CONT
             INT 21H
             JMP FINE
             
             
      FINE:  NOP
             MOV AH,4CH
             INT 21H
             
      END
    
  • Re: Trovare lunghezza di una stringa

    Posso cancellare il messaggio sopra? tutto risolto,un errore di compare
  • Re: Trovare lunghezza di una stringa

    Nel ciclo in cui visualizzi la frase fai il confronto

    CMP SI,9

    come se la lunghezza della frase da visualizzare fosse sempre al massimo.

    Ovviamente non è così, se inserisci solamente CIAO (e quindi 4 caratteri) perché visualizzi tutti quelli contenuti nel buffer (che ovviamente può essere sporco?)
  • Re: Trovare lunghezza di una stringa

    Hai individuato al volo l'errore ahahahah Corretto quel punto tutto gira a dovere!
  • Re: Trovare lunghezza di una stringa

    Non è che ci voleva molto ... comunque io modificherei il codice a partire da FINCICLO in questo modo
    
    FINCICLO:MOV AH,09H
             LEA DX,RIS1
             INT 21H
             
             MOV CX,SI
             MOV CONT,CL
             
             MOV SI,0
    CICLO2:  MOV AH,02H
             MOV DL,FRASE[SI]
             INT 21H
             INC SI
             LOOP CICLO2
             
             MOV AH,02H
             MOV DL,CONT
             ADD DL,30H
             INT 21H
             
             MOV AH,4CH
             INT 21H
    
  • Re: Trovare lunghezza di una stringa

    Non cambia praticamente niente,solo che uso l'istruzione loop? è più veloce?
  • Re: Trovare lunghezza di una stringa

    Ti sei accorto che non c'è tutto il blocco CICLO3 ?
  • Re: Trovare lunghezza di una stringa

    Errore nel copia incolla ,tutto corretto! Grazie ancora
  • Re: Trovare lunghezza di una stringa

    Non mi hai capito ... che errore ... Sono io che non ho usato il CICLO3 del tuo codice perché l'ho semplificato!
Devi accedere o registrarti per scrivere nel forum
12 risposte