系统开发1 读取硬盘数据

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值