在x86中使用cmpq操作数时出现分段错误



所以我试图从asmx86中的查询字符串中找到一些用户输入。2个输入是字符串"m1=9&m2=6"中的"9"one_answers"6"。

我一直在第14行遇到分段错误。我似乎不知道为什么,我甚至试过调试,但在尝试移动时似乎找不到问题。

.section .rodata
test: 
.string "m1=9&m2=6"
.text
.globl   main
.type    main, @function
main:
pushq   %rbp
movq    %rsp, %rbp
movq    $test,%rbx
movq    %rbx,%rax
while3:
cmpq     $'=',(%rax)          
incq     %rax          
jne while3   
innerwhile1:
cmpq    $'&',(%rax)
incq    %rax
jne innerwhile1
movq    %rax,%r10
while4:
cmpq     $'=',(%rbx)          
incq     %rax
jne while4
innerwhile4:
cmpq    $'n',(%rax)
incq    %rax
jne innerwhile1
movq    %rax,%r11
ret  

如果这是一个基本问题,我很抱歉,我对asm很陌生。

谢谢你抽出时间。

incq %rax设置标志,因此jne while3根据inc的结果而不是比较的结果进行循环。这也是其他循环中的一个问题。

或者更好的是,先inc,然后cmpb $imm8, -1(%rax),允许将cmp/jcc宏融合为单个比较和分支uop。

此外,如果整个QWORD具有值0x000000000000000a,则cmpq $'n'仅设置ZF。将cmpb用于操作数大小=字节。

它看起来像是标签innerwhile4之后的行检查n,但该符号不存在于值.string "m1=9&m2=6"中,因此循环枚举内存空间,并最终到达分配给进程的内存的末尾,从而导致分段故障。

相关内容

  • 没有找到相关文章

最新更新