LINUX.ORG.RU

bootsect на NASM. Проблема с int 13h.


0

0

проблема с int 13h. Хочу прочитать с флопа 2-й сектор и загрузить всё в 0000h:09000h, а потом прыгнуть туда.


Вот bootsect.asm:


org 07C00h
main:
cli
mov ax,cs
mov ds,ax
mov ss,ax
mov sp,main
sti

mov si,msg
L:
lodsb
test al,al
jz exit
mov ah,0Eh
int 10h
jmp L

mov ax,00h
mov es,ax
mov ch,00h
mov ah,02h
mov bx,09000h
mov al,01h
mov cl,02h
mov dl,00h
mov dh,00h
int 13h

mov si,msg_sl
L1:
lodsb
test al,al
jz exit
mov ah,0Eh
int 10h
jmp L1

jmp 09000h

exit:
ret

msg: db "Starting bootsect",0Dh,0Ah,0Dh,00h
msg_sl: db "Jumping",0Dh,0Ah,0Dh,00h
times 510-($-$$) db 0
db 055h, 0AAh


А вот code.asm:


code:
mov sp,code
mov si,msg_c
S:
lodsb
test al,al
jz halt
mov ah,0Eh
int 10h
jmp S
halt:
cli
hlt

msg_c: db "code loaded", 0Dh, 00h


По тому же принципу хочу из code загрузить чистый бинарник после code. Но проблема в том, что загружается bootsect, а jumping уже не пишется.

★★

Дарю :))
Компилировал правда под fasm, но думаю, что nasm тоже прокатит.
Это один файл. Сначала идет 512 байт загрузчик, потом 512 байт кода. Бинарный образ могу бросить тебе на мыло, если хочешь.

start:

	mov 	ax, BOOTSEG
	mov     ds, ax
	mov	ax, INITSEG
	mov	es, ax
	mov	cx, 256
	xor	si, si
	xor	di, di
	rep
	movsw
	jmp	INITSEG:func

func:
	mov	di, 04000h - 12
	mov	ds, ax
	mov	ss, ax
	mov	sp, di


;clear screen
	mov	ah, 06
	mov	al, 0
	xor	cx, cx
	mov	dh, 24
	mov	dl, 79
	mov	bh, 7
	int 	10h


;print "Loading..."
	mov	bl, 22
	mov	bh, 0
	mov	cx, msg1_len
	mov	bp, msg1
	mov	dh, 0
	mov	dl, 0
	mov	ax, 01301h
	int	10h

;init disk subsystem
	xor	ax, ax
	xor	dx, dx
	int 	13h

;read 2-nd sector
	mov	ah, 02
	mov	al, 01
	mov	cx, 02
	mov	dx, 0
	mov	bx, 0200h
	int	13h

;print "Jumping..."
	mov	bl, 11
	mov	bh, 0
	mov	cx, msg2_len
	mov	bp, msg2
	mov	dh, 1
	mov	dl, 0
	mov	ax, 01301h
	int	10h

;jump to code
	jmp	CODESEG:0
	
	                      	



BOOTSIZE        =	512
CODESIZE	= 	512
INITSEG		=	09000h
BOOTSEG		=	07c0h
CODESEG		=	09020h

_msg1:
msg1	db	0dh, 0ah, "Loading...", 0dh, 0ah
msg1_len = $ - _msg1

_msg2:
msg2	db	0dh, 0ah, "Jumping...", 0dh, 0ah
msg2_len = $ - _msg2

times	BOOTSIZE - $	db	90h


my_code:
	mov	bl, 33
	mov	bh, 0
	mov	cx, msg3_len
	mov	bp, msg3
	mov	dh, 2
	mov	dl, 0
	mov	ax, 01301h
	int	10h

exit_loop:
	nop
	loop 	exit_loop


_msg3:
msg3	db	0dh, 0ah, "Code...", 0dh, 0ah
msg3_len = $ - _msg3

times	BOOTSIZE + CODESIZE - $		db	90h

UUUU
()
Ответ на: комментарий от UUUU

Изменил, убрал сообщения, откомпилил. Не работает. Дыже не пытается прочитать флоп, как и в моём коде.

drish ★★
() автор топика
Ответ на: комментарий от drish

Странно. У меня все работает. Могу бросить откомпилированный бинарник. Может проблема в дисководе? А сообщения на экран выводит?

UUUU
()
Ответ на: комментарий от UUUU

Дисковод нормальный. Я компилил другой пример на NASM'e, всё работало, но я хочу понять, что неправильно.

drish ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.