Problema com a comparação de dois caracteres, um dos quais eu começar a partir de uma string com o endereçamento de uma indireta

votos
0

Então, eu sou um novato na montagem e eu preciso de alguma ajuda com alguns endereços de memória. (Eu acho que eles são endereços de memória, mas não tenho certeza) Então, eu tenho uma corda e eu quero encontrar onde é que o caractere% ocorre.

Então, I feito um laço, e mudou-se o valor de 37 para um registo (37 é o valor ASCII%) e primeiro eu tentou comparar que registar-se com mystring (% contador), onde contador é o registo que I utilizada como um índice , aumentando-o de um de cada vez no fim do ciclo. Então, eu corri a ferramenta de depuração e viu que a comparação é sempre falsa. Então, mudei o mystring valor (contador%) em outro registo, e quando eu corria o gdb novamente, vi que havia um número muito grande lá. Então, eu pensei que era um endereço de memória ou algo assim e tentou carregar mystring (contador%) em um registrador. Nem este trabalho.

.texto

mystring: .asciz asdb% asd% af // isso é como eu declarei minha corda

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

Então esse salto se igual nunca acontece mesmo se mystring (% r14) aponta para um%, e quando eu corri o depurador, ele mostrou um grande número de machado. (I também tentou redimensionar os registros, como eu esperava que iria mudar os valores de alguma forma, é por isso que eu usei o sufixo w.) PS Este é o meu primeiro post aqui por isso não ser muito dura se eu não respeitar algumas regras ou alguma coisa. :)

Publicado 10/10/2019 em 00:44
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Há vários problemas com este código.

  1. A cadeia de caracteres consiste em caracteres ASCII de 8 bits, então o código deve usar uma comparação de 8 bits.
  2. Não já leu o valor do caractere do string.
  3. Ela nunca sai do loop se o caractere '%' não foi encontrado.

Aqui está seu código com esses problemas corrigidos.

.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:

Eu tenho algumas sugestões adicionais para melhorar este código:

  1. Coloque a verificação de loop no final do loop.
  2. Substitua o movbe cmpbinstruções com uma única instrução.

         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:
    
Respondeu 10/10/2019 em 02:49
fonte usuário

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