Какой C использовать?
p.s. вроде была уже такая тема, но я не нашёл...
Из сс советую Борланд
И вообще даже ОС использует прерываний БИОСа так что, наверное, без прерываний можно написать только БИОС
по крайней мере (если я правильно понял суть вопроса), для того, чтобы не использовать прерывания ос и bios, не нужно использовать зависимые от этих прерываний функции. а если нужен сырой бинарник ключи вроде --oformat binary тебе в помощь. функции i/o советую писать свои.
если очень интересно, могу скинуть свой stdio.c (printf, ввод с клавиатуры с помощью аппаратных прерываний в pm)
Обязательно скинь!: [email]Piroman17@rambler.ru[/email]
Заранее спасибо!
тебе нужен 32-битный pe файл без использования стандартных прерываний, правильно я понял суть вопроса?
не знаю, что выдаст виндовый gcc, а я 32-битный elf файл без использования стандартных прерываний собирал следующим образом:
ld -Ttext 0x1100000 -o kernel.bin *****.o
-ffreestanding - не использовать стандартные библиотеки
-c - выдать только .o файлы
-MD - это автоматически построить зависимоти файлов (если ты используешь make-файлы)
-Ttext 0x1100000 - по какому адресу компоновать
-o kernel.bin - выдать такой вот файл
MinGW.
(ругаеться на AX)?
И ещё сздаю пустую программу а она занимает 3Кб! Что это? отладочная информатция? Как её убрать?
Вот что в конце exe-файла:
___RUNTIME_PSEUDO_RELOC_LIST__
__data_start__
___DTOR_LIST__
___tls_start__
__size_of_stack_commit__
__size_of_stack_reserve__
__major_subsystem_version__
___crt_xl_start__
___crt_xi_start__
___crt_xi_end__
__bss_start__
___RUNTIME_PSEUDO_RELOC_LIST_END__
__size_of_heap_commit__
___crt_xp_start__
___crt_xp_end__
__minor_os_version__
__image_base__
__section_alignment__
__RUNTIME_PSEUDO_RELOC_LIST__
__data_end__
__CTOR_LIST__
__bss_end__
___crt_xc_end__
___crt_xc_start__
___CTOR_LIST__
__file_alignment__
__major_os_version__
__DTOR_LIST__
__size_of_heap_reserve__
___crt_xt_start__
__subsystem__
___tls_end__
__major_image_version__
__loader_flags__
__minor_subsystem_version__
__minor_image_version__
__RUNTIME_PSEUDO_RELOC_LIST_END__
___crt_xt_end__
(ругаеться на AX)?
у gcc ассемблер стандарта AT&T
pushw %ax // запихнет слово
pushl %ax // запихнет двойное слово
и вообще, если привык к интеловскому синтаксису, посмотри http://ru.wikipedia.org/wiki/AT&T_синтаксис (это так, в общем виде), потому что различия есть, в том числе и в порядке операндов.
насчет отладочной информации, честно говоря не задумывался ещё, покопаю ман, скажу - мне тоже пригодиться ;)
Использовал gcc (для контроллеров) как компилятор и линковщик
Отладочная инфа включается параметрами gcc
-g1 минимальная
-g обычная
-g3 максимальная
Попробуй включить параметр оптимизации
-O0 без оптимизации
-O1 оптимизация (возможно) по размеру
-O2 оптимизация (возможно) по скорости
-O3 максимальная оптимизация
Для gcc линкера можно использовать такие параметры:
-nostartfiles не использовать стандатртные файлы запуска
-nodefaultlibs не использовать стандартные библиотеки
-s пропускать всю инфу о символах
-nostdlib без стартапов и дефолтных библиотек
Последный вопрос: как в gcc откоючить создание стека?
Но вопросы ещё есть :eek:.
Вот такой вопрос: как в asm-вставке использовать переменную из C-процедуры?
И ещё как записать байт al в es:[bx]?
asm("movw $0xB800, %ax");
asm("movw $ax, %es");
asm("movb ch,%al"); //здесь ld ругаеться на ch
asm('movw pos,%bx'); //здесь ld материт pos
asm("movb %al,%es.%bx"); //здесь gcc ругаеться на '.%bx' - пробовал делать ':%bx' - ругался gcc, типа "bad memory operand '%bx' "
}
а в al запихнуть значение переменной pos можно вроде так:
asm("movw %w1, %bx":: "a"(pos));
а записать в pos значение al, если не изменяет память так:
asm("movw %bx, %w1":: "=a"(pos));
asm("movw %w1, %bx":: "a"(pos));
Чёта не работает...
Пишет:
9: error: invalid `asm': operand number out of range
9: error: invalid `asm': operand number missing after %-letter
как там к es:[bx] отобразить немного не понял...
Как в AT&T будет: mov es:[bx], byte pr al;?
И ещё дай ссылочку где можно ПОДРОБНО почитать про AT&T, а то по той ссылке что мне дали мало инфы(http://ru.wikipedia.org/wiki/AT&T_синтаксис).
Заранее спасибо!
Пишет:
9: error: invalid `asm': operand number out of range
9: error: invalid `asm': operand number missing after %-letter
прошу прощения, ошибся. попробуй
asm("movw %w0, %%bx":: "a"(pos));
Как в AT&T будет: mov es:[bx], byte pr al;?
если не ошибаюсь,
asm("movb %al, %es: (%ebx)");
(только пробел перед скобкой убери, а то рисуется грустный смайлик)
И ещё дай ссылочку где можно ПОДРОБНО почитать про AT&T, а то по той ссылке что мне дали мало инфы(http://ru.wikipedia.org/wiki/AT&T_синтаксис).
Заранее спасибо!
http://www.linuxshare.ru/docs/devel/languages/gas/gas-8.html
http://lowlevel.ru/index.php?namespace=articles - посмотри в разделе низкоуровнего программирования под линух
тоже немного, но разобраться чтобы я думаю хватит
З.Ы. а че ты со стеком то надумал?
З.Ы. а че ты со стеком то надумал?
На стек, ругался exe2com. Я проще сделал: в ld задал параметр -Ttext 0x100, а потом ручками удалил заголовок exe файла и эти пустые 256 байт - вот и получился com файл!
//вывод символа
asm("pushw %es");
asm("pushw %ax");
asm("pushl %ebx");
asm("movw $0xB800,%ax");
asm("movw %ax,%es");
asm("movl $0x00, %ebx");
asm("movb $0x21, %al");
asm("movb %al,%es:(,%ebx,1)");
asm("popl %ebx");
asm("popw %ax");
asm("popw %es");
asm("l1: jmp l1");
}
Прививедённый выше код должен выводить символ "!" в левом верхнем углу экрана, а выводит в верхнем правом изменение цвета символа (как показано на скриншоте)-как мне быть???
P.S. на двойку в оевом углу не обращайте внимания - её выводит Boot-загрузчик.
и ещё приложен дезассемблированный код - в нем вроде всё нармально, а вчём же тогда дело???
на
Теперь выводит всё там где надо, но я не пойму зачем нужно вычитать 478 из ebx - если я туда и так уже занёс 0 :eek: :confused: