Problem z porównania dwóch znaków, z których jeden mam z ciągiem z adresowanie pośrednie

głosy
0

Więc jestem nowicjuszem w zespole, a ja potrzebuje pomocy z niektórych adresów pamięci. (Myślę, że są adresy pamięci, ale nie jestem pewien) Więc, mam ciąg i chcę, aby dowiedzieć się, gdzie występuje postać% nie.

Tak więc, dokonane pętlę i przeniesiono do wartości 37 do rejestru (37 wartość ASCII%), a pierwszy próbował porównać go zarejestrować mystring (% counter), w którym licznik jest rejestrem, że stosuje się jako wskaźnik , zwiększając ją przez 1 za każdym razem przy końcu pętli. Potem wpadłem narzędzia do debugowania i zobaczył, że porównanie jest zawsze fałszywe. Więc przeniosłem mystring wartość (% licznik) do innego rejestru, a kiedy wpadłem gdb znowu zobaczyłem, że nie było tam bardzo duża liczba. Tak, myślałem, że był to adres pamięci lub coś i próbował załadować mystring (%) licznika do rejestru. Ani tej pracy.

.tekst

mystring: .asciz AsDB% asd% af // to jak oświadczyłem mój ciąg

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

Tak, że jeśli skok równy nigdy nie zdarza nawet jeśli mystring (% R14) wskazuje na%, a kiedy wpadłem debuggera, pokazała dużą liczbę w siekiery. (Próbowałem również zmienić rozmiar rejestrów, jak miałem nadzieję, że zmiany wartości jakoś, dlatego użyłem wagowo przyrostek.) PS To mój pierwszy post tutaj, więc nie będzie zbyt trudne, jeśli nie respektować pewne zasady lub coś. :)

Utwórz 10/10/2019 o 00:44
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Istnieje kilka problemów z tym kodem.

  1. Łańcuch składa się z 8-bitowych znaków ASCII, więc kod powinien użyć porównania 8-bitowego.
  2. To nie zawsze odczytać wartość znaku z łańcucha.
  3. To nigdy nie wychodzi z pętli, jeśli znak „%” nie została znaleziona.

Oto kod z tymi problemami trwałych.

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

Mam kilka dodatkowych sugestii w celu poprawy ten kod:

  1. Umieścić zaznaczenie pętli na końcu pętli.
  2. Wymień movbi cmpbinstrukcje z jednej instrukcji.

         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:
    
Odpowiedział 10/10/2019 o 02:49
źródło użytkownik

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