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