Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Apr 26, 2019 1:06 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 1119 posts ]  Go to page Previous 152 53 54 55 5675 Next
Author Message
PostPosted: Thu May 23, 2013 11:55 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
z525
Так FASM же достаточно ясно написал "undefined symbol". В первом случае ты убираешь метку, а ссылка на нее остается. Во втором же ты убираешь еще и ссылку. Глобальная метка может быть только одна, а ссылок сколько угодно. При наличии самой метки разумеется.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Fri May 24, 2013 10:23 pm 
Offline

Joined: Sun Oct 02, 2011 4:48 pm
Posts: 42
SoUrcerer wrote:
Сам спросил, сам ответил? :)

Скорее так : подскажите где я торможу.
Mario_r4 wrote:
z525
Так FASM же достаточно ясно написал "undefined symbol". В первом случае ты убираешь метку, а ссылка на нее остается. Во втором же ты убираешь еще и ссылку. Глобальная метка может быть только одна, а ссылок сколько угодно. При наличии самой метки разумеется.

Благодарю за объяснение. Ключевое слово здесь - ссылка.
Но всетаки я еще не совсем до конца понял.
Если взять такой пример:
Code:
;kernel_test.asm

include 'kglobals.inc'

iglobal
align 4
sys_system_table:
        dd      exit_for_anyone         ; 1 = obsolete
        dd      sysfn_terminate         ; 2 = terminate thread
        dd      sysfn_activate          ; 3 = activate window
        dd      sysfn_getidletime       ; 4 = get idle time
        dd      sysfn_getcpuclock       ; 5 = get cpu clock
        dd      sysfn_saveramdisk       ; 6 = save ramdisk
        dd      sysfn_getactive         ; 7 = get active window
        dd      sysfn_sound_flag        ; 8 = get/set sound_flag
        dd      sysfn_shutdown          ; 9 = shutdown with parameter
        dd      sysfn_minimize          ; 10 = minimize window
        dd      sysfn_getdiskinfo       ; 11 = get disk subsystem info
        dd      sysfn_lastkey           ; 12 = get last pressed key
        dd      sysfn_getversion        ; 13 = get kernel version
        dd      sysfn_waitretrace       ; 14 = wait retrace
        dd      sysfn_centermouse       ; 15 = center mouse cursor
        dd      sysfn_getfreemem        ; 16 = get free memory size
        dd      sysfn_getallmem         ; 17 = get total memory size
        dd      sysfn_terminate2        ; 18 = terminate thread using PID
                                        ;                 instead of slot
        dd      sysfn_mouse_acceleration; 19 = set/get mouse acceleration
        dd      sysfn_meminfo           ; 20 = get extended memory info
        dd      sysfn_pid_to_slot       ; 21 = get slot number for pid
        dd      sysfn_min_rest_window   ; 22 = minimize and restore any window
sysfn_num = ($ - sys_system_table)/4
endg

sysfn_terminate2:

то здесь я могу удалить метку и никто не будет жаловаться. Я бы понял сообщение об ошибке если бы эта метка гденибудь еще исползовалась но я этого в исходниках не нашел.
И если уж шла речь о ссылках то хотелось бы спросить следущее-правильно ли я понял что если в выше приведенной конструкции (как это правильно назвать не знаю) есть dd sysfn_terminate2 то это будет ссылкана метку которая существует. А например dd sysfn_meminfo (в данном примере) просто переменной? И почему dd (подозреваю что связанно с адресом) ?
признаюсь что сама конструкция
iglobal
...
endg

мне тоже до конца не понятна. Я знаю что такое macro но то что стоит в kglobals.inc просто жуть. :shock: Если правильно понял то препроцессор собирает все что стоит между этими ключевыми словами и делает это глобально доступным.


Top
   
PostPosted: Fri May 24, 2013 10:50 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 811
z525 wrote:
И почему dd (подозреваю что связанно с адресом) ?

С адресом не связано,
dd это тип данного 4 байтное число (расшифровывается как data double word)
Это может быть и простое число, не обязательно адрес.


Top
   
PostPosted: Fri May 24, 2013 10:51 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
z525 wrote:
то здесь я могу удалить метку и никто не будет жаловаться. Я бы понял сообщение об ошибке если бы эта метка гденибудь еще исползовалась но я этого в исходниках не нашел.

То что с символом ":" - это метка. Удаление метки без удаления ссылок на нее приводит к ошибке компиляции.
z525 wrote:
если в выше приведенной конструкции (как это правильно назвать не знаю) есть dd sysfn_terminate2 то это будет ссылкана метку которая существует. А например dd sysfn_meminfo (в данном примере) просто переменной? И почему dd (подозреваю что связанно с адресом) ?

