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

Ваш аккаунт

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

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

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

Переход на си

36K
30 декабря 2012 года
kailot2
83 / / 15.12.2012
Всем доброго времени суток! Пишу подобие ОС =) перешел в Protect Mode, до этого писал на ассемблере, сейчас хочу перейти на Си. Кто подскажет как осуществить?
Какой - нибудь Hello World на си и как его скомпилировать\слинковать в бинарный файл? Какой компилятор юзать? Си знаю плохо, вот хочу подучить =)
360
30 декабря 2012 года
P*t*
474 / / 15.02.2007
Несколько кусков из моего "подобия ОС":

Переход в защищенный режим:
Код:
.code16

    movw $0x1000, %ax
    movw %ax, %ds

    movb %dl, bdisk

    movb $0, %ah
    movb $2, %al
    int $0x10

    movb $1, %ah
    movb $0x20, %ch
    int $0x10

    movw $0x5000, %ax
    movw %ax, %ss
    movw $0, %sp

    cli
    call rmodeInitGDT
    call rmodeInitIDT
    call rmodeInitMainTSS

    movl %cr0, %eax
    orw $1, %ax
    movl %eax, %cr0
    jmp $(8*16), $0x0 // Сразу включается многозадачность - это переключение на описываемый ниже mainTSS

    .globl bdisk
bdisk: .byte 0

rmodeInitMainTSS:
    movw $0x6000, %ax
    movw %ax, %es
    movb $0, %al
    movw $0xffff, %cx
    call rmodeMemfill
    movw $main, %es:0x420 /* EIP main */     //  Обрати внимание на эту строку. Здесь main - указатель на сишную функцию, на которую осуществляется переход. Подставляется при линковке.
    movw $0, %es:0x422 /* EIP main */
    movw $0xfff, %es:0x438 /* ESP main */
    movw $0, %es:0x43a /* ESP main */
    movw $8, %es:0x44c /* CS main */
    movw $24, %es:0x450 /* SS main */
    movw $16, %es:0x454 /* DS main */
    movb $4, %es:0x4a1
    movw $0x270, %bx
    movw $mainNameSize, %cx
    movw $mainName, %ax
    call rmodeMemcopy
    ret

    mainName: .string "main"
    mainNameSize = .-mainName
    .globl rmodeMemfill
rmodeMemfill:
/* al - value
 es:bx - dest
 cx - size */
loopBfill:
    movb %al, %es:(%bx)
    inc %bx
    loop loopBfill
    ret

    .globl rmodeMemcopy
rmodeMemcopy:
/* ds:ax - src
 es:bx - dest
 cx - size */
loopBcopy:
    movb (%eax), %dh
    movb %dh, %es:(%bx)
    inc %ax
    inc %bx
    loop loopBcopy
    ret
В сишном коде должна быть объявлена функция "long main()", указатель на которую использован в rmodeInitMainTSS. В принципе она может называться и по другому.

Компиляция:
 
Код:
gcc -c -ffreestanding -mtune=i386 -m32 startup.s gdt.s idt.s main.c asmFunctions.s
   ld -mi386linux --oformat binary -melf_i386 -o kernel -T LDkernelScript
Содержимое файла LDkernelScript
 
Код:
OUTPUT_FORMAT("binary")
SECTIONS {
    output : {
        startup.o
        gdt.o
        idt.o
        main.o
        asmFunctions.o
    }
}
P.S Обязательно посмотри вот это: http://www.opennet.ru/base/dev/from_c_to_asm.txt.html
11K
30 декабря 2012 года
xAtom
65 / / 17.01.2011
Если твои слова не розыгрыш, то вот тебе два примера которые я накидал.

Пример на GCC.
Код:
#include <stdio.h>

int main(void) {
    const char* s = "Hello World !!!";
    puts(s);

    // вывод "Hello World !!!" на встроенном ASM
    // синтаксис AT&T
    asm("movl %0, %%esi"::"d"(s));
    asm("push %esi");
    asm("call puts");
    asm("add  $4, %esp");

    getchar();
    return 0;
}
Пример на Borland C/Microsoft Visual C
Код:
#include <stdio.h>



int main(void)
{
   const char* s = "Hello World !!!";
   puts(s);

   // пример вывода "Hello World !!" на встроенном ASM
   // синтаксис-INTEL
   __asm {
        mov esi, s
        push esi
        call puts
        add esp, 4
   };

   getchar();
   return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог