Problema con il confronto di due personaggi, uno dei quali ricevo da una stringa con indirizzamento indiretto

voti
0

Così Sono un novizio al montaggio e ho bisogno di aiuto con alcuni indirizzi di memoria. (Penso che siano gli indirizzi di memoria, ma non sono sicuro) Così, ho una stringa e voglio trovare dove non si verifica il carattere%.

Così, ho fatto un ciclo, e spostato il valore 37 in un registro (37 è il valore ASCII%) e ho cercato di confrontare tale registro con mystring (contatore%), dove contatore è il registro che ho usato come indice , incrementandolo di 1 ogni volta alla fine del ciclo. Poi, ho fatto funzionare lo strumento di debug e ho visto che il confronto è sempre false. Così, ho spostato il MyString valore (% contatore) in un altro registro, e quando mi sono imbattuto di nuovo il gdb ho visto che c'era un numero molto grande lì. Così, ho pensato che era un indirizzo di memoria o qualcosa del genere e ho cercato di caricare mystring (% contatore) in un registro. Nemmeno questo lavoro.

.testo

mystring: .asciz asdb% ASD% af // è così che ho dichiarato la mia stringa

Loop1:

 cmpq %r9 , %r14  //in r9 I have the length of the string, r14 is the 
                  //index

 jl if1

IF1:

 movw $37 , %bx

 leaw mystring(%r14)  , %ax
 cmpw %ax , %bx
 je something
 incq %r14
 jmp loop1

Quindi, quel salto se uguale non accade mai, anche se mystring (% r14) punti ad un%, e quando mi sono imbattuto il debugger, ha mostrato un gran numero di ascia. (Ho anche cercato di ridimensionare i registri, come speravo che avrebbe cambiato i valori in qualche modo, è per questo che ho usato il suffisso w.) PS Questo è il mio primo post qui in modo da non essere troppo duro se non ha rispettato alcune regole o qualcosa. :)

È pubblicato 10/10/2019 alle 00:44
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Ci sono diversi problemi con questo codice.

  1. La stringa è composta da caratteri ASCII 8-bit, in modo che il codice dovrebbe utilizzare un confronto a 8 bit.
  2. Non ha mai letto il valore del carattere dalla stringa.
  3. Non è mai esce dal ciclo se il carattere '%' non è stato trovato.

Ecco il codice con i problemi risolti.

.text

mystring:  .asciz  "asdb%asd%af "  //that's how I declared my string



loop1:
     cmpq %r9, %r14   //in r9 I have the length of the string, r14 is the 
                      //index
     jge endloop1

     movb $37, %bl
     movb mystring(%r14), %al
     cmpb %bl, %al
     je something
     incq %r14
     jmp loop1

endloop1:

Ho un paio di ulteriori suggerimenti per migliorare questo codice:

  1. Mettere il controllo ciclo, alla fine del ciclo.
  2. Sostituire la movbe cmpbistruzioni con una sola istruzione.

         cmpq %r9, %r14    // This check may not be necessary if the string
         jge skiploop1     // length is known to be greater than 0.
    
     loop1:
         cmpb $37, mystring(%r14)
         je something
         incq %r14
         cmpq %r9, %r14   // r9 is the length of the string, r14 is the 
                          // index
         jl loop1
    
     skiploop1:
    
Risposto il 10/10/2019 a 02:49
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more