OSDev

для всех
Текущее время: 27 апр 2024, 16:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 13:52 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
код длинный, но первую часть вообще мжно не смотреть, где начинается магия я выделил коментом ;=====. суть в том, что я читаю сектор с сидюка, от туда беру четыре байта инфы (размер корневого каталога) и ложу их в две переменные. затем я хочу использовать эту инфу и хренакс у меня уже там нули, заместо 800h... также затираются сообщения. весь прикол в том, что трется и вначале кода, и в конце... (RootSize1 - в начале кода, RootSize2 - в конце)
Код:
use16
org 7C00h
start:
        jmp far 0:boot
        RootSize1 dd 5h

boot:                     ;прыжок для занесения в cs 0
        cli
        mov ax, cs      ;настройка сегментных регистров
        mov ds, ax
        xor ax, ax
        mov [device], dl
        mov es, ax
        mov sp, 7C00h   ;установка sp на начало кода (т.к. стек растет вниз, код не затрется)
        mov ax, 0B800h
        mov fs, ax      ;fs направим на область текстовой видео-памяти
        mov ax, 0f00h
        mov gs, ax
        sti

        mov ax, 3
        int 10h         ;установка видеомоды + очистка экрана
        call MenuItem1
GetKey:
        xor ax, ax
        int 16h
        cmp al, 0Dh
        je OK
        cmp ah, 48h
        je up
        cmp ah, 50h
        je down
        jmp short GetKey
OK:
        cmp [MenuItem], 0
        jne StartOS
        mov si, load_C
        mov di, 8000h
        mov cx, end_C-load_C
        cld
        rep movsb
        jmp 8000h
up:
        cmp [MenuItem], 0
        je GetKey
        call MenuItem1
        jmp short GetKey
down:
        cmp [MenuItem], 1
        je  GetKey
        call MenuItem2
        jmp short GetKey
MenuItem1:
        mov [MenuItem], 0
        xor dx, dx
        mov cx, 18
        mov bx, 4Fh
        mov bp, load1
        mov ax, 1301h
        int 10h
        mov bp, load2
        mov cx, 23
        mov dx, 0100h
        mov bx, 0fh
        int 10h
        ret
MenuItem2:
        mov [MenuItem], 1
        xor dx, dx
        mov cx, 18
        mov bx, 0Fh
        mov bp, load1
        mov ax, 1301h
        int 10h
        mov bp, load2
        mov cx, 23
        mov dx, 0100h
        mov bx, 4fh
        int 10h
        ret

load_C:
        mov ax, 3
        int 10h
        mov ax, 0201h
        mov dx, 80h
        mov cx, 1
        mov bx, 7c00h
        int 13h
        push es
        push 7C00h
        retf
end_C:
       
 ;========================================================================================
StartOS:
        mov ax, 3
        int 10h
        pushd 16        ;сектор который нужно прочитать
        push  gs      ;сегмент в который будет произведено чтение
        call ReadSector
        mov eax, [gs:0A6h]
        mov [RootSize1], eax ;ложу одно
        mov [RootSize2], eax
        mov di, 0h
        mov eax, [RootSize1]
        call dword2hex
        mov di, 160
        mov eax, [RootSize2]
        call dword2hex
        xor eax, eax
        int 16h
        call debug
        ;=========================================================================
        ;pushd  [gs:166]
        ;pushd [gs:158]
        ;push 500h
        ;call ReadFile

        mov ax, 3
        int 10h
        ;call debug
        ;mov si, 9400h
        ;mov di, 2000
FindFile:
        ;xor cx, cx
        ;mov cl, [si+32]
        ;mov dword [fs:di], '6666'
        ;or cx, cx
        ;je .NextFile
        ;add si, 33
        ;push 9Fh
        ;push 0
        ;push 0
        ;push si
        ;call WriteString
        ;sub si, 33
        ;xor ax, ax
        ;int 16h
.NextFile:
        ;xor ax, ax
        ;mov al, [si]
        ;add si, ax
        ;add di, 2
        ;jmp FindFile
Exit:
        jmp $


ReadFile:
        push bp
        mov bp, sp
        mov ecx, [bp+10]
        add ecx, 7FFh
        shr ecx, 11

        mov dx, [bp+4]
        mov eax, [bp+6]
.NextSector:
        push eax
        push dx
        call ReadSector
        add dx, 80h
        loop .NextSector
        mov sp, bp
        pop bp
        ret 6

ReadSector:
        push bp
        mov bp, sp
        push ax dx si
        mov ax, [bp+4]     ;формируем пакет для EDD
        mov [DataSeg], ax  ;сегмент
        mov eax, [bp+6]
        mov [LBAlow], eax  ;сетора в формате LBA

        mov ah, 42h
        mov si, Packet    ;адрес пакета
        mov dl, [device]  ;номер привода с которого грузится загрузчик
        int 13h
        jc .error         ;если произошла ошибка то скажем об этом и зависнем

        pop si dx ax
        mov sp, bp
        pop bp
        ret 6
.error:
        push ErrorMsg1
        call WriteString
        jmp $

;void WriteString(char *str, word x, word y, word color)
WriteString:
        push bp
        mov bp, sp
        push ax di si

        mov ax, [bp+6]
        mov bx, 160
        mul bx
        mov di, ax
        mov ax, [bp+8]
        shl ax, 1
        add di, ax
        mov si, [bp+4]
        push es
        push fs                                 
        pop es                                  ;es на сегмент видео-памяти                                 ;будем писать в самое начало
        mov ax, [bp+10]                             ;аттрибуты символов
@@:
        lodsb
        or al, al                               ;пока не встретим нуль
        je @f
        stosw                                   ;пишем символы в видео-память
        jmp @b
@@:
        pop es
        pop si di ax
        mov sp, bp
        pop bp
        ret 8

debug:
        push es
        push ds
        pusha
        push gs
        push gs
        pop es
        pop ds
        ;=========================================
        call MenuItem1     ;затирается
        xor ecx, ecx
        mov ecx, [RootSize1];достаю другое
        ;shr cx, 4
        ;dec cx
        mov di, 160*10+2*50
        mov eax, ecx
        call dword2hex
        mov ecx, [RootSize2]
        ;shr cx, 4
        ;dec cx
        mov di, 160*11+2*50
        mov eax, ecx
        call dword2hex
        xor ax, ax
        int 16h
        ;=================================================
        xor di, di
        xor si, si
.a1:
        push cx
        mov cx, 16
        push di
        .a2:
                lodsb
                call byte2hex
                add di, 6
                mov ax, di
                mov di, 2000
                call word2hex
                mov di, ax
                xor ax, ax
                int 16h
                loop .a2
        pop di
        add di, 160
        pop cx
        mov ax, cx
        push di
        mov di, 2180
        call word2hex
        mov cx, ax
        pop di
        xor ax, ax
        int 16h
        loop .a1

        popa
        pop ds
        pop es
        ret

byte2hex:
                pusha
                push ax
                shr al, 4
                cmp al, 9
                ja @1
                or al, 30h
                jmp write1
@1:
                add al, 'A'-10
write1:
                mov ah, 0Fh
                mov word [fs:di], ax
                pop ax
                add di, 2
                and al, 0fh
                cmp al, 9
                ja @2
                or al, 30h
                jmp write2
@2:
                add al, 'A'-10
write2:
                mov ah, 0Fh
                mov word [fs:di], ax
                popa
                ret

 
word2hex:
                pusha
                xchg al, ah
                call byte2hex
                add di, 4
                xchg al, ah
                call byte2hex
                popa
                ret

 
dword2hex:
                push eax
                push eax
                shr eax, 16
                call    word2hex
                add di, 8
                pop eax
                and eax, 0ffffh
                call word2hex
                pop eax
                ret

align 4                            ;выравнивание на адрес кратный четырем
Packet:
                       db 0x10    ; размер пакета
                       db 0x00
                       dw 0x0001  ; число читаемых секторов
                       dw 0x0000  ; смещение
   DataSeg             dw 0x0000  ;сегмент данных
   LBAlow              dd 0x00000000   ;сектор в формате LBA
                       dd 0x00000000

ErrorMsg1  db 'Error read table ways.', 0
HelloMsg   db 'Hello world from CD-ROM bootloader!', 0
device db ?
load1      db 'Load from disk C:\'
load2      db 'Starting Fatal_Error OS'
MenuItem db 0
RootSize2 dd 12345678h         


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 17:41 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Трудно понять.

Заметил только, что ты не инициализируешь ss. Еще лучше контролировать местоположение процедуры load_C, чтобы она не пересеклась с адресом 8000h. Не увидел терминаторов у строк load1/2. Кстати в загрузчиках для вывода обычно используют функцию BIOS 0Eh.

Много лишнего для "стороннего наблюдателя". По сути у тебя не получается прочитать сектор с известным номером и сохранить часть данных из буфера чтения в отдельной переменной. Сразу возникает такой вопрос: "Ты уверен, что нужный сектор был прочитан корректно?"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 17:47 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Если есть бинарник(iso или img или ima) могу быстро отладить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 18:25 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
phantom-84 писал(а):
Еще лучше контролировать местоположение процедуры load_C, чтобы она не пересеклась с адресом 8000h.

а зачем? она либо нужна для загрузки с диска С, либо вообще не нужна.
Код:
Не увидел терминаторов у строк load1/2. Кстати в загрузчиках для вывода обычно используют функцию BIOS 0Eh.

