如何编一个可以以用软盘引导启动的程序??

zhuzhu830829 2002-01-30 12:20:06
...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
adaptor85 2002-02-02
  • 打赏
  • 举报
回复
tasm boot.asm
tlink boot.asm
debug boot.exe
-n boot.bin
-r cx
:200
-w cs:7c00
-q
debug boot.bin
-w 100 0 0 1
zhuzhu830829 2002-02-01
  • 打赏
  • 举报
回复
如何编译?
adaptor85 2002-01-31
  • 打赏
  • 举报
回复
补充,我把“操作系统”理解为你自己编的OS,不知是否正确。

我编程向来图省事,此程序,我没有考虑FAT的存在,假定了Kernel的存放位置,并且Kernel是EXE格式,如果你要启动依靠FAT的Kernel,你还是找一本专门讲MS-DOS启动的书吧,应该有对FAT表的处理。
adaptor85 2002-01-31
  • 打赏
  • 举报
回复

本人写程序不喜欢加注释,所以有些部分自己都忘了是干什么的了。请你自己分析吧!



;Boot

diskpara equ 1Eh*4

KernelLoad equ 80h
HeadLoad equ 60h
HeadOffset equ 3eh
CSOffset equ 16h
IPOffset equ 14h
SectorsOffset equ 04h

cseg segment byte public
assume cs:cseg,ds:cseg
org 7c00h

Head:

KernelBoot proc far

Start:

jmp short Begin
db 90h
KernelID db 'OSKernel'
SecInByte dw 0200h
SecPerClr db 01h
ResClr dw 0001h
Dummy1 db 00h
Dummy2 dw 0000h
TotalSec dw 0b40h ;0 for Extend
FormatId db 0f0h
SecPerFat dw 0002h
SecPerTrk dw 0012h
Sides dw 0002h
HSector dw 0000h
db 2 dup(0)
DiskParaFix db 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h
KernelTrack db 00h
KernelHeadNo db 00h
KernelSecNo db 03h

Begin:
cli
cld
xor ax,ax
mov ss,ax
mov sp,7c00h
lds si,dword ptr ss:diskpara
push ds
push si
mov es,ax
lea di,DiskParaFix
mov cx,0bh
FixParam:
lodsb
cmp byte ptr es:[di],0
je DoNotCare
mov al,es:[di]
DoNotCare:
stosb
loop FixParam
xor ax,ax
mov ds,ax
mov word ptr ds:diskpara+2,ax
mov word ptr ds:diskpara,7c20h
sti
int 13h
jnc Success

ErrEntry:

Success:

mov ax,0
mov ds,ax
mov si,offset BootMsg
mov bl,0
call printstr

mov ax,HeadLoad
mov es,ax
mov al,1
mov bx,0
mov ch,HeadTrack
mov cl,HeadSecNo
mov dh,HeadHeadNo
mov dl,0
mov ah,02h
int 13h


mov ax,HeadLoad
mov es,ax
mov di,SectorsOffset
mov ax,word ptr es:[di]
dec ax
mov DataRemained,ax


mov ax,KernelLoad
mov es,ax
mov ch,KernelTrack
mov cl,KernelSecNo
mov dh,KernelHeadNo

inc SecPerTrk

ReadKnl:
mov al,1
mov dl,0
mov ah,02h
mov bx,0
push ax
push bx
push cx
push dx
push es
int 13h
pop es
pop dx
pop cx
pop bx
pop ax
clc
mov ax,DataRemained
dec ax
jz ProcessKnl
mov DataRemained,ax

mov ax,es
add ax,20h
mov es,ax
add cl,1
clc
cmp cl,byte ptr SecPerTrk
jne Cont
add dh,1
cmp dh,2
jne Cont1
mov dh,0
add ch,1
Cont1:
mov cl,1
Cont:
jmp ReadKnl

ProcessKnl:

mov ax,HeadLoad
mov es,ax
mov di,HeadOffset
SetupKnl:
mov cx,es:[di]
mov bx,es:[di+2]
mov ax,bx
add ax,cx
cmp ax,0
je RunKnl
add bx,KernelLoad
mov ds,bx
mov si,cx
add word ptr ds:[si],KernelLoad
add di,4
jmp SetupKnl

RunKnl:

mov ax,HeadLoad
mov ss,ax
mov sp,200h

mov ax,HeadLoad
mov es,ax
mov si,CSOffset
mov ax,es:[si]
add ax,KernelLoad
mov si,IPOffset
mov bx,es:[si]

push ax
push bx
retf


printstr proc
push ax
push bx
push cx
push dx
push si
pslb1:
cmp byte ptr ds:[si],bl
je pslb2
mov ah,0eh
mov al,byte ptr ds:[si]
push bx
int 10h
pop bx
inc si
jmp pslb1
pslb2:
pop si
pop dx
pop cx
pop bx
pop ax
ret
printstr endp



HeadTrack db 00h
HeadHeadNo db 00h
HeadSecNo db 02h
DataRemained dw 0h

BootMsg db 0ah,0dh,'Loading...',0ah,0dh,0

Tail:

Filler_Amount equ 512-(Tail-Head)-2
db Filler_Amount dup (0)
BootID db 55h,0aah

KernelBoot endp

cseg ends
end Start
zhuzhu830829 2002-01-30
  • 打赏
  • 举报
回复
操作系统
adaptor85 2002-01-30
  • 打赏
  • 举报
回复
你要启动什么呢?不是你编的程序吧.

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