Page 54 of 77

Re: Помогите новичку

Posted: Thu May 23, 2013 11:55 pm
by Mario_r4
z525
Так FASM же достаточно ясно написал "undefined symbol". В первом случае ты убираешь метку, а ссылка на нее остается. Во втором же ты убираешь еще и ссылку. Глобальная метка может быть только одна, а ссылок сколько угодно. При наличии самой метки разумеется.

Re: Помогите новичку

Posted: Fri May 24, 2013 10:23 pm
by z525
SoUrcerer wrote:Сам спросил, сам ответил? :)
Скорее так : подскажите где я торможу.
Mario_r4 wrote:z525
Так FASM же достаточно ясно написал "undefined symbol". В первом случае ты убираешь метку, а ссылка на нее остается. Во втором же ты убираешь еще и ссылку. Глобальная метка может быть только одна, а ссылок сколько угодно. При наличии самой метки разумеется.
Благодарю за объяснение. Ключевое слово здесь - ссылка.
Но всетаки я еще не совсем до конца понял.
Если взять такой пример:

Code: Select all

;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: Помогите новичку

Posted: Fri May 24, 2013 10:50 pm
by IgorA
z525 wrote:И почему dd (подозреваю что связанно с адресом) ?
С адресом не связано,
dd это тип данного 4 байтное число (расшифровывается как data double word)
Это может быть и простое число, не обязательно адрес.

Re: Помогите новичку

Posted: Fri May 24, 2013 10:51 pm
by Mario_r4
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, который также собирает данные в конец файла, но помещает из за пределами получаемого бинарника - это не инициализированные данные и содержимое их не гарантируется, хотя обычно содержит ноль.

Re: Помогите новичку

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

Re: Помогите новичку

Posted: Tue May 28, 2013 12:19 pm
by 0CodErr
При загрузке своих библиотек у меня появляется
unresolved.PNG
unresolved.PNG (4.52 KiB)
Viewed 5843 times
Что это означает и почему это происходит?
Может ли это влиять на работу библиотек?

Re: Помогите новичку

Posted: Tue May 28, 2013 1:57 pm
by SoUrcerer
Это означает, что в библиотеке есть обращения к чему-то, что не удалось найти в coff-файле (к функциям, переменным, и так далее). Для библиотек на Си это обычное дело, потому что в coff-либах, генерируемых gcc, много "лишней" информации - до тех пор, пока в unresolved не окажется какая-нибудь действительно неопределенная функция или переменная - например, memcpy. Для ассемблерных библиотек "unresolved" появляться, по идее, не должно - хотя лучше подождем ответа знатоков.

Re: Помогите новичку

Posted: Tue May 28, 2013 4:26 pm
by Mario_r4
0CodErr wrote:При загрузке своих библиотек у меня появляется
С этого места должно быть подробно. В противном случае нужен прокачанный скилл "телепатия".

Re: Помогите новичку

Posted: Tue May 28, 2013 7:59 pm
by 0CodErr
Mario_r4 wrote:С этого места должно быть подробно.
Тогда лучше в отдельной теме выложу все исходники вместе.

Re: Помогите новичку

Posted: Tue May 28, 2013 8:56 pm
by Serge
0CodErr
Компиляторы могут добавлять в COFF имя файла и другую необязательную информацию. Загрузчик вероятно считает это extrn ссылками.

Re: Помогите новичку

Posted: Mon Jun 10, 2013 7:45 pm
by GerdtR
Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.

Re: Помогите новичку

Posted: Mon Jun 10, 2013 7:55 pm
by Asper
У меня работает. FASM 1.69.31
Как вариант

Code: Select all

mov ecx, 4F3h
call ecx

Re: Помогите новичку

Posted: Mon Jun 10, 2013 7:58 pm
by GerdtR
Ну я в Колибри компилю. Ну и на том спасибо. Хех, а если сразу программным кодом? Код этого call найти и всё. Адреса всё равно абсолютные будут.

Re: Помогите новичку

Posted: Mon Jun 10, 2013 8:00 pm
by Asper
GerdtR wrote:Адреса всё равно абсолютные будут.
Почему ты в этом уверен?

Re: Помогите новичку

Posted: Mon Jun 10, 2013 8:02 pm
by GerdtR
Потому что вызов будет с адреса 60000000h(из динамической PE библиотеки), а саму функции лежат по адресам меньшим 10000h.