iki karakter, birini karşılaştırarak ilgili sorun ben dolaylı adresleme ile bir dize aldığım

oy
0

Bu yüzden Mecliste Newbie ve bazı bellek adresleri ile yardıma ihtiyacım var. (Onların bellek adresleri olduğunu düşünüyorum ama emin değilim) Yani, bir dize var ve karakter% meydana gelmez nerede bulmak istiyoruz.

Yani, bir döngü yapılmış ve bir yazmaca değeri 37 hareket (% 37 ASCII değeridir) ve ilk önce, karşı bir indeksi olarak kullanılmıştır yazmacı myString (% sayacı), kayıt karşılaştırma çalıştı , döngünün sonunda 1 ile her zaman onu artan. Sonra ben hata ayıklama aracı koştu ve karşılaştırmak her zaman yanlış olduğunu gördük. Yani, başka bir kayıt içine değer myString (% sayaç) taşındı ve tekrar gdb çalıştırdığımda çok büyük sayıda olduğunu gördük. Yani, bir bellek adresi veya bir şey olduğunu düşündüm ve bir kayıt içine MyString (% sayaç) yüklemeye çalıştı. Ne bu çalışma yaptı.

.Metin

mystring: .asciz ASDB% asd% af // bu benim dize ilan nasıl

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

Böylece atlama eşit asla bile mystring (% r14) noktaları ise bir% olursa, ben hata ayıklayıcı çalıştırdığınızda, bu balta büyük bir sayı gösterdi. (Ben her nasılsa değerleri değiştirmek ümit olarak Ben de w eki kullanılır, bu yüzden, kayıtlarını yeniden boyutlandırmak için çalıştı.) PS Bu benim bazı kurallara saygı ya olmasaydı bu kadar çok sert olmayın burada benim ilk yazı şey. :)

Oluştur 10/10/2019 saat 00:44
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Bu kod ile çeşitli sorunlar vardır.

  1. Kod 8-bitlik bir karşılaştırma kullanmalısınız böylece dize, 8-bitlik ASCII karakterden oluşur.
  2. Şimdiye kadar dizesinden karakterin değerini okumaz.
  3. '%' Karakteri bulunamazsa eğer döngü çıkar olmadı.

İşte sabit bu sorunlarla senin kod.

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

Bu kodu artırmak için birkaç ek öneriler vardır:

  1. döngünün sonunda döngü onay işareti koyun.
  2. Değiştir movbve cmpbtek komutla talimatları.

         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:
    
Cevap 10/10/2019 saat 02:49
kaynak kullanıcı

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