Запустите код c из программы загрузчика - PullRequest
2 голосов
/ 13 марта 2012

Пока у меня есть скрипт сборки, который позволяет вам загружаться с него и записывать hello world на экран.теперь я хочу иметь возможность написать некоторый код на c и иметь возможность запуска своего сценария сборки.Я использую MINGW GCC для моего компилятора.Это мой загрузчик в сборке:

 org 7C00h
 jmp short Start  
 Msg:    db "Hello, world"  EndMsg:  Start:  mov bx, 000Fh   
 mov cx, 1       
 xor dx, dx  
 mov ds, dx
 cld               Print:  mov si, Msg   

          Char:   mov ah, 2      
 int 10h
 lodsb


 mov ah, 9   
 int 10h
 inc dl      
 cmp dl, 80      
 jne Skip
 xor dl, dl
 inc dh
 cmp dh, 25    
 jne Skip
 xor dh, dh  
 Skip:   cmp si, EndMsg
 jne Char        
 jmp Print        times 0200h - 2 - ($ - $$)  db 0    
 dw 0AA55h

Мой вопрос: как скомпилировать код c, чтобы скрипт сборки его выполнял?а также как мне отредактировать мой текущий загрузчик, чтобы это было возможно?

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Во-первых, вы должны выбрать компилятор для использования и изучить его особенности.Программы на C могут быть скомпилированы для «размещенной» среды, которая предполагает стандартную инициализацию, main () в качестве точки входа и стандартной библиотеки, и «автономную» среду, где такие гарантии не предоставляются.Чтобы вызвать C-код, вы должны выполнить соответствующую настройку среды (стек, сегменты данных и т. Д.) В загрузчике.Подробности этого зависят от компилятора.Преобразование объектного кода в форму, подходящую для вашего загрузчика, также может быть проблемой.Для 16-битного кода есть как минимум Turbo C и Watcom C, доступные для бесплатного использования.Watcom более прогрессивен и современен, и теперь он открыт.Обратите внимание, что стандартная библиотека недоступна при такой настройке, поэтому код C должен быть специально написан для вашей среды;это включает в себя такие подводные камни, как, например, умножение 32-битных длинных, обычно реализуемое в библиотеке, несмотря на то, что вы не пишете библиотечный вызов.

[В общем, я запутался с вашим запросом использовать точно C;как только загрузчику вряд ли понадобится скорость выполнения, более уместно использовать что-то более подходящее для такого контекста, как Forth.Есть готовые реализации (см. Загрузчик FreeBSD).]

1 голос
/ 21 марта 2012

Вам необходимо скомпилировать код C для 16 бит.Затем скопируйте его в заданную позицию в загрузочном устройстве.Вам нужно будет изменить свой загрузчик, чтобы загрузить код в память и перейти к нему.Также обратите внимание, что gcc в настоящее время не может скомпилировать до 16 бит.Я слышал, что компилятор Watcom может, поэтому он должен быть полезен.

0 голосов
/ 09 декабря 2015

Как правило, вам нужно выполнить следующие действия:

  1. Лучше подготовьте кросс-компилятор, чтобы избежать многих проблем.
  2. Ваш загрузчик должен найтикаталог / файл на дискете или CD.Например, если у вас установлен загрузчик на компакт-диске, вам нужно найти способ для анализа содержимого компакт-диска.Вы можете обратиться к стандарту «El Torito» для компакт-дисков.
  3. Ваш загрузчик должен подготовить среду для вашей программы c.Например, ваша C-программа ожидает защищенный режим с 32-битной версией, ваш загрузчик должен подготовить его.
  4. Ваш загрузчик должен загрузить C-программу в память и перейти к ней.
  5. В большинстве случаевслучае, вы должны написать еще один загрузчик.Ваш загрузчик № 1 должен загрузить загрузчик № 2, а загрузчик № 2 - вашу программу на Си.Ваш второй загрузчик может быть написан на ассемблере, и вам будет гораздо проще проверить вашу работу.
  6. Ваша программа на С должна быть выполнена в автономном режиме.

Вам нужно много раз для Googleвсе детали ...

...