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

Помогите новичку
http://board.kolibrios.org/viewtopic.php?f=2&t=684
Page 54 of 76

Author:  Mario_r4 [ Thu May 23, 2013 11:55 pm ]
Post subject:  Re: Помогите новичку

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

Author:  z525 [ Fri May 24, 2013 10:23 pm ]
Post subject:  Re: Помогите новичку

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

Author:  IgorA [ Fri May 24, 2013 10:50 pm ]
Post subject:  Re: Помогите новичку

z525 wrote:
И почему dd (подозреваю что связанно с адресом) ?

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

Author:  Mario_r4 [ Fri May 24, 2013 10:51 pm ]
Post subject:  Re: Помогите новичку

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, который также собирает данные в конец файла, но помещает из за пределами получаемого бинарника - это не инициализированные данные и содержимое их не гарантируется, хотя обычно содержит ноль.

Author:  CleverMouse [ Fri May 24, 2013 11:09 pm ]
Post subject:  Re: Помогите новичку

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

Author:  0CodErr [ Tue May 28, 2013 12:19 pm ]
Post subject:  Re: Помогите новичку

При загрузке своих библиотек у меня появляется
Attachment:
unresolved.PNG
unresolved.PNG [ 4.52 KiB | Viewed 2882 times ]

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

Author:  SoUrcerer [ Tue May 28, 2013 1:57 pm ]
Post subject:  Re: Помогите новичку

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

Author:  Mario_r4 [ Tue May 28, 2013 4:26 pm ]
Post subject:  Re: Помогите новичку

0CodErr wrote:
При загрузке своих библиотек у меня появляется

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

Author:  0CodErr [ Tue May 28, 2013 7:59 pm ]
Post subject:  Re: Помогите новичку

Mario_r4 wrote:
С этого места должно быть подробно.
Тогда лучше в отдельной теме выложу все исходники вместе.

Author:  Serge [ Tue May 28, 2013 8:56 pm ]
Post subject:  Re: Помогите новичку

0CodErr
Компиляторы могут добавлять в COFF имя файла и другую необязательную информацию. Загрузчик вероятно считает это extrn ссылками.

Author:  GerdtR [ Mon Jun 10, 2013 7:45 pm ]
Post subject:  Re: Помогите новичку

Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.

Author:  Asper [ Mon Jun 10, 2013 7:55 pm ]
Post subject:  Re: Помогите новичку

У меня работает. FASM 1.69.31
Как вариант
Code:
mov ecx, 4F3h
call ecx

Author:  GerdtR [ Mon Jun 10, 2013 7:58 pm ]
Post subject:  Re: Помогите новичку

Ну я в Колибри компилю. Ну и на том спасибо. Хех, а если сразу программным кодом? Код этого call найти и всё. Адреса всё равно абсолютные будут.

Author:  Asper [ Mon Jun 10, 2013 8:00 pm ]
Post subject:  Re: Помогите новичку

GerdtR wrote:
Адреса всё равно абсолютные будут.

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

Author:  GerdtR [ Mon Jun 10, 2013 8:02 pm ]
Post subject:  Re: Помогите новичку

Потому что вызов будет с адреса 60000000h(из динамической PE библиотеки), а саму функции лежат по адресам меньшим 10000h.

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