Assembly 比较两个字符时出现问题,其中一个字符来自具有间接寻址的字符串

Assembly 比较两个字符时出现问题,其中一个字符来自具有间接寻址的字符串,assembly,x86-64,att,Assembly,X86 64,Att,所以我是汇编的新手,我需要一些内存地址方面的帮助。(我认为它们是内存地址,但我不确定)因此,我有一个字符串,我想找到字符%出现的位置 因此,我做了一个循环,将值37移动到一个寄存器中(37是ascii值%),首先我尝试将该寄存器与mystring(%counter)进行比较,其中counter是我用作索引的寄存器,在循环结束时每次递增1。然后,我运行了调试工具,发现比较总是错误的。因此,我将值mystring(%counter)移动到另一个寄存器中,当我再次运行gdb时,我看到那里有一个非常大的

所以我是汇编的新手,我需要一些内存地址方面的帮助。(我认为它们是内存地址,但我不确定)因此,我有一个字符串,我想找到字符%出现的位置

因此,我做了一个循环,将值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)指向a%,如果equal也不会发生跳转,当我运行调试器时,它在ax中显示了一个大数字。(我还尝试调整寄存器的大小,因为我希望它会以某种方式改变值,这就是我使用w后缀的原因。)
这是我在这里的第一篇帖子,所以如果我不遵守一些规则或其他东西,请不要太苛刻

此代码有几个问题

  • 字符串由8位ASCII字符组成,因此代码应使用8位比较
  • 它从不从字符串中读取字符的值
  • 如果找不到“%”字符,它将永远不会退出循环
  • 这是您修复了这些问题的代码

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

    我还有一些改进此代码的建议:

  • 将循环检查放在循环的末尾
  • 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: