OSDev http://osdev.su/ |
|
что-то (или кто-то) трет память http://osdev.su/viewtopic.php?f=6&t=719 |
Страница 1 из 2 |
Автор: | Fatal_Error [ 12 мар 2013, 13:52 ] |
Заголовок сообщения: | что-то (или кто-то) трет память |
код длинный, но первую часть вообще мжно не смотреть, где начинается магия я выделил коментом ;=====. суть в том, что я читаю сектор с сидюка, от туда беру четыре байта инфы (размер корневого каталога) и ложу их в две переменные. затем я хочу использовать эту инфу и хренакс у меня уже там нули, заместо 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 |
Автор: | phantom-84 [ 12 мар 2013, 17:41 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Трудно понять. Заметил только, что ты не инициализируешь ss. Еще лучше контролировать местоположение процедуры load_C, чтобы она не пересеклась с адресом 8000h. Не увидел терминаторов у строк load1/2. Кстати в загрузчиках для вывода обычно используют функцию BIOS 0Eh. Много лишнего для "стороннего наблюдателя". По сути у тебя не получается прочитать сектор с известным номером и сохранить часть данных из буфера чтения в отдельной переменной. Сразу возникает такой вопрос: "Ты уверен, что нужный сектор был прочитан корректно?" |
Автор: | pavia [ 12 мар 2013, 17:47 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Если есть бинарник(iso или img или ima) могу быстро отладить. |
Автор: | Fatal_Error [ 12 мар 2013, 18:25 ] | ||
Заголовок сообщения: | Re: что-то (или кто-то) трет память | ||
phantom-84 писал(а): Еще лучше контролировать местоположение процедуры load_C, чтобы она не пересеклась с адресом 8000h. а зачем? она либо нужна для загрузки с диска С, либо вообще не нужна. Код: Не увидел терминаторов у строк load1/2. Кстати в загрузчиках для вывода обычно используют функцию BIOS 0Eh. что за терминаторы? Код: По сути у тебя не получается прочитать сектор с известным номером и сохранить часть данных из буфера чтения в отдельной переменной. Сразу возникает такой вопрос: "Ты уверен, что нужный сектор был прочитан корректно?" нет, сектор прочитать удается, а вот переменные магическим образом чем-то затираются... процедура debug выводит то что лежит в сегменте gs, а там как раз считанные данные (смотрел через хекс эдитор и то что выводила прока дебаг, байты точь в точь равны). суть в том, что в переменные сохраняется длинна каталога, затем в процедуре дебаг я вывожу дамп каталога по строкам из 16 байт. чтобы узнать кол-во строк я делю размер на 16. как-то так.... Цитата: Если есть бинарник(iso или img или ima) могу быстро отладить. конечно есть, но бош умирает после расширенного чтения сидюка. или ты не бошем собрался делать? PS: поменяй расширение на исо, это не архив
|
Автор: | Himik [ 12 мар 2013, 18:46 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Если у тебя бош умирает после расширенного чтения сидюка, значит ты что-то делаешь неправильно. В боше всё читается 100%. |
Автор: | phantom-84 [ 12 мар 2013, 19:30 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Fatal_Error писал(а): а зачем? она либо нужна для загрузки с диска С, либо вообще не нужна. Если со временем эта процедура сдвинется в район адреса 8000h, то твой код переноса на этот адрес может вызвать ошибку.Цитата: что за терминаторы? Нолики после строк. Если они конечно нужны.Цитата: нет, сектор прочитать удается, а вот переменные магическим образом чем-то затираются... процедура debug выводит то что лежит в сегменте gs, а там как раз считанные данные (смотрел через хекс эдитор и то что выводила прока дебаг, байты точь в точь равны). суть в том, что в переменные сохраняется длинна каталога, затем в процедуре дебаг я вывожу дамп каталога по строкам из 16 байт. чтобы узнать кол-во строк я делю размер на 16. как-то так.... Стек на всякий случай подправь, а то еще и не на такие чудеса насмотришься.Himik писал(а): Если у тебя бош умирает после расширенного чтения сидюка, значит ты что-то делаешь неправильно. В боше всё читается 100%. +1. Я на васме тоже самое написал.
|
Автор: | Fatal_Error [ 12 мар 2013, 21:25 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Цитата: Если со временем эта процедура сдвинется в район адреса 8000h, то твой код переноса на этот адрес может вызвать ошибку. нет, эта процедура сдвинется в 8000h только в одном случае - если указать загрузку с диска С. если выбрать пункс "загрузить мою ось", то эта процедура вообще ничего не делает, кроме как место занимает. |
Автор: | phantom-84 [ 12 мар 2013, 21:40 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
Ты не понял. Я имел в виду, что со временем местоположение этой процедуры в теле загрузчика может измениться так, что она будет лежать в районе адреса 8000h. Кстати если этот код специально разместить выше адреса 7E00h, то его можно вообще не перемещать программным путем. Еще чтобы обойти загрузку с текущего диска, можно использовать int 18h. |
Автор: | Fatal_Error [ 12 мар 2013, 22:07 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
да и пускай смещается что мне с этого? я ведь его всего раз заюзаю) да и это черновой вариант, криворуко-кривоного написанный "лишь бы работал" а с инт18 у меня биос всегда ошибку дает и вешает систему |
Автор: | Fatal_Error [ 12 мар 2013, 22:16 ] |
Заголовок сообщения: | Re: что-то (или кто-то) трет память |
не. ну это точно шаманизм какой-то... заделал так Код: 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, а толку нуль... все затирается... что за бред такой? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |