Проблема выяснения монтажной петли - PullRequest
0 голосов
/ 19 октября 2018

Может ли кто-нибудь помочь мне расшифровать строки 49 - 72?Я знаю, что это цикл от 1 до 6, но мои ответы, кажется, отличаются с различными результатами.Например, если я введу 0 1 2 3 4 5, я не взорву бомбу в 0. Однако, если я введу 0 2 4 6 8 10, бомба взорвется в 0?Я запутался в том, почему.

   0x0000000000400f49 <+0>:     push   %rbp
   0x0000000000400f4a <+1>:     push   %rbx
   0x0000000000400f4b <+2>:     sub    $0x28,%rsp
   0x0000000000400f4f <+6>:     mov    %fs:0x28,%rax
   0x0000000000400f58 <+15>:    mov    %rax,0x18(%rsp)
   0x0000000000400f5d <+20>:    xor    %eax,%eax
   0x0000000000400f5f <+22>:    mov    %rsp,%rsi
   0x0000000000400f62 <+25>:    callq  0x4016c6 <read_six_numbers>
   0x0000000000400f67 <+30>:    cmpl   $0x0,(%rsp)
   0x0000000000400f6b <+34>:    jns    0x400f72 <phase_2+41>
   0x0000000000400f6d <+36>:    callq  0x401690 <explode_bomb>
   0x0000000000400f72 <+41>:    mov    %rsp,%rbp
   0x0000000000400f75 <+44>:    mov    $0x1,%ebx
   0x0000000000400f7a <+49>:    mov    %ebx,%eax
   0x0000000000400f7c <+51>:    add    0x0(%rbp),%eax
   0x0000000000400f7f <+54>:    cmp    %eax,0x4(%rbp)
   0x0000000000400f82 <+57>:    je     0x400f89 <phase_2+64>
   0x0000000000400f84 <+59>:    callq  0x401690 <explode_bomb>
   0x0000000000400f89 <+64>:    add    $0x1,%ebx
   0x0000000000400f8c <+67>:    add    $0x4,%rbp
   0x0000000000400f90 <+71>:    cmp    $0x6,%ebx
   0x0000000000400f93 <+74>:    jne    0x400f7a <phase_2+49>
   0x0000000000400f95 <+76>:    mov    0x18(%rsp),%rax
   0x0000000000400f9a <+81>:    xor    %fs:0x28,%rax
   0x0000000000400fa3 <+90>:    je     0x400faa <phase_2+97>
   0x0000000000400fa5 <+92>:    callq  0x400b90 <__stack_chk_fail@plt>
   0x0000000000400faa <+97>:    add    $0x28,%rsp
   0x0000000000400fae <+101>:   pop    %rbx
   0x0000000000400faf <+102>:   pop    %rbp
   0x0000000000400fb0 <+103>:   retq

1 Ответ

0 голосов
/ 19 октября 2018

Однако, если я введу 0 2 4 6 8 10, бомба взорвется в 0?Я запутался, почему.

Потому что этот цикл взрывает бомбу, если input[ebx] != input[ebx-1] + ebx

Вот как это выглядит для первой итерации:

mov    %rsp,%rbp           ; rbp = &input[0]
mov    $0x1,%ebx           ; ebx = 1
repeat:
    mov    %ebx,%eax       ; eax = 1
    add    0x0(%rbp),%eax  ; eax = input[0] + 1
    cmp    %eax,0x4(%rbp)  ; flags = input[1] - (input[0] + 1)
    je     no_explode      ; if (flags.z) goto no_explode
    callq  explode_bomb
    no_explode:
    add    $0x1,%ebx       ; ebx++
    ...

Таким образом, если входное значение равно 0 1 2 3 4 5, то на первой итерации у вас будет 1 с левой стороны этого сравнения и 1 (0 + 1) с правой стороны.Следовательно, никакого взрыва.

Если вместо этого вводится 0 2 4 6 8 10, то вы получаете 2 с левой стороны и 1 с правой стороны => бомба гаснет.

...