Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Aug 21, 2019 1:01 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 9 posts ] 
Author Message
PostPosted: Wed Mar 16, 2016 11:40 pm 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Здравствуйте!

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

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


Top
   
PostPosted: Thu Mar 17, 2016 12:02 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
popovpa
or eax, eax - проверка на 0. ZF соответственно будет 1.


Top
   
PostPosted: Thu Mar 17, 2016 12:09 am 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
В смысле на 0? Значение eax 0? Тогда проверку поидее надо делать после вызова 68 функции? (Просто код не мой) Раз куча не выделилась то и загружать ничего не надо? Или вообще желательно и там и там проверку делать? И тогда вопрос а почему or? test ведь быстрей и меньше? А что возвращает dll.Load?


Top
   
PostPosted: Thu Mar 17, 2016 3:37 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
dll.Load возвращает 1(неудача) или 0(успех). Вот затем и eax на 0 проверялся.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
PostPosted: Thu Mar 17, 2016 8:36 am 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
Нашёл http://wiki.kolibrios.org/wiki/Libraries вопросы отпали...так положено :)

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


Top
   
PostPosted: Thu Mar 17, 2016 10:23 am 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Можно использовать or, and, test, нет никакой разницы вообще.


Top
   
PostPosted: Thu Mar 17, 2016 10:46 am 
Offline
Moderator

Joined: Thu Apr 08, 2010 8:11 pm
Posts: 269
test сравнивает и меняет только флаги, a or записывает значение в приёмник...значит test быстрее? Вот я и не могу понять почему везде or, у нас ведь система на ассемблере и мы хотим чтобы она была максимально компактной и быстрой...


Top
   
PostPosted: Thu Mar 17, 2016 2:48 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
У современных процессоров с конвейерной архитектурой эффективная скорость выполнения всех команд — 1 такт (кроме умножения и деления).


Top
   
PostPosted: Thu Mar 17, 2016 3:30 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
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.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 9 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited