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

Applications development, KoOS API questions
  • 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: Если правильно понял то препроцессор собирает все что стоит между этими ключевыми словами и делает это глобально доступным.
  • z525 wrote:И почему dd (подозреваю что связанно с адресом) ?
    С адресом не связано,
    dd это тип данного 4 байтное число (расшифровывается как data double word)
    Это может быть и простое число, не обязательно адрес.
  • 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 лет себе в жопу!
  • Я немного дополню Mario_r4 насчёт макросов iglobal/uglobal:
    * макрос iglobal помещает всё, что объявлено внутри него, в точку, где написано IncludeIGlobals. Если IncludeIGlobals не написано нигде - как в твоём примере, z525, - то всё, что внутри него, пропадает. Поэтому у тебя и нет ошибки компиляции при отсутствующих метках;
    * макрос uglobal - аналогично с IncludeUGlobals;
    * цель макросов iglobal/uglobal - не столько уменьшение размера файла - хотя и это тоже присутствует - сколько ускорение, процессору существенно лучше, когда код и данные разделены;
    * данные, размещённые в uglobal, сами по себе действительно неинициализированы, но конкретно в случае ядра Колибри при загрузке выполняется код, который область uglobal явным образом обнуляет.
    Сделаем мир лучше!
  • При загрузке своих библиотек у меня появляется
    unresolved.PNG
    unresolved.PNG (4.52 KiB)
    Viewed 5797 times
    Что это означает и почему это происходит?
    Может ли это влиять на работу библиотек?
  • Это означает, что в библиотеке есть обращения к чему-то, что не удалось найти в coff-файле (к функциям, переменным, и так далее). Для библиотек на Си это обычное дело, потому что в coff-либах, генерируемых gcc, много "лишней" информации - до тех пор, пока в unresolved не окажется какая-нибудь действительно неопределенная функция или переменная - например, memcpy. Для ассемблерных библиотек "unresolved" появляться, по идее, не должно - хотя лучше подождем ответа знатоков.
  • 0CodErr wrote:При загрузке своих библиотек у меня появляется
    С этого места должно быть подробно. В противном случае нужен прокачанный скилл "телепатия".
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Mario_r4 wrote:С этого места должно быть подробно.
    Тогда лучше в отдельной теме выложу все исходники вместе.
  • 0CodErr
    Компиляторы могут добавлять в COFF имя файла и другую необязательную информацию. Загрузчик вероятно считает это extrn ссылками.
  • Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • У меня работает. FASM 1.69.31
    Как вариант

    Code: Select all

    mov ecx, 4F3h
    call ecx
    
  • Ну я в Колибри компилю. Ну и на том спасибо. Хех, а если сразу программным кодом? Код этого call найти и всё. Адреса всё равно абсолютные будут.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • GerdtR wrote:Адреса всё равно абсолютные будут.
    Почему ты в этом уверен?
  • Потому что вызов будет с адреса 60000000h(из динамической PE библиотеки), а саму функции лежат по адресам меньшим 10000h.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Who is online

    Users browsing this forum: No registered users and 5 guests