Page 1 of 1

dll.Load и проверка or

Posted: Wed Mar 16, 2016 11:40 pm
by popovpa
Здравствуйте!

Помогите, не могу понять логику работы команды:

Code: Select all

mov eax,68
mov ebx,11
int 0x40

stdcall dll.Load, @IMPORT
or eax,eax
jnz exit
Выделяем кучу, затем загружаем библиотеку, затем смотрим влезает она в нашу кучу или нет? Правильно?
Если так, то не совсем понимаю логику работы связки or и jnz:

Например:
mov eax,11
mov ebx,2
or eax,ebx
jnz срабатывает

mov eax,2
mov ebx,11
or eax,ebx
jnz срабатывает

В каком случае флаг ZF при or становится 1?
Спасибо!

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 12:02 am
by Serge
popovpa
or eax, eax - проверка на 0. ZF соответственно будет 1.

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 12:09 am
by popovpa
В смысле на 0? Значение eax 0? Тогда проверку поидее надо делать после вызова 68 функции? (Просто код не мой) Раз куча не выделилась то и загружать ничего не надо? Или вообще желательно и там и там проверку делать? И тогда вопрос а почему or? test ведь быстрей и меньше? А что возвращает dll.Load?

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 3:37 am
by GerdtR
dll.Load возвращает 1(неудача) или 0(успех). Вот затем и eax на 0 проверялся.

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 8:36 am
by popovpa
Нашёл http://wiki.kolibrios.org/wiki/Libraries вопросы отпали...так положено :)

Почему вместо or нельзя использовать test она ведь быстрей?

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 10:23 am
by Pathoswithin
Можно использовать or, and, test, нет никакой разницы вообще.

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 10:46 am
by popovpa
test сравнивает и меняет только флаги, a or записывает значение в приёмник...значит test быстрее? Вот я и не могу понять почему везде or, у нас ведь система на ассемблере и мы хотим чтобы она была максимально компактной и быстрой...

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 2:48 pm
by Pathoswithin
У современных процессоров с конвейерной архитектурой эффективная скорость выполнения всех команд — 1 такт (кроме умножения и деления).

Re: dll.Load и проверка or

Posted: Thu Mar 17, 2016 3:30 pm
by Serge
popovpa
У меня подозрение, что не все знают о существовании команды test.
В любом случае test предпочтительней. Она не требует регистра для сохранения результата, а на современный процессорах пара test и coditional jump объединяются в одну микроинструкцию за счёт macro-fusion.
Use TEST when comparing a value in a register with zero. TEST essentially ANDs operands together without writing to a destination register. TEST is preferred over AND because AND produces an extra result register. TEST is better than CMP ..., 0 because the instruction size is smaller.