所以我试图从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"
中,因此循环枚举内存空间,并最终到达分配给进程的内存的末尾,从而导致分段故障。