Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузчик 
:(
    Опции темы
Гость_guest
Дата 12.10.2005, 20:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Собираю загрузчик с нуля :-)
Имеются 3 файла :
loader.s
kernel.c
linker.ld
Результатом компиляции является образ kernel.img
После компиляции образ собирается , после чего я запускаю его на vmware 5.0
Но не работает он как надо - а надо , чтобы он отпечатал на экране Hello world
Ничего вообще не печатает .
Собираю на 3-й федоре
Компиляция :
Код

as -o loader.o loader.s
gcc -o kernel.o -c kernel.c -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
ld -T linker.ld kernel.o loader.o -o kernel.img

Loader.s :
Код


.global _loader           # making entry point visible to linker

# setting up the Multiboot header - see GRUB docs for details
.set ALIGN,    1<<0             # align loaded modules on page boundaries
.set MEMINFO,  1<<1             # provide memory map
.set FLAGS,    ALIGN | MEMINFO  # this is the Multiboot 'flag' field
.set MAGIC,    0x1BADB002       # 'magic number' lets bootloader find the header
.set CHECKSUM, -(MAGIC + FLAGS) # checksum required

.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM

# reserve initial kernel stack space
.set STACKSIZE, 0x4000          # that's 16k.
.comm stack, STACKSIZE, 32      # reserve 16k stack on a quadword boundary

_loader:       mov   $(stack + STACKSIZE), %esp # set up the stack
               push  %eax                       # Multiboot magic number
               push  %ebx                       # Multiboot data structure

               call  _main            # call kernel proper
               hlt                    # halt machine should kernel return

Kernel.c :
Код

unsigned short* const VIDMEM = (unsigned short*) 0xC00B8000;

void clear( void )
{
    unsigned short* vp = VIDMEM;
    for (int i = 0; i < 80 * 25; i++)
    {
        *vp++ = 0;
    }
}

void print( const char* str )
{
    unsigned short* vp = VIDMEM;
    while (*str != '\0')
    {
        *vp++ = (0x0700 | ((unsigned short) *str++));
    }
}

void _main( void* mbd, unsigned int magic )
{
     clear();
     print("Hello world!\0");
     while (1);
}     

Linker.ld :
Код

ENTRY (_loader)

SECTIONS
{
    . = 0x00100000;

    .text :
    {
        *(.text)
    }

    .rodata ALIGN (0x1000) :
    {
        *(.rodata)
    }

    .data ALIGN (0x1000) :
    {
        *(.data)
    }

    .bss :
    {
        _sbss = .;
        *(COMMON)
        *(.bss)
        _ebss = .;
    }
}



  Вверх
oleg1973
Дата 13.10.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



Цитата
clear();
    print("Hello world!\0");

ну так а эти функции у тебя где?
по логике вешей они в stdlib а ты компилиш с -nostdlib



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_guest
Дата 13.10.2005, 14:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В stdlib лежит printf , а не print
  Вверх
oleg1973
Дата 13.10.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



пардон ступил
а откуда это значение? VIDMEM = (unsigned short*) 0xC00B8000;
если реал моде то 0xB800 будет


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_guest
Дата 13.10.2005, 18:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











не помогло
использование printf из stdlib тоже не помогло
  Вверх
oleg1973
Дата 13.10.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



а вот интересно на какой адрес все это компилится?
тоесть
1) биос грузит бут сектор на 7c00
2) у нас реал моде

значит если я сделаю сом файлик типа
Код

org 0x7c00
cli
push 0xb800
pop es
push 1
pop si
mov [es:si],'A'
met:
jmp met


то увижу букавку А на экране


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_guest
Дата 13.10.2005, 22:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну я все же использовал бы ds , а не es
И для вывода сообщения использовал бы 10-е прерывание:
Код

.code16
.text

 .global _start
_start:

   push $0x07C0
   pop %ds

   mov $msg,%si
1: lodsb
   or %al,%al 
   jz met   
   mov $0x0E, %ah
   int $0x10
   jmp 1b

met:
   jmp met

msg: .asciz "Hello world\n" 
   .org 510
   .word 0xAA55   
   


  Вверх
oleg1973
Дата 14.10.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



ну или так
тока если я не ошибаюсь GRUB грузит в рмоде


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.