2017-02-12 21 views
1

Я изучаю разработку операционной системы и начинающий, конечно. Я хотел бы создать свою систему в режиме реального времени, которая представляет собой 16-разрядную среду с использованием языка C.Как функция `asm()` работает на языке C?

В C, я использовал функцию asm() для преобразования кодов до 16 бит следующим образом:

asm(".code16") 

, который на языке GCC, чтобы генерировать 16-битные исполняемые файлы (не точно, хотя).

Вопрос:

Предположим, что у меня есть два файла заголовка head1.h и head2.h и main.c файлов. Содержимое main.c файла следующим образом:

asm(".code16"); 
#include<head1.h> 
#include<head2.h> 
int main(){ 
    return 0; 
} 

Теперь, Так как я начал свой код с помощью команды для создания 16 битного исполняемого файла, а затем включен head1.h и head2.h, мне нужно сделать то же самое во всех заголовочных файлах что я должен создать? (или) Достаточно ли добавить строку asm(".code16");?

ОС: Ubuntu

Компилятор: Gnu CC

+4

Я рекомендую вам не использовать gcc для компиляции 16-битного кода. То, что вы используете, - это kludge, который вызывает множество проблем. – fuz

ответ

4

Чтобы ответить на ваш вопрос: Достаточно для asm блок должен присутствовать в начале блока перевода.
Так что ставим его один раз в начале.

Но вы можете сделать лучше: вы можете избежать этого вообще и использовать вместо этого the -m16 command line option (available from 5.2.0).

Но вы можете сделать лучше: вы можете вообще избежать этого.


Эффект -m16 и .code16 это сделать 32-битный код, исполняемый в режиме реального времени, то не для получения реального кода режима.

Look

16.с

int main() 
{ 
    return 4; 
} 

Добыча сырой .text сегмент

>gcc -c -m16 16.c 
>objcopy -j .text -O binary 16.o 16.bin 
>ndisasm 16.bin 

мы получаем

00000000 6655    push ebp 
00000002 6689E5   mov ebp,esp 
00000005 6683E4F0   and esp,byte -0x10 
00000009 66E800000000  call dword 0xf 
0000000F 66B804000000  mov eax,0x4 
00000015 66C9    o32 leave 
00000017 66C3    o32 ret 

который является только 32-битный код заполняется с префиксами размера операнда.
On a real pre-386 machine this won't work as the 66h opcode is UD.


Есть старые 16-битные компиляторы, как Turbo C , что решения проблемного приложений реального режима должным образом.

Turbo C code generation options

В качестве альтернативы, переключатель в защищенном режиме как можно скорее или рассмотреть вопрос об использовании UEFI.


Он доступен в Интернете. Этот компилятор так же стара, как и я!

+1

[«Не упоминайте войну!»] (Https://www.youtube.com/watch?v=yfl6Lu3xQW0). Чем меньше людей знают о Turbo-C (++), тем лучше! –

0

Не нужно добавлять asm("code16") ни в head1.h ни head2.h.

Основная причина заключается в том, как работает предварительный компилятор C. Он заменяет содержимое head1.h и head2.h в пределах main.c.

Для получения дополнительной информации, пожалуйста, проверьте How `#include' Works.

Надеюсь, это поможет!

С наилучшими пожеланиями,

Мигель Анхель