2012-03-20 2 views
6

Я только что открыл файл в IDA Pro, и я нашел код, который выглядит совершенно бесполезным. Однако я подумал, что это может пригодиться. Разве sub eax,0 просто не вычитает 0 из eax?sub eax, 0 - он что-нибудь делает?

Код:

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

Да, он вычитает ноль от eax. Но это * делает * что-то делать, оно устанавливает флаги. Например, единственный способ, с помощью которого он приведет к нулю, - это то, что для начала eax был равен нулю. – harold

ответ

13

sub инструкция устанавливает флаги (OF, SF, ZF, AF, PF и CF, согласно documentation) - mov инструкция не делает. jz будет прыгать только в том случае, если установлен флаг нуля (ZF), поэтому, если вы хотите перейти на значение в eax, этот флаг должен быть установлен соответствующим образом.

+0

Я думал, что вам нужно использовать инструкцию TEST. Благодаря! –

+1

'test' выполняет неявное побитовое И, но не влияет на все одинаковые флаги. Из 'test' docs:« Флаги 'OF' и' CF' установлены в '0'. Флаги' SF', 'ZF' и' PF' устанавливаются в соответствии с результатом ... Состояние флаг 'AF' не определен." –

6

Инструкция sub установит флаг нуля, если его результат равен нулю. В этом случае это означает, что флаг нуля будет установлен, если eax равен нулю.

Таким образом, эти три инструкции проверяют, равен ли [esp+fdwReason], и перейти в loc_10001038.

 Смежные вопросы

  • Нет связанных вопросов^_^