Problém s porovnáním dvou postav, z nichž jeden se dostanu z řetězce s nepřímým adresování

hlasů
0

Takže jsem nováček v sestavě a já potřebuju pomoct s některými adresy paměti. (Myslím, že jsou adresy paměti, ale nejsem si jist) Takže mám řetězec a chci zjistit, kde se vyskytuje znak%.

Tak, jsem smyčku, a pohyboval hodnotu 37 do registru (37 ASCII hodnota%) a první jsem se snažil srovnat že zaregistrovat MyString (% čítače), kde čítač je registr, který jsem použil jako index , postupně ji o 1 pokaždé, když se na konci smyčky. Pak jsem běžel nástroj ladění a viděl, že porovnávat je vždy false. Takže jsem se přesunul hodnotu MyString (% counter) do jiné evidence, a když jsem znovu běžel gdb viděl jsem, že tam byl velmi velké číslo. Takže, myslel jsem si, že to byla adresa paměti, nebo tak něco, a snažil se nahrát MyString (% Counter) do registru. Ani tuto práci.

.text

mystring: .asciz „asdb% CZK% af“ // to je, jak jsem deklaroval svůj řetězec

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 jump-li rovna nikdy nestane, i když mystring (% R 14) ukazuje na%, a když jsem běžel ladicího programu, se ukázalo velký počet v sekery. (Také jsem se snažil změnit velikost registrů, jak jsem doufal, že by se změnit hodnoty nějakým způsobem, který je důvod, proč jsem použil w přípony.) PS To je můj první příspěvek zde takže nebuďte příliš krutý, kdybych nedodržel některá pravidla nebo něco. :)

Položena 10/10/2019 v 00:44
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Existuje několik problémů s tímto kódem.

  1. Řetězec se skládá z 8-bitových znaků ASCII, takže kód by měl používat 8bitové srovnání.
  2. To není vůbec číst hodnotu znaku z řetězce.
  3. To nikdy ukončí smyčky, pokud není nalezen znak ‚%‘.

Zde je váš kód s těmito problémy pevnými.

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

Mám několik dalších návrhů, jak zlepšit tento kód:

  1. Dal šek smyčky na konci smyčky.
  2. Vyměňte movba cmpbinstrukce s jedinou instrukci.

         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:
    
Odpovězeno 10/10/2019 v 02:49
zdroj uživatelem

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