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 должно разрядить его.