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

    [ASSEMBLY] Trovare la stringa più lunga

    Ciao a tutti sto cercando di risolvere un problema; devo trovare la parola più lunga in una frase e stamparla, ma nel codice che ho fatto mi stampa solo la prima parola. Il codice ha una parte in C e il blocco __asm. Immagino di dover controllare ogni carattere e aumentare ecx ad ogni lettera e bloccarlo nel momento in cui trovo un segno di punteggiatura o uno spazio.
    Solo non riesco a capire come confrontare le varie lunghezze e memorizzare la parola in ‘parolaMax’.
    codice HTML:
    
    
    codice HTML:
    #include <stdio.h>
    #include <string.h>
    
    void main()
    {
    #define MAX_LEN 100
        char frase[MAX_LEN] = "Cantami o diva del pelide Achille";
        char parolaMax[MAX_LEN + 1];
        __asm
        {
            xor esi, esi; ESI conterrà l'indirizzo della stringa
            xor ecx, ecx; ECX conterrà la lunghezza della parola
            xor edx, edx; EDX conterrà la lunghezza massima trovata
            lea esi, frase
            // Ciclo per trovare la parola più lunga
            ciclo :
            mov al, [esi]; Carica il carattere corrente nella parola
                cmp al, 0; Controlla se siamo arrivati alla fine della stringa
                je fine; Se si, salta alla fine
    
                cmp al, ' '; Controlla se il carattere è uno spazio
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, '.'; Controlla se il carattere è un punto
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, ','; Controlla se il carattere è una virgola
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, ';'; Controlla se il carattere è un punto e virgola
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, ':'; Controlla se il carattere è due punti
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, '\''; Controlla se il carattere è un apostrofo
                je spazio; Se si, salta alla gestione dello spazio
    
                cmp al, '?'; Controlla se il carattere è un punto interrogativo
                je spazio; Se si, salta alla gestione dello spazio
    
                jmp carattere; Se non è uno spazio o un segno di punteggiatura, salta al controllo del carattere
    
                spazio :
            mov byte ptr[parolaMax + ecx], 0; Termina la parola corrente
                cmp edx, ecx; Confronta la lunghezza attuale con la lunghezza massima trovata
                jge no_aggiornamento; Se la lunghezza attuale è minore o uguale alla lunghezza massima, salta all'aggiornamento della parola più lunga
    
                mov edx, ecx; Aggiorna la lunghezza massima trovata
                lea esi, parolaMax; Aggiorna l'indirizzo della parola più lunga
                jmp aggiorna_parola; Salta all'aggiornamento della parola più lunga
    
                carattere:
            mov byte ptr[parolaMax + ecx], al; Salva il carattere nella parola corrente
                inc ecx; Incrementa la lunghezza della parola
                jmp prossimo_carattere; Salta al prossimo carattere
    
                prossimo_carattere :
            inc esi; Passa al prossimo carattere nella frase
                jmp ciclo
    
                no_aggiornamento :
            cmp ecx, edx; Confronta la lunghezza attuale con la lunghezza massima trovata
                jge ciclo; Se la lunghezza attuale è maggiore o uguale alla lunghezza massima, ritorna al ciclo principale
                jmp aggiorna_parola; Salta all'aggiornamento della parola più corta
    
                aggiorna_parola:
            mov[parolaMax + edx], 0; Termina la parola più lunga
    
                fine :
        }
    
    
        // Stampa su video
        printf("%s\n%s\n", frase, parolaMax);
    } [COLOR=#141414][FONT=&quot][/FONT][/COLOR]


  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    x86 ha propri opcodes x la manipolazione di stringe MOVS,LODS,SCAS etc etc e qulacos'altro
    Per gli Spartani e Sparta usa spartan Il mio github

Tag per questa discussione

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.