org 0x7c00
jmp start
msg db 0x0d,0x0a
db 'load finsh!'
db 0
start:
mov ax,cs
mov ss,ax
mov sp,0x7c00
;设置读入扇区的段
mov ax,0x0820
mov ds,ax
xor ebx,ebx
xor eax,eax
mov eax,1
;进行硬盘的读取
mov cx,0x167 ;读入180K从1扇区开始 读入359个扇区
read_hard:
call read_hard_disk_0
inc eax ;下一个扇区
loop read_hard
;设置数据段
mov ax,cs
mov ds,ax
;输出成功的字符串
mov si,msg
call put_string
hlt
;======================================================
;输出字符串
;输入: ds:si=输出的字符地址
put_string:
mov bx,0x0004 ;bh=页码 bl=属性
mov ah,0x0e ;ah=功能号
mov al,[si] ;al=输出的字符
or al,al
jz exit
int 0x10
inc si
jmp put_string
exit:
ret
;=======================================================
;输入: eax=开始的扇区
; ds:bx=写入到的地址
;读入磁盘中的数据
read_hard_disk_0:
push eax
push ecx
push edx
push eax
mov dx,0x1f2
mov al,1 ;每次读入的扇区数
out dx,al
pop eax
inc dx ;0x1f3
out dx,al
inc dx ;0x1f4
mov al,ah
out dx,al
inc dx ;0x1f5
shr eax,16
out dx,al
inc dx ;0x1f6
mov al,ah
or al, 0xe0
out dx,al
;发出读的命令
inc dx ;0x1f7
mov al,0x20
out dx,al
;查看状态,忙泽等待
waits:
in al,dx
and al,0x88
cmp al,0x08
jnz waits
;开始读取
mov cx,256
mov dx,0x1f0
read_0:
in ax,dx
mov [ebx],ax
add ebx,2
loop read_0
pop edx
pop ecx
pop eax
ret
times 510-($-$$) db 0
dw 0xaa55
jmp start
msg db 0x0d,0x0a
db 'load finsh!'
db 0
start:
mov ax,cs
mov ss,ax
mov sp,0x7c00
;设置读入扇区的段
mov ax,0x0820
mov ds,ax
xor ebx,ebx
xor eax,eax
mov eax,1
;进行硬盘的读取
mov cx,0x167 ;读入180K从1扇区开始 读入359个扇区
read_hard:
call read_hard_disk_0
inc eax ;下一个扇区
loop read_hard
;设置数据段
mov ax,cs
mov ds,ax
;输出成功的字符串
mov si,msg
call put_string
hlt
;======================================================
;输出字符串
;输入: ds:si=输出的字符地址
put_string:
mov bx,0x0004 ;bh=页码 bl=属性
mov ah,0x0e ;ah=功能号
mov al,[si] ;al=输出的字符
or al,al
jz exit
int 0x10
inc si
jmp put_string
exit:
ret
;=======================================================
;输入: eax=开始的扇区
; ds:bx=写入到的地址
;读入磁盘中的数据
read_hard_disk_0:
push eax
push ecx
push edx
push eax
mov dx,0x1f2
mov al,1 ;每次读入的扇区数
out dx,al
pop eax
inc dx ;0x1f3
out dx,al
inc dx ;0x1f4
mov al,ah
out dx,al
inc dx ;0x1f5
shr eax,16
out dx,al
inc dx ;0x1f6
mov al,ah
or al, 0xe0
out dx,al
;发出读的命令
inc dx ;0x1f7
mov al,0x20
out dx,al
;查看状态,忙泽等待
waits:
in al,dx
and al,0x88
cmp al,0x08
jnz waits
;开始读取
mov cx,256
mov dx,0x1f0
read_0:
in ax,dx
mov [ebx],ax
add ebx,2
loop read_0
pop edx
pop ecx
pop eax
ret
times 510-($-$$) db 0
dw 0xaa55

被折叠的 条评论
为什么被折叠?



