Как сделать загрузочную программу? - PullRequest
4 голосов
/ 03 апреля 2012

Итак, вопрос может показаться странным, но допустим, что я компилирую:

int main(void)
{
    int x = 3;
    int y = 4;

    int z = x + y;
}

Можно ли заставить процессор работать именно так?Как?Например, позволит ли это мне писать на монитор?(Если я правильно помню, в памяти есть места, в которых вы можете написать материал для отображения.)

Ответы [ 3 ]

2 голосов
/ 11 апреля 2012

printf - это наихудший вызов библиотеки C для использования в самых разных направлениях: с плавающей запятой, строками строк, делением и т. Д. И т. Д., Избегайте его для подобных вещей.Я вижу, что вы только читали комментарии.

Чтобы ВИДЕТЬ запущенную программу, вам нужно моргнуть светодиодом или контактом на параллельном порту или отправить символы через последовательный порт, что значительно проще, чем программированиерегистрируется в графической карте и отлаживает этот код, не видя, что вы делаете успехи.

Теперь с x86 у вас есть слой, на самом деле не ОС, а слой с таким кодом, за которым вы можете делать простые вызовы, чтобы печатать символы на экране в текстовом режиме и ВИДЕТЬ свойпрограмма работает.Я вычеркнул это из pcemu_samples, но вам доступны все версии pcemu и dosbox и другие среды эмуляции x86, а также компьютер.Лучше всего начать с одной из сим-сред (dosbox, pcemu, etC) (если вы чувствуете, что должны начинать с x86, обратите внимание на эту тему, на самом деле я не рекомендую начинать с x86).Если бы вы делали x86, вы могли бы перейти с dosbox или чего-то в этом роде, а затем, вероятно, перейти на загрузочную флешку и продолжить свой путь оттуда.

встроенные процессоры, из которых есть много, много плат eval.имел за менее чем 50 долларов, некоторые хорошие за или менее 20 долларов.Но многие бесплатные симуляторы, которые вы можете изучить.У меня есть несколько вариантов, которые вы можете попробовать: thumbulator, amber_samples, pcemu_samples, вероятно, являются наиболее стабильными (с меньшей вероятностью придется отлаживать мои вещи, в основном отладки ваших вещей), затем другие, которые менее стабильны, meecoate, msp430sim и т. Д., Получат 5 долларов.вы - плата msp430, 10 долларов - плата ARM cortex-m3, 20 долларов - слишком мощная, чтобы называться микроконтроллером, платой микроконтроллера (на базе cortex-m4).И больше денег не дает вам быстрее или лучше, но больше вариантов.доски, которые могут работать под Linux, могут / будут больше мучить то, что вы пытаетесь выучить, оставайтесь на этом уровне.

ваш простой пример требует очень мало, вне кода, который компилятор создает для той функции, которая вам нужна как можно меньше.как одна инструкция для перехода от вектора сброса к точке входа основной функции.В идеале вы хотите настроить стек и в конечном итоге, возможно, обнулить .bss или скопировать .data и т. Д. Просто учитесь использовать инструменты (компилятор, ассемблер, компоновщик) для создания встроенного двоичного файла (даже если у вас нет оборудования / симулятора для запуска).) покажет вам (дизассемблирует), как соединить точки между reset и main () (вам не нужно называть его main, вы можете называть его как угодно, некоторые компиляторы, которые вы НЕ хотите называть main, будут выбрасывать лишнее мусорваш двоичный файл).

2 голосов
/ 03 апреля 2012

В случае вашей программы она не зависит от каких-либо служб операционной системы, кроме как ее запуск.Если бы он дополнительно выполнял ввод или вывод, он почти наверняка полагался бы на операционную систему для выполнения ввода / вывода.

Если вы хотите заменить операционную систему своим собственным кодом, то вы вполне можете сделатьЭто.Существуют минималистичные операционные системы и программные загрузчики.Но да, тебе есть чему поучиться.

0 голосов
/ 05 апреля 2017

Это просто длинная история, вам нужно знать сборку и вы должны знать, какая царапина подходит для вашего типа процессора как правило, сборка для серии x86 очень известна, и вы можете изучить ее.

вы увидите нечто подобное:

Start:

mov AX ,0xff ;example 1
mov BX ,[CX] ;example 2
myString db 'Hi This is my First scratch',0 ;Print Example
call printFunc ;example 3 
jmp $

printFunc:
 mov ah, 0Eh ;This how you print on screen in Assembly
 loop
 lodsb
 cmp AX,BX
 je loop

и т.д. так далее ..... ... .

...