所以我是汇编的新手,我需要一些内存地址的帮助。 (我认为它们是内存地址,但我不确定),所以,我有一个字符串,我想找到字符%出现在哪里。
所以,我做了一个循环,然后将值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)指向%,也不会发生相等的跳转,而当我运行调试器时,它在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: