Определить extern символ на FASM и еще несколько багов

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 24 мар 2019.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Собственно, есть один кодес на NASM, который я хочу переписать на FASM, но возникли проблемы со знанием самого FASM:

    Код (ASM):
    1.  
    2. MBOOT_PAGE_ALIGN   equ 1 << 0
    3. MBOOT_MEM_INFO     equ 1 << 1
    4. MBOOT_HEADER_MAGIC equ 0x1BADB002
    5. MBOOT_HEADER_FLAGS equ (MBOOT_PAGE_ALIGN) | (MBOOT_MEM_INFO)
    6. MBOOT_CHECKSUM     equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
    7.  
    8. use32
    9.  
    10. mboot:
    11.   dd MBOOT_HEADER_MAGIC
    12.   dd MBOOT_HEADER_FLAGS
    13.   dd MBOOT_CHECKSUM
    14.   dd mboot
    15.  
    16. extern go.kernel.Load
    17.  
    18. start:
    19.   push ebx
    20.   cli
    21.   call go.kernel.Load
    22.   hlt                        
    Ругается на строку dd MBOOT_HEADER_FLAGS. Видимо, потому, что препроцессор подставляет вместо equ текст того, что определено выше.

    go.kernel.Load определен во внешнем объектнике. Вроде, extern я применил правильно. А как экспортировать символы на FASM, чтобы mboot был доступен снаружи?

    В оригинале есть еще такие строки:

    Код (ASM):
    1. [GLOBAL mboot]
    2. [EXTERN code]
    3. [EXTERN bss]
    4. [EXTERN end]
    Для чего здесь имена секций указаны как extern? Есть аналог этих директив на FASM?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Ты просто синтаксис цэшный пытаешься на него натянуть, фасм не понимает чего ты от него хочешь.
    Код (Text):
    1. MBOOT_PAGE_ALIGN   equ 1 shl 0
    2. MBOOT_MEM_INFO     equ 1 shl 1
    3. MBOOT_HEADER_MAGIC equ 0x1BADB002
    4. MBOOT_HEADER_FLAGS equ (MBOOT_PAGE_ALIGN) or (MBOOT_MEM_INFO)
    5. MBOOT_CHECKSUM     equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
    --- Сообщение объединено, 24 мар 2019 ---
    Скорей всего аналог 'section' или 'data', почему extern надо в документации по насму смотреть. Могу предположить только, что global/extern и есть разница между секцией и директорией.
     
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    А как на FASM определяются внешние символы?

    Код (ASM):
    1. extrn 'go.kernel.Load' as kernel
    2.  
    Компилятор ругается на этот код: illegal instruction

    Решил проблему: добавил format COFF
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    "Внешние символы" это импорт?
    Код (Text):
    1. section '.data' data readable writable
    2. data import
    3. library kernel32,'kernel32.dll'
    4. include 'api\kernel32.inc'
    5. end data
    --- Сообщение объединено, 24 мар 2019 ---
    Так бы и сказал, что нужен объектный файл, не готовый бинарник. У фасма в комплекте есть папка \EXAMPLES, в ней в общих чертах показаны темплейты для разных форматов и нужд.
     
  5. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Какими средствами под виндой можно слинковать несколько объектных файлов, написанных на разных языках, в исполняемый файл и при линковке использовать скрипт линкера? Нужны аналоги make и ld