Board.KolibriOS.org
https://board.kolibrios.org/

dll.Load и проверка or
https://board.kolibrios.org/viewtopic.php?f=32&t=3246
Page 1 of 1

Author:  popovpa [ Wed Mar 16, 2016 11:40 pm ]
Post subject:  dll.Load и проверка or

Здравствуйте!

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

Code:
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?
Спасибо!

Author:  Serge [ Thu Mar 17, 2016 12:02 am ]
Post subject:  Re: dll.Load и проверка or

popovpa
or eax, eax - проверка на 0. ZF соответственно будет 1.

Author:  popovpa [ Thu Mar 17, 2016 12:09 am ]
Post subject:  Re: dll.Load и проверка or

В смысле на 0? Значение eax 0? Тогда проверку поидее надо делать после вызова 68 функции? (Просто код не мой) Раз куча не выделилась то и загружать ничего не надо? Или вообще желательно и там и там проверку делать? И тогда вопрос а почему or? test ведь быстрей и меньше? А что возвращает dll.Load?

Author:  GerdtR [ Thu Mar 17, 2016 3:37 am ]
Post subject:  Re: dll.Load и проверка or

dll.Load возвращает 1(неудача) или 0(успех). Вот затем и eax на 0 проверялся.

Author:  popovpa [ Thu Mar 17, 2016 8:36 am ]
Post subject:  Re: dll.Load и проверка or

Нашёл http://wiki.kolibrios.org/wiki/Libraries вопросы отпали...так положено :)

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

Author:  Pathoswithin [ Thu Mar 17, 2016 10:23 am ]
Post subject:  Re: dll.Load и проверка or

Можно использовать or, and, test, нет никакой разницы вообще.

Author:  popovpa [ Thu Mar 17, 2016 10:46 am ]
Post subject:  Re: dll.Load и проверка or

test сравнивает и меняет только флаги, a or записывает значение в приёмник...значит test быстрее? Вот я и не могу понять почему везде or, у нас ведь система на ассемблере и мы хотим чтобы она была максимально компактной и быстрой...

Author:  Pathoswithin [ Thu Mar 17, 2016 2:48 pm ]
Post subject:  Re: dll.Load и проверка or

У современных процессоров с конвейерной архитектурой эффективная скорость выполнения всех команд — 1 такт (кроме умножения и деления).

Author:  Serge [ Thu Mar 17, 2016 3:30 pm ]
Post subject:  Re: dll.Load и проверка or

popovpa
У меня подозрение, что не все знают о существовании команды test.
В любом случае test предпочтительней. Она не требует регистра для сохранения результата, а на современный процессорах пара test и coditional jump объединяются в одну микроинструкцию за счёт macro-fusion.
Quote:
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.

Page 1 of 1 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/