Assembly 比较两个字符时出现问题,其中一个字符来自具有间接寻址的字符串
所以我是汇编的新手,我需要一些内存地址方面的帮助。(我认为它们是内存地址,但我不确定)因此,我有一个字符串,我想找到字符%出现的位置 因此,我做了一个循环,将值37移动到一个寄存器中(37是ascii值%),首先我尝试将该寄存器与mystring(%counter)进行比较,其中counter是我用作索引的寄存器,在循环结束时每次递增1。然后,我运行了调试工具,发现比较总是错误的。因此,我将值mystring(%counter)移动到另一个寄存器中,当我再次运行gdb时,我看到那里有一个非常大的数字。所以,我认为这是一个内存地址或什么的,并试图加载mystring(%counter)到一个寄存器。这也不管用Assembly 比较两个字符时出现问题,其中一个字符来自具有间接寻址的字符串,assembly,x86-64,att,Assembly,X86 64,Att,所以我是汇编的新手,我需要一些内存地址方面的帮助。(我认为它们是内存地址,但我不确定)因此,我有一个字符串,我想找到字符%出现的位置 因此,我做了一个循环,将值37移动到一个寄存器中(37是ascii值%),首先我尝试将该寄存器与mystring(%counter)进行比较,其中counter是我用作索引的寄存器,在循环结束时每次递增1。然后,我运行了调试工具,发现比较总是错误的。因此,我将值mystring(%counter)移动到另一个寄存器中,当我再次运行gdb时,我看到那里有一个非常大的
.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后缀的原因。)
这是我在这里的第一篇帖子,所以如果我不遵守一些规则或其他东西,请不要太苛刻 此代码有几个问题
.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: