Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Загрузчик и ядро ОС


Автор: Merlin27 1.10.2006, 22:13
Здравствуйте.
Вобщем в универе изучаю создание ОС. Загрузчик нам дали.... причем он взят вот отсюда
http://www.codenet.ru/progr/os/step7.php

Я написал ядро. Чтото типа "Hello world!". Там просто выводилась строка.

Потом для следующих заданий мне понадобилось выводить строку посимвольно. Так вот применял следующие функции БИОСа:
int 10h  09h   
int 10h 0eh
int 10h 0ah

Когда запускаю ядро под виндой, то все нормально. Когда задаю код символа в al вручную - тоже все выводит. Но когда пытаюсь брать код следующего символа из памяти (где хранится строка), то при загрузке такого ядра как ОС - с дискеты при помощи загрузчика - выводится какаято белиберда (причем тот же код в винде работает нормально). В итоге на экране вместо "test" выводится вот это "K!! " вобщем левые какието символы smile.
Не могу понять в чем дело.

Под виндой работает. С дискеты - нет. Причем строки командами int 10h 1301h и т.п. нормально выводит.

На всякий случай приведу код своего "ядра" smile
Код

IDEAL
MODEL TINY
DATASEG

mes    db    "test",0

CODESEG
org 100h

Start:
    mov cx,4
    lea si,[mes]
    mov ah,0eh

m1:    lodsb
    int 10h
    loop m1
    
    int 20h
    
END Start



Бьюсь уже 2 дня. Понять не могу в чем дело. Подскажите плиз. 

Автор: dumb 1.10.2006, 23:24
Код

;...
Start:
 push cs
 pop ds
 cld
 ...

Автор: Merlin27 2.10.2006, 19:07
Да.. Я тоже потом додумался smile Оказалось функции вывода символов работают с сегментом DS а вывода строк ES. При запуске под виндой они совпадают, а  при загрузке загрузчиком нормально инициализируется только ES.  smile 

Эх.. че ж я раньше не додумался то  smile 

Автор: dumb 2.10.2006, 20:47
Цитата(Merlin27 @  2.10.2006,  19:07 Найти цитируемый пост)
Оказалось функции вывода символов работают с сегментом DS а вывода строк ES

эм.. странная фраза какая-то...
вобщем дела обстоят так: загрузка строк(lods) - из ds:si, запись(stos) - в es:di.

Автор: Merlin27 26.10.2006, 10:19
dumb, 
Да я это и хотел сказать smile
Просто int 10h 1301h для вывода строк использует es, а для lodsb нужен был ds smile 

Автор: Dude03 26.10.2006, 13:41
Цитата(Merlin27 @  26.10.2006,  10:19 Найти цитируемый пост)
Просто int 10h 1301h для вывода строк использует es

Без сомнения, но какое это для тебя имеет значение. Ты же используешь прерывание.

Автор: Merlin27 26.10.2006, 18:17
А очень просто smile Я сначала выводил строку этой функцией и все работало. Про DS я вообще забыл. А вот символ ну никак не мог вывести на экран, причем символ который находится именно в памяти а не задается в коде программы явно. Путало мне все это дело что при запуске в винде все было ок - DS был равен ES. Вобщем невнимательность причина всего smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)