Rookie Assembly Bomb Defusal cmp Operator

Я новичок в сборке и действительно не знаю, что происходит.

Я пытаюсь выполнить домашнее задание, в котором мы должны обезвредить бомбу, выяснив правильный ввод для пяти этапов программы.

Я пытался найти в Интернете ответ на свой вопрос, но я действительно не представляю, что искать, чтобы найти ответ, который я ищу.

Я полагаю, что я понимаю все в коде ниже от <+0> в <+35>, В <+40> оператор cmp вызывается для сравнения $0x2и что хранится в %eax регистр. На момент сравнения я считаю %eax все еще хранит вызов функции для scanf (поправьте меня, если я ошибаюсь).

Благодаря использованию GDB я знаю, что функция scanf была вызвана следующим образом: scanf("%d %d", &x, &y);

Так что же это такое $0x2 ссылаясь в этом случае (это просто значение 2?) и что происходит при сравнении двух элементов?

Я считаю, что это синтаксис ГАЗ.

   0x0804870a <+0>:     sub    $0x2c,%esp
   0x0804870d <+3>:     lea    0x1c(%esp),%eax
   0x08048711 <+7>:     mov    %eax,0xc(%esp)
   0x08048715 <+11>:    lea    0x18(%esp),%eax
   0x08048719 <+15>:    mov    %eax,0x8(%esp)
   0x0804871d <+19>:    movl   $0x8048baa,0x4(%esp)
   0x08048725 <+27>:    mov    0x804b040,%eax
   0x0804872a <+32>:    mov    %eax,(%esp)
   0x0804872d <+35>:    call   0x8048480 <__isoc99_fscanf@plt>
   0x08048732 <+40>:    cmp    $0x2,%eax
   0x08048735 <+43>:    je     0x8048743 <phase_1_of_5+57>
   0x08048737 <+45>:    movl   $0x1,(%esp)
   0x0804873e <+52>:    call   0x80486ef <explode>
   0x08048743 <+57>:    mov    0x18(%esp),%eax
   0x08048747 <+61>:    mov    %eax,%edx
   0x08048749 <+63>:    shl    $0x5,%edx
   0x0804874c <+66>:    add    %edx,%eax
   0x0804874e <+68>:    cmp    0x1c(%esp),%eax
   0x08048752 <+72>:    je     0x8048760 <phase_1_of_5+86>
   0x08048754 <+74>:    movl   $0x1,(%esp)
   0x0804875b <+81>:    call   0x80486ef <explode>
   0x08048760 <+86>:    add    $0x2c,%esp
   0x08048763 <+89>:    ret

1 ответ

Решение

Общая путаница с JE и соответствующими инструкциями. Я бы порекомендовал получить отладчик для визуализации того, что делает код.

cmp внутренне вычитает, но на самом деле проверяет, если eax == 2. Если eax == 2 JE (JUMP IF EQUAL), он переходит так, что регистр EIP (следующая выполненная инструкция) становится 0x08048743 (адрес памяти "phase_1_of_5+57"). Если eax!= 2, JE игнорирует его.

СПОЙЛЕР НЕ ПРОЧИТАЙТЕ ЭТО, ЧТОБЫ ВЫ ПРАКТИКАЕТЕ СЕБЯ И ПОЛУЧИТЕ ВНОВЬ:

Итак, мы смотрим на http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm. Что делает fscanf Мы видим, что возвращаемое значение 2 означает, что оно ожидает 2 условия ввода. Теперь мы предполагаем, что мы вводим два условия, и теперь мы следуем за JE.

Мы видим (именно поэтому вам нужен отладчик, чтобы визуализировать это)

mov    0x18(%esp),%eax
...
cmp    0x1c(%esp),%eax

0x18 == 6th value on the stack
0x1c == 7th value on the stack
safe to assume these are the two input terms.

0x08048743 <+57>:    mov    0x18(%esp),%eax
0x08048747 <+61>:    mov    %eax,%edx
0x08048749 <+63>:    shl    $0x5,%edx
0x0804874c <+66>:    add    %edx,%eax

Здесь мы можем предположить, что способ обезвредить бомбу - это ввести сдвиг влево на 5 от первого слагаемого, добавленного к первому слагаемому. Ко второму сроку.

Так что 0 0 должно разрядить его.

Другие вопросы по тегам