Ошибка сегментации при использовании операнда cmpq в x86 - PullRequest
0 голосов
/ 30 ноября 2018

Итак, я пытаюсь найти какой-либо пользовательский ввод из строки запроса в asm x86.2 входа - «9» и «6» в строке «m1 = 9 & m2 = 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.

Спасибо, что уделили время.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

incq %rax устанавливает флаги, поэтому jne while3 зацикливается на основе результата inc вместо результата сравнения.Это проблема и в других циклах.

Или, лучше, inc сначала, а затем cmpb $imm8, -1(%rax), что позволяет макросинтегрировать cmp / jcc в один элемент сравнения и ветвления.

Кроме того, cmpq $'\n' устанавливает ZF, только если весь QWORD имеет значение 0x000000000000000a.Используйте cmpb для операнд-размер = байт.

0 голосов
/ 01 декабря 2018

Похоже, что строки после метки innerwhile4 проверяются на \n, но этот символ отсутствует в значении .string "m1=9&m2=6", поэтому цикл перечисляет пространство памяти и в конечном итоге достигает конца памяти, выделенной процессу, что приводит к сегментациинеисправность.

...