Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт июл 17, 2018 4:52 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 1107 сообщений ]  На страницу Пред. 152 53 54 55 5674 След.
Автор Сообщение
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Чт май 23, 2013 11:55 pm 
Не в сети
Kernel Developer

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

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт май 24, 2013 10:23 pm 
Не в сети

Зарегистрирован: Вс окт 02, 2011 4:48 pm
Сообщения: 42
SoUrcerer писал(а):
Сам спросил, сам ответил? :)

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

Благодарю за объяснение. Ключевое слово здесь - ссылка.
Но всетаки я еще не совсем до конца понял.
Если взять такой пример:
Код:
;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: Если правильно понял то препроцессор собирает все что стоит между этими ключевыми словами и делает это глобально доступным.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт май 24, 2013 10:50 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 765
z525 писал(а):
И почему dd (подозреваю что связанно с адресом) ?

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт май 24, 2013 10:51 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
z525 писал(а):
то здесь я могу удалить метку и никто не будет жаловаться. Я бы понял сообщение об ошибке если бы эта метка гденибудь еще исползовалась но я этого в исходниках не нашел.

То что с символом ":" - это метка. Удаление метки без удаления ссылок на нее приводит к ошибке компиляции.
z525 писал(а):
если в выше приведенной конструкции (как это правильно назвать не знаю) есть 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 писал(а):
признаюсь что сама конструкция
iglobal
...
endg
мне тоже до конца не понятна. Я знаю что такое macro но то что стоит в kglobals.inc просто жуть. Если правильно понял то препроцессор собирает все что стоит между этими ключевыми словами и делает это глобально доступным.

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

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт май 24, 2013 11:09 pm 
Не в сети
Kernel Developer
Аватара пользователя

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

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт май 28, 2013 12:19 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1295
При загрузке своих библиотек у меня появляется
Вложение:
unresolved.PNG
unresolved.PNG [ 4.52 КБ | 1558 просмотров ]

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт май 28, 2013 1:57 pm 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт май 28, 2013 4:26 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
0CodErr писал(а):
При загрузке своих библиотек у меня появляется

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

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт май 28, 2013 7:59 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1295
Mario_r4 писал(а):
С этого места должно быть подробно.
Тогда лучше в отдельной теме выложу все исходники вместе.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт май 28, 2013 8:56 pm 
Не в сети
Kernel Developer

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 10, 2013 7:45 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 453
Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 10, 2013 7:55 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пт июн 27, 2008 3:22 pm
Сообщения: 976
У меня работает. FASM 1.69.31
Как вариант
Код:
mov ecx, 4F3h
call ecx


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 10, 2013 7:58 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 453
Ну я в Колибри компилю. Ну и на том спасибо. Хех, а если сразу программным кодом? Код этого call найти и всё. Адреса всё равно абсолютные будут.

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 10, 2013 8:00 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пт июн 27, 2008 3:22 pm
Сообщения: 976
GerdtR писал(а):
Адреса всё равно абсолютные будут.

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 10, 2013 8:02 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 453
Потому что вызов будет с адреса 60000000h(из динамической PE библиотеки), а саму функции лежат по адресам меньшим 10000h.

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1107 сообщений ]  На страницу Пред. 152 53 54 55 5674 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB