Assembly NASM - Esercizio palindrome

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Assembly NASM - Esercizio palindrome

    Sinceramente non mi ero neanche accorto di quell'errore
    In ogni caso non sembra funzionare, ti mando il codice aggiornato.
    ;Verificare se una parola è palindroma o no (non ottimizzato)
    SECTION .text
    global  _start
    
    _start: ; tell linker entry point.
        mov ecx, string ;assegna il puntatore a string a exc
        add ecx, len ;somma string+len e assegnalo a ecx
        sub ecx, 3 ;dato che bisogna eliminare il ,10,13,0 (non bisogna contarli come caratteri)
        mov eax, string ;assegna il puntatore a string a eax
        mov ebx, len ;registro che terrà il conto di quante volte il ciclo è stato fatto
        _ciclo:
        mov dl, [ecx]
        cmp [eax], dl
        jnz _stampaNonPalindroma
        inc eax ;si decrementa il valore di eax (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec ecx ;si decrementa il valore di ecx (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec ebx ;si decrementa il valore di ebx in modo tale da ripetere il ciclo len volte
        cmp ebx,0h ;si verifica se il ciclo è stato ripetuto len volte
        jnz _ciclo
        jmp _stampaPalindroma ;se uscirà "indenne" dal ciclo vuol dire che la parola è palindroma
    _stampaPalindroma:
        mov ecx, string2
        mov edx, len2
        mov ebx, 1  ; file descriptor (stdout)
        mov eax, 4  ; system call number (sys_write)
        int 0x80
        jmp _esci
    
    _stampaNonPalindroma:
        mov ecx, string3
        mov edx, len3
        mov ebx, 1
        mov eax, 4
        int 0x80
        jmp _esci
    
    _esci:
        mov     eax, 1
        int     0x80
    
    section .data
    string: db "anna",10,13 ;10 line feed, 13 carriage return, 0 null.
    len:    equ $-string
    string2: db "Palindroma",10,13
    len2:   equ $-string2
    string3: db "Non Palindroma",10,13
    len3:   equ $-string3
  • Re: Assembly NASM - Esercizio palindrome

    Nel registro ebx non ci deve andare len ... pensaci ...

    E pensa anche che se la stringa è

    anna

    basta controllare solo i primi 2 caratteri (ovvero la lunghezza effettiva / 2)
  • Re: Assembly NASM - Esercizio palindrome

    Sinceramente io credo che len sia correto. Se si deve controllare se la parola è palindroma o meno il ciclo va ripetuto per ncaratteri volte, o per ncaratteri/2 volte, anche se, come ho scritto nella prima riga di codice, questa è una versione non ottimizzata del codice, proprio perché volevo vedere se utilizzando l'algoritmo Naive veniva corretto o meno.
  • Re: Assembly NASM - Esercizio palindrome

    In ogni caso ti riposto il codice che mi ero dimenticato di aggiornare una cosa, ovvero di modificare ebx con edx.
    ;Verificare se una parola è palindroma o no (non ottimizzato)
    SECTION .text
    global  _start
    
    _start: ; tell linker entry point.
        mov ecx, string ;assegna il puntatore a string a exc
        add ecx, len ;somma string+len e assegnalo a ecx
        sub ecx, 3 ;dato che bisogna eliminare il ,10,13,0 (non bisogna contarli come caratteri)
        mov eax, string ;assegna il puntatore a string a eax
        mov edx, len ;registro che terrà il conto di quante volte il ciclo è stato fatto
        _ciclo:
        mov bl, [ecx]
        cmp [eax], bl
        jnz _stampaNonPalindroma
        inc eax ;si decrementa il valore di eax (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec ecx ;si decrementa il valore di ecx (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec edx ;si decrementa il valore di ebx in modo tale da ripetere il ciclo len volte
        cmp edx,0h ;si verifica se il ciclo è stato ripetuto len volte
        jnz _ciclo
        jmp _stampaPalindroma ;se uscirà "indenne" dal ciclo vuol dire che la parola è palindroma
    _stampaPalindroma:
        mov ecx, string2
        mov edx, len2
        mov ebx, 1  ; file descriptor (stdout)
        mov eax, 4  ; system call number (sys_write)
        int 0x80
        jmp _esci
    
    _stampaNonPalindroma:
        mov ecx, string3
        mov edx, len3
        mov ebx, 1
        mov eax, 4
        int 0x80
        jmp _esci
    
    _esci:
        mov     eax, 1
        int     0x80
    
    section .data
    string: db "anna",10,13 ;10 line feed, 13 carriage return, 0 null.
    len:    equ $-string
    string2: db "Palindroma",10,13
    len2:   equ $-string2
    string3: db "Non Palindroma",10,13
    len3:   equ $-string3
  • Re: Assembly NASM - Esercizio palindrome

    Il valore di len prevede anche i due caratteri 13 10 (non il carattere 0 che non esiste). Quindi len è più grande di quel che serve per il contatore
  • Re: Assembly NASM - Esercizio palindrome

    Ahia, c'hai ragione, grazie mille per l'aiuto e per la pazienza nei confronti di un novizio, ti allego il codice funzionante (ma non ancora ottimizzato), alla prossima.
    ;Verificare se una parola è palindroma o no (non ottimizzato)
    SECTION .text
    global  _start
    
    _start: ; tell linker entry point.
        mov ecx, string ;assegna il puntatore a string a exc
        add ecx, len ;somma string+len e assegnalo a ecx
        sub ecx, 3 ;dato che bisogna eliminare il ,10,13,0 (non bisogna contarli come caratteri)
        mov eax, string ;assegna il puntatore a string a eax
        mov edx, len  ;registro che terrà il conto di quante volte il ciclo è stato fatto
        sub edx, 3
        _ciclo:
        mov bl, [ecx]
        cmp [eax], bl
        jne _stampaNonPalindroma
        inc eax ;si decrementa il valore di eax (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec ecx ;si decrementa il valore di ecx (del puntatore) per potere controllare la cella puntata da string+len-3-n (n varierà ogni volta)
        dec edx ;si decrementa il valore di ebx in modo tale da ripetere il ciclo len volte
        cmp edx,0h ;si verifica se il ciclo è stato ripetuto len volte
        jnz _ciclo
        jmp _stampaPalindroma ;se uscirà "indenne" dal ciclo vuol dire che la parola è palindroma
    _stampaPalindroma:
        mov ecx, string2
        mov edx, len2
        mov ebx, 1  ; file descriptor (stdout)
        mov eax, 4  ; system call number (sys_write)
        int 0x80
        jmp _esci
    
    _stampaNonPalindroma:
        mov ecx, string3
        mov edx, len3
        mov ebx, 1
        mov eax, 4
        int 0x80
        jmp _esci
    
    _esci:
        mov     eax, 1
        int     0x80
    
    section .data
    string: db "anna",10,13 ;10 line feed, 13 carriage return, 0 null.
    len:    equ $-string
    string2: db "Palindroma",10,13
    len2:   equ $-string2
    string3: db "Non Palindroma",10,13
    len3:   equ $-string3
Devi accedere o registrarti per scrivere nel forum
20 risposte