系统开发1 读取硬盘数据

来源:互联网 发布:淘宝哪些地方不包邮 编辑:程序博客网 时间:2024/06/05 16:42
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
0 0
原创粉丝点击