Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Какой C использовать?

1.2K
16 сентября 2007 года
piroman17
175 / / 20.07.2006
Раньше я на низком уровне писал только на ASM - надоело :eek: . Какой кмпилятор C вырать? Как настроить чтоб компилировал в COM и не использовал перываний доса и биоса?

p.s. вроде была уже такая тема, но я не нашёл...
1.6K
17 сентября 2007 года
Vov4ick
476 / / 01.02.2007
Какой использовать ввод\вывод, выбираешь ты, а не компилятор путём использования соответствующих функций ввода\вывода (смотри хелп по ним). Для этого подходит BCPP (3.1 имхо генерит более чистый код, чем 5), можешь попробовать BTC, Watcom если найдёшь или MS, вроде ещё какие-то были. Что ты понимаешь под неиспользованием в\в ДОС\БСУВВ? Хочешь чтобы сам компилятор обрабатывал файловую систему, работу с видео, клавиатурой, таймером, контроллером прерываний и прочая и прочая... =))) Этот компилятор нызывается операционной системой. ;-)
32K
18 сентября 2007 года
BootNet
2 / / 18.09.2007
Если тебе ненужно прерываний ДОСа и БИОСа тогда лучше оставаться на асме
Из сс советую Борланд
И вообще даже ОС использует прерываний БИОСа так что, наверное, без прерываний можно написать только БИОС
245
18 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
ну я, со своей юниксовой стороны ;) присоветую gcc + линковщик ld, они под винду портированы (мне показалось, что у автора windows), но хоть убейте, не помню как в ней называются :o . хоть я в ассемблере и не очень сильно шарю, но когда выдал ассемблерный листинг, мне показалось, что сам лучше не напишу.
по крайней мере (если я правильно понял суть вопроса), для того, чтобы не использовать прерывания ос и bios, не нужно использовать зависимые от этих прерываний функции. а если нужен сырой бинарник ключи вроде --oformat binary тебе в помощь. функции i/o советую писать свои.
если очень интересно, могу скинуть свой stdio.c (printf, ввод с клавиатуры с помощью аппаратных прерываний в pm)
1.2K
18 сентября 2007 года
piroman17
175 / / 20.07.2006
Цитата: ~ArchimeD~
... могу скинуть свой stdio.c (printf, ввод с клавиатуры с помощью аппаратных прерываний в pm)



Обязательно скинь!: [email]Piroman17@rambler.ru[/email]
Заранее спасибо!

1.2K
18 сентября 2007 года
piroman17
175 / / 20.07.2006
А какой C или C++ компилирует COM или BIN (модель tiny), и использует 32 битные регистры?
1.6K
18 сентября 2007 года
Vov4ick
476 / / 01.02.2007
watcom C попробуй. модель tiny -> далее exe2bin или настройками компилятора. В любом случае придётся писать самому необходимые процедуры. А в чём проблема? Строчку на экран вывести? ;-) Поставь конкретную задачу.
245
19 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
скинул, посмотри

Цитата:
А какой C или C++ компилирует COM или BIN (модель tiny), и использует 32 битные регистры?



тебе нужен 32-битный pe файл без использования стандартных прерываний, правильно я понял суть вопроса?
не знаю, что выдаст виндовый gcc, а я 32-битный elf файл без использования стандартных прерываний собирал следующим образом:

 
Код:
gcc -ffreestanding -c -MD *****.c
ld -Ttext 0x1100000 -o kernel.bin *****.o


-ffreestanding - не использовать стандартные библиотеки
-c - выдать только .o файлы
-MD - это автоматически построить зависимоти файлов (если ты используешь make-файлы)
-Ttext 0x1100000 - по какому адресу компоновать
-o kernel.bin - выдать такой вот файл
1.8K
19 сентября 2007 года
igor_nf
256 / / 13.12.2006
Цитата: ~ArchimeD~
ну я, со своей юниксовой стороны ;) присоветую gcc + линковщик ld, они под винду портированы (мне показалось, что у автора windows), но хоть убейте, не помню как в ней называются



MinGW.

1.2K
22 сентября 2007 года
piroman17
175 / / 20.07.2006
А какой параметр надо задать в gcc чтоб компилировал без создания стека?
1.2K
22 сентября 2007 года
piroman17
175 / / 20.07.2006
Как заставить gcc, а точнее ld понимать команду:
 
