交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
9 磁盘读取
分享
未结
0
2684
李延
LV6
2022-06-30
悬赏:20积分
# 1 读取逻辑 关于磁盘的读取共占用 端口 0x1f0 到 0x1f7 其中: - 0x1f2 表示需要读取的扇区数 - 0x1f3-0x1f6 表示28位读取扇区号 - 0x1f6 低 4位 扇区号,高4位表示如下: -  - 0x1f7 传入值: 0x20 读取磁盘 - 之后通过读取0x1f7端口判断磁盘是否可以读取 -  - 数据通过0x1f0 加载 # 2 代码 我们手动创建一个txt文件,将它写入到第100号扇区,之后读取这个扇区的内容,并打印在屏幕上,具体代码如下: ```asm .code16 .global _start .equ BOOTSEG, 0x07c0 # original address of boot-sector .equ GRAPHICS_INDEX, 0x3d4 # original address of boot-sector .equ GRAPHICS_READ, 0x3d5 # original address of boot-sector _start: mov $BOOTSEG,%ax mov %ax,%ss mov %ax,%ds mov $0x9000,%sp # 读取100号扇区数据到内存7f00处 mov $100,%si #读取100号扇区 mov $0,%di #读取100号扇区 mov $0x300,%bx # 读到7c00+300处内存 mov $1,%ax # 读取1个扇区 call read_hard_disk movw $0x300,%bx .print_loop: ## 传输打印的字符 movw (%bx),%cx call put_char inc %bx ## 当字符位\0的时候跳出循环 cmp $0,(%bx) jne .print_loop ret read_hard_disk: push %ax push %bx push %cx push %dx push %si movw $0x1f2 ,%dx out %al,%dx inc %dx movw %si,%ax out %al,%dx inc %dx movb %ah,%al out %al,%dx inc %dx movw %di,%ax out %al,%dx inc %dx movb $0xe0,%al #LBA28模式,主盘 or %ah,%al #LBA地址27~24 out %al,%dx inc %dx movb $0x20,%al # 读命令 out %al,%dx .waits: in %dx,%al and $0x88,%al cmp $0x08,%al jnz .waits mov $256,%ecx mov $0x01f0,%dx .readw: in %dx,%ax movw %ax,(%bx) add $2,%bx loop .readw pop %si pop %dx pop %cx pop %bx pop %ax ret load_cursor: pushw %bx pushw %dx movw $GRAPHICS_INDEX,%dx movb $0x0e,%al out %al,%dx movw $GRAPHICS_READ,%dx in %dx,%al mov %al,%ah movw $GRAPHICS_INDEX,%dx movb $0x0f,%al out %al,%dx movw $GRAPHICS_READ,%dx in %dx,%al popw %dx popw %bx ret set_cursor: pushw %ax pushw %bx pushw %dx movw %ax,%bx movw $GRAPHICS_INDEX,%dx movb $0x0e,%al out %al,%dx movw $GRAPHICS_READ,%dx movb %bh,%al out %al,%dx mov %al,%ah movw $GRAPHICS_INDEX,%dx movb $0x0f,%al out %al,%dx movw $GRAPHICS_READ,%dx movb %bl,%al out %al,%dx popw %dx popw %bx popw %ax ret # 打印一个字符 # ax 光标位置 , cl 需要打印的字符 put_char: pushw %ax pushw %bp pushw %es call load_cursor movw %ax,%bp movw $0xb800,%ax movw %ax,%es shl $1,%bp movb %cl,%es:(%bp) shr $1,%bp inc %bp movw %bp,%ax call set_cursor popw %es popw %bp popw %ax ret msg1: .string "hello word!!!!!!!!!!!\0" .org 510 boot_flag: .word 0xAA55 ``` # 3 数据准备 除了我们编译后的代码,还需要准备一个文件,将它写入在第100个扇区,  其中内容为:  之后运行虚拟机看到: 
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号