dd это размерность данных.
dd = dword
dw = word
db = byte
Говоря терминами ЯВУ все что идет начиная с метки sys_system_table: до sysfn_num = ($ - sys_system_table)/4 это массив с размерностью данных в dword. Значения содержат адреса вызываемых процедур. При компиляции названия меток заменяются реальными числами.
z525 wrote:
признаюсь что сама конструкция
iglobal
...
endg
мне тоже до конца не понятна. Я знаю что такое macro но то что стоит в kglobals.inc просто жуть. Если правильно понял то препроцессор собирает все что стоит между этими ключевыми словами и делает это глобально доступным.

Оно даже без макроса является глобально доступным, в связи с тем что используются уникальные имена. Задача макроса собрать такие данные в конец компилируемого файла, чтобы добиться уменьшения размера файла (за счет отсутствия лишних выравниваний на границу align 4) и возможно лучшего сжатия, процедурой упаковки ядра. Данные обозначенные этим макросом являются инициализированными и уже заранее содержат нужное значение. Также есть макрос uglobal, который также собирает данные в конец файла, но помещает из за пределами получаемого бинарника - это не инициализированные данные и содержимое их не гарантируется, хотя обычно содержит ноль.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Fri May 24, 2013 11:09 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
Я немного дополню Mario_r4 насчёт макросов iglobal/uglobal:
* макрос iglobal помещает всё, что объявлено внутри него, в точку, где написано IncludeIGlobals. Если IncludeIGlobals не написано нигде - как в твоём примере, z525, - то всё, что внутри него, пропадает. Поэтому у тебя и нет ошибки компиляции при отсутствующих метках;
* макрос uglobal - аналогично с IncludeUGlobals;
* цель макросов iglobal/uglobal - не столько уменьшение размера файла - хотя и это тоже присутствует - сколько ускорение, процессору существенно лучше, когда код и данные разделены;
* данные, размещённые в uglobal, сами по себе действительно неинициализированы, но конкретно в случае ядра Колибри при загрузке выполняется код, который область uglobal явным образом обнуляет.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Tue May 28, 2013 12:19 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
При загрузке своих библиотек у меня появляется
Attachment:
unresolved.PNG
unresolved.PNG [ 4.52 KiB | Viewed 1769 times ]

Что это означает и почему это происходит?
Может ли это влиять на работу библиотек?


Top
   
PostPosted: Tue May 28, 2013 1:57 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Это означает, что в библиотеке есть обращения к чему-то, что не удалось найти в coff-файле (к функциям, переменным, и так далее). Для библиотек на Си это обычное дело, потому что в coff-либах, генерируемых gcc, много "лишней" информации - до тех пор, пока в unresolved не окажется какая-нибудь действительно неопределенная функция или переменная - например, memcpy. Для ассемблерных библиотек "unresolved" появляться, по идее, не должно - хотя лучше подождем ответа знатоков.


Top
   
PostPosted: Tue May 28, 2013 4:26 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
0CodErr wrote:
При загрузке своих библиотек у меня появляется

С этого места должно быть подробно. В противном случае нужен прокачанный скилл "телепатия".

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Tue May 28, 2013 7:59 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Mario_r4 wrote:
С этого места должно быть подробно.
Тогда лучше в отдельной теме выложу все исходники вместе.


Top
   
PostPosted: Tue May 28, 2013 8:56 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
0CodErr
Компиляторы могут добавлять в COFF имя файла и другую необязательную информацию. Загрузчик вероятно считает это extrn ссылками.


Top
   
PostPosted: Mon Jun 10, 2013 7:45 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.

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


Top
   
PostPosted: Mon Jun 10, 2013 7:55 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 979
У меня работает. FASM 1.69.31
Как вариант
Code:
mov ecx, 4F3h
call ecx


Top
   
PostPosted: Mon Jun 10, 2013 7:58 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Ну я в Колибри компилю. Ну и на том спасибо. Хех, а если сразу программным кодом? Код этого call найти и всё. Адреса всё равно абсолютные будут.

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


Top
   
PostPosted: Mon Jun 10, 2013 8:00 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 979
GerdtR wrote:
Адреса всё равно абсолютные будут.

Почему ты в этом уверен?


Top
   
PostPosted: Mon Jun 10, 2013 8:02 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Потому что вызов будет с адреса 60000000h(из динамической PE библиотеки), а саму функции лежат по адресам меньшим 10000h.

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 1119 posts ]  Go to page Previous 152 53 54 55 5675 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


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