Проблема со сравнением двух символов, один из которых я получаю из строки с косвенной адресацией - PullRequest
0 голосов
/ 10 октября 2019

Итак, я новичок в сборке, и мне нужна помощь с некоторыми адресами памяти. (Я думаю, что это адреса памяти, но я не уверен). Итак, у меня есть строка, и я хочу найти, где встречается символ%.

Итак, я сделал цикл и переместил значение 37 в регистр (37 - значение ascii%), и сначала я попытался сравнить этот регистр с mystring (% counter), где counter - регистрчто я использовал в качестве индекса, увеличивая его на 1 каждый раз в конце цикла. Затем я запустил инструмент отладки и увидел, что сравнение всегда ложно. Итак, я переместил значение mystring (% counter) в другой регистр, и когда я снова запустил GDB, я увидел, что там было очень большое число. Итак, я подумал, что это адрес памяти или что-то еще, и попытался загрузить mystring (% counter) в регистр. Ни один не сделал эту работу.

.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

     jl if1



if1: 


     movw $37 , %bx

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

Так что скачок при равенстве никогда не произойдет, даже если mystring (% r14) указывает на%, а когда я запускал отладчик, он показал большое число в топоре. (Я также пытался изменить размеры регистров, так как надеялся, что это как-то изменит значения, поэтому я использовал суффикс w.) PS Это мой первый пост здесь, так что не будьте слишком резкими, если я не соблюдаю некоторые правила иличто-то. :)

1 Ответ

1 голос
/ 10 октября 2019

Есть несколько проблем с этим кодом.

  1. Строка состоит из 8-битных символов ASCII, поэтому код должен использовать 8-битное сравнение.
  2. Это не 'никогда не читайте значение символа из строки.
  3. Он никогда не выходит из цикла, если символ '%' не найден.

Вот ваш код с исправленными проблемами.

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

У меня есть несколько дополнительных предложений по улучшению этого кода:

  1. Поставьте проверку цикла в конце цикла.
  2. Заменить инструкции movb и cmpb одной инструкцией.

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