Linux. компиляция 16-битной программы.

Тема в разделе "WASM.UNIX", создана пользователем TerraIncognita, 25 авг 2008.

  1. TerraIncognita

    TerraIncognita New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2008
    Сообщения:
    22
    Хочу получить на выходе COM-файл MS-DOS.

    файл test.asm:

    Код (Text):
    1. format ELF
    2. use16
    3. org 100h
    4. mov ah,9
    5. mov dx,mess
    6. int 21h
    7. mov ah,10h
    8. int 16h
    9. int 20h
    10. mess db 'Hello World!',0Dh,0Ah,'$'
    ассемблирую. на выходе - файл с расширением *.o
    как теперь с помощью ld получить бинарный файл без всяких заголовков и т.п.? т.е. чтоб COM-файл получился
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Я так понял ты FASM используешь.
    Тебе надо просто указать в качестве выходного формата COM или MZ к примеру
    format COM
    А вообще эту строчку можно опустить тогда по дефолту будет бинарник то есть com.
     
  3. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    Пасибки :)
    но я знаю, что так можно..
    мне бы именно так, чтобы скомпоновать компоновщиком.
    потому что если писать большой проэкт без использования объектников - получается немножко изврат...
     
  4. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    Черт! Опять не тем юзверем залогинился :)
    TerraIncognita = Necromancer13
    Зарегил два аккаунта зачем-то. теперь вот путаюсь :)

    Pavia:
    Просто когда без компоновщика, сразу в исполняемый файл..
    то приходится в главный исходник подключать кучу inc-файлов. от этого долгая компиляция.
    Если бы ядро Linux было написано с использованием таких инклюдов , то при каждом изменении какой-то мелочи в сорцах и перекомпиляции ядра приходилось бы компилить все сначала.
    Поэтому хочется все-таки разобраться, как ФАСМ с компоновщиком подружить...
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Necromancer13
    А чем include Не угодил. Можно и объектники с линковать.
    LD Небольно преднозначен для 16битных файлов. А вообще задаешь выходной формат бинарный
    LD --oformat binary
    В виндоусе эта команда неработает в нем через objectcopy можно получить бинарник
    И другии ключи посмотри для того чтобы выкинуть муссор.

    В виндоусе я вот так вот делал ничего нормально работает . fpc - Это фри Паскаль. Любители Си могут си подставить
    fpc -Rintel int21.pas
    fasm.exe kernel.asm
    ld -Map "kernel.map" -G 0 --output kernel.bin kernel.o int21.o
    objcopy.exe -O binary "kernel.bin"

    map файл для отладки использовал так он не нужен.
    Есть ключи чтобы выкинуть муссор но я их не использовал. Може поискать по Sysbin.com пару вариантов там проскакивало.

    Можно воспользоваться другим форматом объектников и другим линкером.
     
  6. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    только в этом kernel.bin ELF/PE-header будет, а не чистый бинарный файл :dntknw:
     
  7. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    2Necromancer13
    я бы посоветовал набор программ из dev86
    as86 ассемблер 8086
    bcc си компилятор 8086
    ld86 линкер 8086
    у асма синтаксис правда специфический но разобратся можно

    c их помощью собираю .com файлы без проблем из модулей на С и ASM
     
  8. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    про as86 и ld86 слышал :) и правда необычный синтаксис. вроде в первых версиях ядер Линукс именно он и использовался.

    про bcc вообще не знал, что есть такой. ток че-то не получается ним воспользоваться =)) может кто подскажет?:

    Код (Text):
    1. necromancer13@necro13-pc:~$ cat test.c
    2. int main(void)
    3. {
    4.         return 0;
    5. }
    6. necromancer13@necro13-pc:~$ bcc -o test -ansi test.c
    7. ld86: cannot open input file crt0.o
    8. necromancer13@necro13-pc:~$
    что за crt0.o ему надо? О_о
    а еще пробовал подключать stdio.h, так он ругался, что такого нету файла... правда может в bcc этого инклюда и не должно быть...

    ----

    Все ок уже. компилится с параметром -c. а bcc --help этот праметр не показал. нашел его в man bcc.
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. # ld --oformat binary <name>.o -o <name>
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    вообще говоря Linux изначально был 32-х битным ;)
    Торвальдс попутно изучал защищенный режим для 386-х
     
  11. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    bcc и 32х разрядный код генерировать может

    bcc -c -0 example.c -o example.o сгенерирует 16 разрядный
    bcc -c -3 example.c -o example.o 32х разрядный
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    _ir4_Y_
    ну тогда другое дело, меня смутило
     
  13. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    rei3er,
    просто защищенный режим слишком сложный.. решил вот начать с реального....

    эх.. все равно почему-то много мусора в выходном файле... размер файла 4 КБ. а должно бы быть 27 байт, если я правильно посчитал :)
     
  14. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    покажи исходник
    у меня все нормально
    Код (Text):
    1. slackware ir4y # cat 1_gas.s
    2. .global _start
    3. .code16
    4. _start:
    5.         movw %bx,%ax
    6.         movw %cx,%ax
    7.         ret
    8.  
    9. slackware ir4y # as 1_gas.s -o 1_gas.o              
    10. slackware ir4y # ld --oformat binary 1_gas.o -o 1_gas
    11. slackware ir4y # ls -la 1_gas                        
    12. -rwxr-xr-x 1 ir4y ir4y_user 5 Aug 28 21:20 1_gas
    13. slackware ir4y #
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    сделай так

    script.ld
    Код (Text):
    1. OUTPUT_FORMAT("binary")
    2.  
    3. SECTIONS {
    4.     .text 0 : AT(0) {
    5.         *(.text)
    6.     }
    7. }
    потом
    Код (Text):
    1. ld -T script.ld <NAME>.o -o <NAME>
     
  16. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    rei3er,

    Код (Text):
    1. necromancer13@necro13-pc:~$ cat test.asm
    2. format ELF
    3. use16
    4. org 100h
    5. mov ah,9
    6. mov dx,mess
    7. int 21h
    8. mov ah,10h
    9. int 16h
    10. int 20h
    11. mess db 'Hello World!',0Dh,0Ah,'$'
    12. necromancer13@necro13-pc:~$ fasm test.asm test.o
    13. flat assembler  version 1.67.28  (16384 kilobytes memory)
    14. 2 passes, 295 bytes.
    15. necromancer13@necro13-pc:~$ cat script.ld
    16. OUTPUT_FORMAT("binary")
    17.  
    18. SECTIONS {
    19.         .text 0 : AT(0) {
    20.                 *(.text)
    21.         }
    22. }
    23. necromancer13@necro13-pc:~$ ld -T script.ld test.o -o test
    24. Segmentation fault
    25. necromancer13@necro13-pc:~$
    воть....

    _ir4_Y_,

    ну так ты GAS юзаешь, а я своим любимым фасмом пытаюсь.
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Necromancer13
    блин, это же тебе не DOS чтобы юзать int 0x21 и пр.
    что ты вообще хочешь сделать? бинарный файл или нативный исполняемый файл под Linux?
     
  18. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    COM-файл, который можно запустить под Досом будет... это реально?
     
  19. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ну измени format ELF на format binary
     
  20. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    ммм.м.м.. ну тогда вообще директивы format не надо было и получился бы COm-файл MS-DOS. я ведь пытаюсь сделать это с помощью компоновщика. т.е. сначала в объектник а потом компоновщиком ld в COm-файл. или такое извращение вообще нереально реализовать?