что за терминаторы?
Код:
По сути у тебя не получается прочитать сектор с известным номером и сохранить часть данных из буфера чтения в отдельной переменной. Сразу возникает такой вопрос: "Ты уверен, что нужный сектор был прочитан корректно?"

нет, сектор прочитать удается, а вот переменные магическим образом чем-то затираются... процедура debug выводит то что лежит в сегменте gs, а там как раз считанные данные (смотрел через хекс эдитор и то что выводила прока дебаг, байты точь в точь равны). суть в том, что в переменные сохраняется длинна каталога, затем в процедуре дебаг я вывожу дамп каталога по строкам из 16 байт. чтобы узнать кол-во строк я делю размер на 16. как-то так....
Цитата:
Если есть бинарник(iso или img или ima) могу быстро отладить.

конечно есть, но бош умирает после расширенного чтения сидюка. или ты не бошем собрался делать?
PS: поменяй расширение на исо, это не архив


Вложения:
Комментарий к файлу: iso
loader.rar [56 КБ]
Скачиваний: 554
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 18:46 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Если у тебя бош умирает после расширенного чтения сидюка, значит ты что-то делаешь неправильно. В боше всё читается 100%.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 19:30 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Fatal_Error писал(а):
а зачем? она либо нужна для загрузки с диска С, либо вообще не нужна.
Если со временем эта процедура сдвинется в район адреса 8000h, то твой код переноса на этот адрес может вызвать ошибку.

Цитата:
что за терминаторы?
Нолики после строк. Если они конечно нужны.

Цитата:
нет, сектор прочитать удается, а вот переменные магическим образом чем-то затираются... процедура debug выводит то что лежит в сегменте gs, а там как раз считанные данные (смотрел через хекс эдитор и то что выводила прока дебаг, байты точь в точь равны). суть в том, что в переменные сохраняется длинна каталога, затем в процедуре дебаг я вывожу дамп каталога по строкам из 16 байт. чтобы узнать кол-во строк я делю размер на 16. как-то так....
Стек на всякий случай подправь, а то еще и не на такие чудеса насмотришься.

Himik писал(а):
Если у тебя бош умирает после расширенного чтения сидюка, значит ты что-то делаешь неправильно. В боше всё читается 100%.
+1. Я на васме тоже самое написал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 21:25 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
Цитата:
Если со временем эта процедура сдвинется в район адреса 8000h, то твой код переноса на этот адрес может вызвать ошибку.

нет, эта процедура сдвинется в 8000h только в одном случае - если указать загрузку с диска С. если выбрать пункс "загрузить мою ось", то эта процедура вообще ничего не делает, кроме как место занимает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 21:40 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Ты не понял. Я имел в виду, что со временем местоположение этой процедуры в теле загрузчика может измениться так, что она будет лежать в районе адреса 8000h. Кстати если этот код специально разместить выше адреса 7E00h, то его можно вообще не перемещать программным путем.

Еще чтобы обойти загрузку с текущего диска, можно использовать int 18h.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 22:07 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
да и пускай смещается :) что мне с этого? я ведь его всего раз заюзаю) да и это черновой вариант, криворуко-кривоного написанный "лишь бы работал" :)
а с инт18 у меня биос всегда ошибку дает и вешает систему


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что-то (или кто-то) трет память
СообщениеДобавлено: 12 мар 2013, 22:16 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
не. ну это точно шаманизм какой-то... заделал так
Код:
use16
org 7C00h
start:
        jmp far 0:boot
        RootSize1=1200h

boot:     
;....
StartOS:
        mov ax, 3
        int 10h
        pushd 16        ;сектор который нужно прочитать
        push  gs      ;сегмент в который будет произведено чтение
        call ReadSector
        mov eax, [gs:0A6h]
        mov [ds:RootSize1], eax ;ложу одно
        mov [ds:RootSize2], eax
        mov di, 0h
        mov eax, [ds:RootSize1]
        call dword2hex
        mov di, 160
        mov eax, [ds:RootSize2]
        call dword2hex
        xor eax, eax
        int 16h
        call debug
        ;=========================================================================
        ;pushd  [gs:166]
        ;pushd [gs:158]
        ;push 500h
        ;call ReadFile

        mov ax, 3
        int 10h
        ;call debug
        ;mov si, 9400h
        ;mov di, 2000
FindFile:
        ;xor cx, cx
        ;mov cl, [si+32]
        ;mov dword [fs:di], '6666'
        ;or cx, cx
        ;je .NextFile
        ;add si, 33
        ;push 9Fh
        ;push 0
        ;push 0
        ;push si
        ;call WriteString
        ;sub si, 33
        ;xor ax, ax
        ;int 16h
.NextFile:
        ;xor ax, ax
        ;mov al, [si]
        ;add si, ax
        ;add di, 2
        ;jmp FindFile
Exit:
        jmp $


ReadFile:
        push bp
        mov bp, sp
        mov ecx, [bp+10]
        add ecx, 7FFh
        shr ecx, 11

        mov dx, [bp+4]
        mov eax, [bp+6]
.NextSector:
        push eax
        push dx
        call ReadSector
        add dx, 80h
        loop .NextSector
        mov sp, bp
        pop bp
        ret 6

ReadSector:
        push bp
        mov bp, sp
        push ax dx si
        mov ax, [bp+4]     ;формируем пакет для EDD
        mov [DataSeg], ax  ;сегмент
        mov eax, [bp+6]
        mov [LBAlow], eax  ;сетора в формате LBA

        mov ah, 42h
        mov si, Packet    ;адрес пакета
        mov dl, [device]  ;номер привода с которого грузится загрузчик
        int 13h
        jc .error         ;если произошла ошибка то скажем об этом и зависнем

        pop si dx ax
        mov sp, bp
        pop bp
        ret 6
.error:
        push ErrorMsg1
        call WriteString
        jmp $

;void WriteString(char *str, word x, word y, word color)
WriteString:
        push bp
        mov bp, sp
        push ax di si

        mov ax, [bp+6]
        mov bx, 160
        mul bx
        mov di, ax
        mov ax, [bp+8]
        shl ax, 1
        add di, ax
        mov si, [bp+4]
        push es
        push fs                                 
        pop es                                  ;es на сегмент видео-памяти                                 ;будем писать в самое начало
        mov ax, [bp+10]                             ;аттрибуты символов
@@:
        lodsb
        or al, al                               ;пока не встретим нуль
        je @f
        stosw                                   ;пишем символы в видео-память
        jmp @b
@@:
        pop es
        pop si di ax
        mov sp, bp
        pop bp
        ret 8

debug:
        push es
        push ds
        pusha
        push gs
        push gs
        pop es
        pop ds
        ;=========================================
        call MenuItem1     ;затирается
        xor ecx, ecx
        mov ecx, [ds:RootSize1];достаю другое
        ;shr cx, 4
        ;dec cx
        mov di, 160*10+2*50
        mov eax, ecx
        call dword2hex
        mov ecx, [ds:RootSize2]
        ;shr cx, 4
        ;dec cx
        mov di, 160*11+2*50
        mov eax, ecx
        call dword2hex
        xor ax, ax
        int 16h
        ;=================================================
        xor di, di
        xor si, si
.a1:
        push cx
        mov cx, 16
        push di
        .a2:
                lodsb
                call byte2hex
                add di, 6
                mov ax, di
                mov di, 2000
                call word2hex
                mov di, ax
                xor ax, ax
                int 16h
                loop .a2
        pop di
        add di, 160
        pop cx
        mov ax, cx
        push di
        mov di, 2180
        call word2hex
        mov cx, ax
        pop di
        xor ax, ax
        int 16h
        loop .a1

        popa
        pop ds
        pop es
        ret

byte2hex:
                pusha
                push ax
                shr al, 4
                cmp al, 9
                ja @1
                or al, 30h
                jmp write1
@1:
                add al, 'A'-10
write1:
                mov ah, 0Fh
                mov word [fs:di], ax
                pop ax
                add di, 2
                and al, 0fh
                cmp al, 9
                ja @2
                or al, 30h
                jmp write2
@2:
                add al, 'A'-10
write2:
                mov ah, 0Fh
                mov word [fs:di], ax
                popa
                ret

 
word2hex:
                pusha
                xchg al, ah
                call byte2hex
                add di, 4
                xchg al, ah
                call byte2hex
                popa
                ret

 
dword2hex:
                push eax
                push eax
                shr eax, 16
                call    word2hex
                add di, 8
                pop eax
                and eax, 0ffffh
                call word2hex
                pop eax
                ret

align 4                            ;выравнивание на адрес кратный четырем
Packet:
                       db 0x10    ; размер пакета
                       db 0x00
                       dw 0x0001  ; число читаемых секторов
                       dw 0x0000  ; смещение
   DataSeg             dw 0x0000  ;сегмент данных
   LBAlow              dd 0x00000000   ;сектор в формате LBA
                       dd 0x00000000

ErrorMsg1  db 'Error read table ways.', 0
HelloMsg   db 'Hello world from CD-ROM bootloader!', 0
device db ?
load1      db 'Load from disk C:\'
load2      db 'Starting Fatal_Error OS'
MenuItem db 0
RootSize2=1200h
;RootSize2 dd 12345678h

сохраняю в адрес 1200h, а толку нуль... все затирается... что за бред такой?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB