Не могу прочитать сектор с CD-ROM в сборке x86

Я пытаюсь загрузить загрузчик второй ступени из загрузчика ISOSYS для моей операционной системы OS32, но не могу этого сделать. CF вроде всегда ставится. Это должно быть загружено с CD / DVD, и я использую Debian GNU / Linux 7.6 (Wheezy)

Вот isosys.asm:

;===============================================================
;
;               ISOSYS v1.0 in isosys.asm
;
; Program for booting OS32 and OS32-based systems from CD/DVDs
; using the ElTorito boot standard.
;
; By Omar, 2014
;
; ===============================================================

; set up bios...
bits 16
org 0x7c00

; beginning of sector 1, byte 0:

; jump over functions block
jmp Start

;
; Print()
;      prints a string to standard output
; AL = 0 : terminate
;

Print:
   lodsb            ; grab a byte from SI and place it in AL
   cmp al, 0         ; is AL = 0?
   jc PrintDone         ; yep, we're done so return
   mov ah, 0eh
   int 0x10         ; nope, print the character
   jmp Print         ; loop until no more characters to be printed
PrintDone:
   ret            ; return to wherever we were!

;
; Start()
;      bootloader entry point
;

Start:
   mov si, creditmsg
   call Print         ; print the first message
   mov dh, 1         ; read 1 sector

.ReadSector:
   cli            ; disable interrupts
   push dx            ; push this stack value
   sti            ; re-enable interrupts

   mov ax, 0x1000         ; read sector into address 0x1000
   xor bx, bx         ; read sector into offset 0x0
   mov ah, 0x02         ; read sector function
   mov al, dh         ; read 1 sector
   mov ch, 0x0         ; must be 0x0 to read sector
   mov dh, 0         ; reading head 0
   mov cl, 0x02         ; start reading from sector 2 to load the second stage

   mov [CDDriveNumber], dl      ; store our drive number is variable CDDriveNumber
   cli            ; disable interrupts
   pusha            ; save the stack
   sti            ; enable interrupts

   int 0x13         ; INT 13h
   jc Error         ; handle error because Carry Flag is set

   pop dx            ; Restore DX

.ExecuteSector:
   ; now that our sector was loaded into address 0x1000:0x0, let's execute it!
   jmp 0x1000:0x0         ; jump to execute the sector
;
; Error()
;      handles errors when carry is set
;

Error:
   mov si, errmsg
   call Print         ; print an error message

   cli            ; disable interrupts to prevent problems
   hlt            ; halt the system... :(

; data section

creditmsg db "ISOSYS v1.0 by Omar Mohammad, Init...", 0
errmsg db "Cannot load the second stage. (File not found maybe?)", 0
CDDriveNumber db 0

times 2048 - ($-$$) db 0      ; fill in 2048 bytes with zeroes

; end of sector 1! :D Any more code here would take bytes 2048 and 2049 but we don't    need that...

Это boot.asm, второй этап:

bits 16
org 0x1000

Main:
   xor bx, bx
   mov ah, 0eh
   mov al, 'A'
   int 0x10

   cli
   hlt

times 2048 - ($-$$) db 0

Я скомпилировал с nasm -f bin isosys.asm -o ISOSYS и nasm -f bin boot.asm -o BOOT Затем я сделал mkdir iso, затем cp ISOSYS iso/, затем cp BOOT iso/, а затем сгенерировал ISO: genisoimage -no-emul-boot -boot-load-size 4 -eltorito-boot ISOSYS -o boot.iso iso/

Я запускаю его в VirtualBox, но все, что он говорит, это «Невозможно загрузить второй этап (файл, возможно, не найден?)», Что означает, что установлен флаг переноса, но я не могу найти ошибку.

Кому-нибудь помочь? Помощь будет принята с благодарностью! : *


person Omar Mohammad    schedule 22.08.2014    source источник
comment
Я верю -no-emul-boot именно в очередь эмуляции диска, так что вы уже напортачили. Даже без этого, поскольку вы поместили свой BOOT в отдельный файл, он не будет доступен как второй сектор. Вы должны добавить его в ISOSYS и при необходимости использовать эмуляцию дискеты или жесткого диска.   -  person Jester    schedule 22.08.2014
comment
Спасибо, но не могли бы вы рассказать мне, как использовать эмуляцию дискеты с genisoimage в Linux? Спасибо :*   -  person Omar Mohammad    schedule 23.08.2014


Ответы (1)


Ваша обработка стека полностью отключена. Вы вставляете dx (почему?) Внутрь блока clisti (ПОЧЕМУ?), Затем pusha, но не popa.

Вам также не хватает mov es,ax после mov ax, 0x1000, чтобы фактически установить сегментный регистр туда, куда вы хотите, чтобы ваш код был загружен.

Вы не можете читать ISO с помощью функции CHS (AH = 02h), вы должны использовать функцию LBA (AH = 42h) с блоком параметров. Приведите пример. < / а>

person mirabilos    schedule 24.12.2014