x86 16-如何在程序集中添加多个扇区并从该扇区调用函数



F允许我在互联网的帮助下编写程序启动扇区的数量:有人请帮我

1.是否所有扇区都加载良好,如何正确加载所有扇区。

2.如何从第二跳到第三并返回

引导扇区:

   [bits 16]
[org 0x7c00]
cli
mov bx,cs
mov ds,bx
mov ss,bx
mov sp,0xfffe
mov ax,0 
mov es,ax
mov ax,0x6000
mov word [es:0],0
mov [es:2],ax
mov bx,0x6000
mov es,bx
mov bx,0
sti
mov ah,2 ;service
mov al,1 ;sector count
mov ch,0 ;cylinder
mov cl,2 ;sbector#
mov dh,0 ;head
mov dl,0
int 13h
jc error
;int 0h
mov bx,0
mov es,bx
mov bx,0h
jmp far[es:bx] 
error:
mov al,'E'
mov ah,0eh
mov bl,7
mov bh,0
int 10h
jmp $
k:
mov al,'F'
mov ah,0eh
mov bl,7
mov bh,0
int 10h
jmp $
times 510-($-$$) db 0
dw 0xAA55

扇区2:

    [bits 16]
SECTOR2:
mov bx,cs
mov ds,bx 
mov es,bx
mov ah,0eh
mov bl,7
mov bh,0 
int 10h
call SECTOR3
mov si,msg2
l:
cmp byte [si],0
je exit
mov al,[si]
int 10h
inc si
jmp l
exit:
jmp $
msg2 db "Sector 2 is loaded",0
times 512-($-$$) db 0

SECtor3:

     [bits 16]
SECTOR3:
mov bx,cs
mov ds,bx 
mov es,bx

     mov ah,0eh
mov bl,7
mov bh,0 
int 10h
 mov si,msg1
l2:
cmp byte [si],0
je exit3
mov al,[si]
int 10h
inc si
jmp l2
exit3:
retf 
; jmp $
msg1 db "Sector 3 is loaded",0
times 512-($-$$) db 0

首先:由于有大量可用内存,您不应该像以前那样滥用Divide by Zero Exception
但从更明亮的角度来看,你确实会在6000h:0000h加载第二个扇区,并将jmp far加载到它。可以在第二个扇形区内重复使用该方法,以在6000h2:000h加载第三个扇区,但这次使用call far跳到它。你的第三个扇形区在正确的位置有一个retf
因此,松开call SECTOR3,并在标签"exit:"处进行所有必要的修改以替换jmp $

最新更新