Код:
asm("push AX");

(ругаеться на 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__
245
22 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: piroman17
Как заставить gcc, а точнее ld понимать команду:
 
Код:
asm("push AX");

(ругаеться на AX)?



у gcc ассемблер стандарта AT&T

pushw %ax // запихнет слово
pushl %ax // запихнет двойное слово

и вообще, если привык к интеловскому синтаксису, посмотри http://ru.wikipedia.org/wiki/AT&T_синтаксис (это так, в общем виде), потому что различия есть, в том числе и в порядке операндов.
насчет отладочной информации, честно говоря не задумывался ещё, покопаю ман, скажу - мне тоже пригодиться ;)

5
22 сентября 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: piroman17
И ещё сздаю пустую программу а она занимает 3Кб! Что это? отладочная информатция? Как её убрать?


Использовал gcc (для контроллеров) как компилятор и линковщик

Отладочная инфа включается параметрами gcc
-g1 минимальная
-g обычная
-g3 максимальная

Попробуй включить параметр оптимизации
-O0 без оптимизации
-O1 оптимизация (возможно) по размеру
-O2 оптимизация (возможно) по скорости
-O3 максимальная оптимизация

Для gcc линкера можно использовать такие параметры:
-nostartfiles не использовать стандатртные файлы запуска
-nodefaultlibs не использовать стандартные библиотеки
-s пропускать всю инфу о символах
-nostdlib без стартапов и дефолтных библиотек

1.2K
22 сентября 2007 года
piroman17
175 / / 20.07.2006
Всем ограомное спасибо!
Последный вопрос: как в gcc откоючить создание стека?
1.2K
23 сентября 2007 года
piroman17
175 / / 20.07.2006
Так, со стеком разобрался.
Но вопросы ещё есть :eek:.
Вот такой вопрос: как в asm-вставке использовать переменную из C-процедуры?
И ещё как записать байт al в es:[bx]?
 
Код:
OutChar(unsigned int pos, usigned char ch){
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' "
}
245
23 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
как там к es:[bx] отобразить немного не понял, ты что этим получить хочешь?

а в al запихнуть значение переменной pos можно вроде так:

asm("movw %w1, %bx":: "a"(pos));

а записать в pos значение al, если не изменяет память так:

asm("movw %bx, %w1":: "=a"(pos));
1.2K
23 сентября 2007 года
piroman17
175 / / 20.07.2006
Цитата: ~ArchimeD~

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_синтаксис).
Заранее спасибо!

245
23 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: piroman17
Чёта не работает...
Пишет:
9: error: invalid `asm': operand number out of range
9: error: invalid `asm': operand number missing after %-letter



прошу прощения, ошибся. попробуй
asm("movw %w0, %%bx":: "a"(pos));

Цитата: piroman17
Чёта не работает...
Как в AT&T будет: mov es:[bx], byte pr al;?



если не ошибаюсь,
asm("movb %al, %es: (%ebx)");
(только пробел перед скобкой убери, а то рисуется грустный смайлик)

Цитата: piroman17

И ещё дай ссылочку где можно ПОДРОБНО почитать про 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 - посмотри в разделе низкоуровнего программирования под линух
тоже немного, но разобраться чтобы я думаю хватит

З.Ы. а че ты со стеком то надумал?

1.2K
24 сентября 2007 года
piroman17
175 / / 20.07.2006
Цитата: ~ArchimeD~

З.Ы. а че ты со стеком то надумал?



На стек, ругался exe2com. Я проще сделал: в ld задал параметр -Ttext 0x100, а потом ручками удалил заголовок exe файла и эти пустые 256 байт - вот и получился com файл!

1.2K
26 сентября 2007 года
piroman17
175 / / 20.07.2006
Вот ещё вопрос по asm-вставкам в gcc:

Код:
int __main(void){
//вывод символа
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-загрузчик.

и ещё приложен дезассемблированный код - в нем вроде всё нармально, а вчём же тогда дело???
1.2K
26 сентября 2007 года
piroman17
175 / / 20.07.2006
Исправил строку:
 
Код:
asm("movb %al,%es:(,%ebx,1)");

на
 
Код:
asm("movb %al,%es:-478(%ebx,1)");


Теперь выводит всё там где надо, но я не пойму зачем нужно вычитать 478 из ebx - если я туда и так уже занёс 0 :eek: :confused:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог