Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 19:19   #1
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
Восклицание Предел адресации Int13h 42h

Здравствуйте.
Пишу загрузчик, пока на первой стадии, разбираюсь с прерыванием Int 13.
И кажется, обнаружил одну особенность - он не может читать в буффер памяти с большим адресом. Вот, хотел спросить, это я напортачил или правда такая беда имеет место быть?
Ниже привожу код. Он делает следующее: преводит проц в анрил-режим, читает самый первый сектор в память - если удачно, то выводит смайлик, если неудачно, то зацикливается.

Код:


org 8000h

;*******************************************************
;	Переход в нереальный режим
;*******************************************************
go:   
   mov	[DriveNo], dl     ; сохраняем номер диска с которого грузанулись
   xor ax, ax             ; обнуляем
   mov ds, ax             ; DS=0
   mov ss, ax             ; стек начинается at seg 0
   mov sp, 0xC000         ; 4000h от начала кода 
                          ; делаем стек размером 16k 
 
   cli                    ; запрещаем прерывания
   push ds                ; сохраняем реальный режим
 
   lgdt [gdtinfo]         ; грузим gdt регистр
 
   mov  eax, cr0          ; переходим в защищёнку
   or al,1                ; установив pmode бит
   mov  cr0, eax
 
   mov  bx, 0x08          ; выбераем дескриптор 1
   mov  ds, bx            ; 8h = 1000b
 
   and al,0xFE            ; возвращаемся в реальный режим
   mov  cr0, eax          ; by toggling bit again
 
   pop ds                 ; возвращаем старый сегмент
   sti
;*******************************************************
;	Читаем и грузим в память ядро, дрова и DLLки
;******************************************************* 
                          ;Чтение через BIOS секторов
        mov ah,42h                ; номер функции
        mov	dl, [DriveNo]               ; drive index (e.g. 1st HDD = 80h)
        mov si,_packet                ; DS:SI    segment:offset pointer to the DAP(Disk Address Packet)
        int 13h                                              ; в DS:SI указатель на нашу структуру Пакета Диского Адреса

        jc _error_bios_ext            ; Проверка успешности:
        cmp ah,0                     ;    CF - сброшен, AH - код возврата
        jne _error_bios_ext

        jmp RM                ;если нормально прочиталось прыгаем на только что загруженное

_error_bios_ext:
        jmp $                                         ; у меня при ошибке - зацикливается


RM:
   mov bx, 0x0f01         ; attrib/char of smiley
   mov eax, 0x0b8000      ; note 32 bit offset
   mov word [ds:eax], bx
 
   jmp $                  ; loop forever



	
;*******************************************************
;	Data Section
;*******************************************************
                            ; DAP : Disk Address Packet
_packet    db    16                    ; Размер структуры = 16 байт
        db    0                ; всегда равно 0
        dw    1                ; Число секторов для чтения (не больше 127)
        dw    120000h,0            ; segment:offset pointer на память КУДА читать
        dq    0                    ; номер первого сектора для чтения (отсчет с 0) в LBA
                                                                      
 

		

LoadingMsg db 0x0D, 0x0A, "Searching for Operating System...", 0x00
DriveNo		resb 1			; CD-ROM BIOS drive number

gdtinfo:
   dw gdt_end - gdt - 1   ;последний байт в таблице
   dd gdt                 ;начало таблицы
 
gdt         dd 0,0        ; entry 0 is always unused
flatdesc    db 0xff, 0xff, 0, 0, 0, 10010010b, 11001111b, 0
gdt_end:    db 0x0
Спасибо

PS

Вот в
dw 120000h,0 ; segmentffset pointer на память КУДА читать
120000h - не хочет читать

а в 12000h - читает...

Последний раз редактировалось Celestia; 20.02.2011 в 19:28.
Celestia вне форума Ответить с цитированием
Старый 20.02.2011, 19:49   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

тип dw может быть только в пределах 0-ffffh
даже когда пишете 12000h - программа читает совсем не в этот адрес. Скорей всего в 2000h (обрезается старший разряд числа), а при 120000h это даст 0.
По адресу 0:0 в реальном режиме находится таблица векторов прерываний. В лучшем случает такая попытка вызовет ошибку, в худшем - зависание или перезагрузку.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 20.02.2011, 20:03   #3
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию

Спасибо большое) Значит как мне получается надо оформить пакет чтобы читать как надо?
Celestia вне форума Ответить с цитированием
Старый 20.02.2011, 20:07   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

читайте в первый метр памяти, а потом копируйте куда надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.11.2011, 09:38   #5
Станислав1
http://www.asmcode
Пользователь
 
Регистрация: 16.11.2011
Сообщений: 15
По умолчанию

Если сталкивались из этого же подскажите почему не читается сектор
с флешки. Слово Helo пишется, код на фасме

use16
org 07C00h

mov ah,42h
mov dl,80h
mov si,lba
int 13h ;прерывание


mov ah,14
mov bx,H
mov al,[bx]
int 10h
inc bx
mov al,[bx]
int 10h
inc bx
mov al,[bx]
int 10h
inc bx
mov al,[bx]
int 10h

jmp 0000:8600h

ret

H db 'Helo'

lba db 10h
db 00h
dw 0001h
dd 00008600h
dq 0000000000000002h
rb 510-($-7c00h)
db 0x55, 0xAA
Станислав1 вне форума Ответить с цитированием
Старый 16.11.2011, 20:00   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кросс постинг не в почете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Int13h 42h CDROM Read = ? Celestia Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 20.02.2011 18:15
Порты 42H, 43H, 61H Strogg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 20.03.2009 18:24
Вычислить предел последовательности Dartchuwak Паскаль, Turbo Pascal, PascalABC.NET 3 08.01.2009 21:21
байт режима адресации fermat_c Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.04.2008 15:39