06-07-08 - 突破512字节的限制

news2024/11/15 11:18:23

---- 整理自狄泰软件唐佐林老师课程

1. 突破限制的准备工作

  • 辅助函数
    • 字符串打印
    • 软盘读取
    • 内存比较
    • 根目录区查找

1.1 字符串打印

问题:

  • 主引导程序中如何进行字符串的打印?

1.1.1 BIOS中的字符串打印

指定打印参数(AX = 0x1301,BX = 0x0007)
指定打印字符串的内存地址(ES:BP = 串地址)
指定字符串的长度(CX = 串长度)
中断调用(int 0x10)
  • 字符串打印示例
; 指定字符串地址
mov ax, msg
mov bp, ax
mov ax, ds
mov es, ax

; 指定字符串长度
mov cx, 6

; 指定打印参数
mov ax, 0x1301
mov bx, 0x0007

; 中断调用
int 0x10

1.1.2 汇编小贴士

  • 汇编中可以定义 函数(函数名使用标签定义)
    • call function
    • 函数体的最后一条指令为 ret
  • 如果代码中定义了函数,那么需要定义 栈空间
    • 用于保存关键寄存器的值
    • 栈顶地址通过 sp寄存器 保存
  • 汇编中的 “常量定义”(equ
    • 用法:CHANGLIANG equ 0x7c00 ; #define CHANGLIANG 0x7c00
    • 与(db,dw,dd)的区别:
      • dx 定义 会占用 相应的内存空间
      • equ 定义 不会占用 任何内存空间

1.1.3 编程实验:定义打印函数print

  • print
    【参看链接】:06-07-08 - 突破512字节的限制 / 06 / 00print

只打印6个字符:
在这里插入图片描述

  • print2

在这里插入图片描述
在这里插入图片描述

【参看链接】:06-07-08 - 突破512字节的限制 / 06 / 01print2

在这里插入图片描述

1.2 软盘读取

问题:

  • 主引导程序中如何读取指定扇区处的数据?

1.2.1 软盘的构造

  • 一个软盘有 2个盘面,每个盘面对应 1个磁头
  • 每一个盘面 被划分为若干个圆圈,成为 若干个柱面(磁道)
  • 每一个柱面 被划分为 若干个扇区,每个扇区512字节

在这里插入图片描述

  • 3.5寸软盘 的数据特性
    • 每一个盘面一共有80个柱面(编号0~79)
    • 每一个柱面有18个扇区(编号1~18)
    • 存储大小:2 * 80 * 18 * 512Byte = 1440 KB
1张软盘2个盘面编号0~1
1个盘面80个柱面(磁道)编号0~79
1个柱面18个扇区编号1~18
1个扇区512字节

1.2.2 软盘数据的读取

  • 软盘数据以扇区(512字节)为单位进行读取
  • 指定数据所在位置的磁头号(哪个盘面) 、柱面号、扇区号
  • 计算公式:逻辑扇区号(相对扇区号)/ 柱面扇区数

在这里插入图片描述

1.2.3 BIOS中的软盘数据读取(int 0x13)

在这里插入图片描述

注:

  • 执行:锁定/解锁驱动器
  • 输入:
    DL = 驱动器号
    AL = 00h 锁定驱动器
    AL = 01h 驱动器解锁
    AL = 02h 返回锁定/解锁状态
    AL = 03h-FFh 保留
  • 返回:
    CF = 0, AH = 0 成功
    CF = 1, AH = 错误码
  • 这个调用用来锁定指定驱动器中的介质

1.2.4 软盘数据读取流程

==> 指定逻辑扇区号AX、指定读取扇区数CX
==> 指定内存位置(ES:BX)
==> 重置软驱状态
==> 根据逻辑扇区号计算:柱面号、磁头号、扇区号
==> int 0x13
==> ret

在这里插入图片描述

1.2.5 汇编小贴士

  • 汇编中的16位除法操作 div
    • 被除数放到AX寄存器
    • 除数放到通用寄存器或内存单元(8位)
    • 结果:商位于AL,余数位于AH
      • 被除数 ➗ 除数 = 商 ...... 余数
      • AX ➗ 通用reg或内存单元 = AL ...... AH

1.2.6 编程实验:磁盘数据的读取

【参看链接】:06-07-08 - 突破512字节的限制 / 06 / 02read

在这里插入图片描述

在这里插入图片描述

1.3 内存比较

在这里插入图片描述

1.3.1 整体思路

FAT12文件格式数据区
根目录区
FAT2
FAT1
引导扇区

在这里插入图片描述

问题:

  • 如何在根目录区查找目标文件?
  • 通过根目录区中的 目录项的前11个字节(DIR_Name进行判断

在这里插入图片描述

1.3.2 内存内容比较

指定源起始地址(DS:SI)
指定目标起始地址(ES:DI)
判断在期望长度(CX)内每一个字节是否相等

在这里插入图片描述

1.3.3 汇编小贴士

  • 汇编中的比较和跳转
    • 比较:cmp cx, 0 ; 比较cx的值是否等于0
    • 跳转:jz equal ; 如果比较结果为真,则跳转到equal标签处

在这里插入图片描述

1.3.4 编程实验:内存比较函数

【参看链接】:06-07-08 - 突破512字节的限制 / 07 / 00mem_cmp

在这里插入图片描述

1.4 根目录区查找

查找根目录区是否存在目标文件
在这里插入图片描述

1.4.1 汇编小贴士

  • 访问栈空间中的栈顶数据
    • 不能使用 sp 直接访问栈顶数据
      • 这是错误的:mov cx, [sp]
    • 通过其它 通用寄存器 间接访问栈顶数据
push  cx
mov  bp, sp
mov  cx, [bp]

1.4.2 编程实验:根目录区查找函数

【参看链接】:06-07-08 - 突破512字节的限制 / 07 / 01find_entry

  1. 直接通过makefile中生成的data.img中没有loader,所以找不到,结果如下:
    在这里插入图片描述
    为什么没有找到loader?反汇编调试确认:
    ndisasm -o 0x7c00 boot.bin > boot.txt
    在这里插入图片描述
    在这里插入图片描述
  2. 根据前面章节《04-05 - 主引导程序的扩展》,在data.img中写入Loader.bin文件,则可以找到:
    在这里插入图片描述

1.5 备份目标文件的目录信息(内存拷贝)

在这里插入图片描述

1.5.1 MemCpy实现要点:拷贝方向

问题:

  • 从源内存地址处拷贝到目标内存地址处即可,但如果 地址出现重叠 ?如下情况:
    在这里插入图片描述

1.5.2 汇编小贴士

在这里插入图片描述

如果si大于di,就跳转到btoe标签处执行。

1.5.3 编程实验:内存拷贝函数

  • 无重叠

【参看链接】:06-07-08 - 突破512字节的限制 / 08 / 00mem_cpy

  • 有重叠 si < di,从头部开始拷贝

【参看链接】:06-07-08 - 突破512字节的限制 / 08 / 00mem_cpy2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 有重叠 si > di,从尾部开始拷贝

【参看链接】:06-07-08 - 突破512字节的限制 / 08 / 00mem_cpy3

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.6 FAT表项的读取

FAT表中的 每个表项占用 1.5字节,即:使用3个字节表示2个表项
在这里插入图片描述

1.6.1 FAT表项的“动态组装”

在这里插入图片描述

FatVec[j] 的动态组装:
在这里插入图片描述
在这里插入图片描述

1.6.2 汇编小贴士

  • 汇编中的16位乘法操作( mul
    • 被乘数放到AL寄存器
    • 乘数放到通用寄存器或内存单元(8位)
    • 相乘的结果放到AX寄存器中
      • 被乘数 × 乘数 = 积
      • AL × 通用reg或内存单元 = AX

1.6.3 编程实验:FAT项读取函数

【参看链接】:06-07-08 - 突破512字节的限制 / 08 / 01FatVec

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.7 小结

  • 内存拷贝时需要考虑进行拷贝的方向
    • 当 si > di 时,从前向后拷贝
    • 当 si <= di 时,从后向前拷贝
  • Fat表加载到内存中之后,需要 “ 动态组装 ” 表项
    • Fat表中使用3个字节表示2个表项
    • 起始字节 = 表项下标 / 2 * 3 ==> (这里先3个3个的算出起始字节,再判断除以2的奇偶,然后用公式算出Fat表项)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web大学生网页作业成品:个人博客主页 (纯HTML+CSS代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

HUST编译原理实验2

语法分析&#xff0c;建立并显示语法树 以识别 a 10.01; 为例&#xff0c;阐述语法分析的构造过程 1. 建立AST储存结构 由a 10.01得知&#xff0c;语法构成为: SentenceList->Sentence->Exp SEMI->ID ASSIGNOP FLOAT SEMI因此&#xff0c;需要储存结构如下 typ…

Java数据结构与Java算法学习Day10---图的了解和无向图(简略笔记记录)

目录 1.1图的定义及分类 142 1.2无向图 143 1.2.1图的相关术语 143 1.2.2无向图的存储结构 144 1.3图的API设计 145 1.4图的搜索 146 1.4.1深度优先搜索 146 1.4.2深度优先搜索API设计 147 1.5广度优先搜素 149 1.5.1广度优先搜索API设计及代码实现 150 1.5.2广度…

QT 系统学习 day04 事件(鼠标,键盘), UDP 通信, TCP 通信,多个定时器,重写绘画事件

1. 事件 (有 键盘按下&#xff0c; 鼠标按下&#xff0c; 鼠标双击等) 1.重写键盘按下事件&#xff0c; 函数&#xff1a; void keyPressEvent(QKeyEvent *event) /*** 按键按下事件 ***/ 代码&#xff1a; void keyPressEvent(QKeyEvent *event) /*** 按键按下事件 ***/{q…

【吴恩达机器学习笔记】十五、大规模机器学习

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

低代码开发平台——体验系统的重要性

什么是优秀的体验&#xff1f; 简而言之&#xff0c;优质的体验意味着可以随时随地根据客户的需求提供服务&#xff0c;这在数字化的世界中&#xff0c;意味着真正的多重体验。Gartner早在2018年就定义了MXDP&#xff08;多体验开发平台&#xff09;&#xff0c;以应对我们日常…

游戏开发38课 unity 模板测试

ShaderLab 命令&#xff1a;模板 配置与 GPU 上的模板缓冲区相关的设置。 模板缓冲区为帧缓冲区中的每个像素存储一个 8 位整数值。为给定像素执行片元着色器之前&#xff0c;GPU 可以将模板缓冲区中的当前值与给定参考值进行比较。这称为模板测试。如果模板测试通过&#xff…

liunx如何重启mysql

Linux如何重启MySQL Linux中重启MySQL可以使用service mysql restart命令和脚本启动方式/etc/inint.d/mysql restart。 推荐&#xff1a;MySQL教程 其他命令如下&#xff1a; 一、 启动 1、使用 service 启动&#xff1a;service mysql start 2、使用 mysqld 脚本启动&am…

使用redis做分布式锁

思路步骤 获取锁, 使用 SETNX 命令设置一个key.如果没获取到&#xff0c;从新拿锁&#xff0c;返回步骤1 ; 从新拿锁可以设置等待时间;也可以记录拿锁次数为了做“避免死循环”.如果获取到&#xff0c;使用 EXPIRE 给锁加存活时间&#xff1b;接步骤3&#xff0c;执行业务&…

微机----------------中断控制器8259A(可编程的中断控制器)

目录 功能8259A的引脚8259A的工作方式中断响应顺序8259A的中断优先级管理8259A中断屏蔽管理⭐8259A的中断结束管理功能 ①单片825能管理8级中断,并且可级联管理64级 ②可对任一级中断单独屏蔽或允许 ③中断被响应后,可直接提供中断类型号 ④可通过编程选择其工作方式 IRR中断…

C++入门篇

入门C命名空间命名空间定义命名空间的使用C输入&#xff0c;输出缺省参数缺省参数概念缺省参数分类函数重载函数重载概念C支持函数重载的原因引用引用概念引用特性具体应用const修饰的常量进行引用&#xff08;常引用&#xff09;传值&#xff0c;传引用的效率引用和指针的区别…

【无标题】3 GENERIC语句 和 INTEGER类型

【VHDL】【作业】3 GENERIC语句 和 INTEGER类型 文章目录【VHDL】【作业】3 GENERIC语句 和 INTEGER类型前言什么是GENERIC语句&#xff1f;32位加法器仿真波形总结每天进步一点点 笔记仅供自学&#xff0c;用来回看复习&#xff0c;不一定适合你&#xff0c;如有错误请指出。前…

SpringBoot:概述

Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;开发者能快速上手。 &#xff5e; 本篇内容包括&#xff1a;Spring Boo…

[选型] 实时数仓之技术选型

数仓技术路线选型 对于已有的hive数据仓&#xff0c;怎样改造成实时数仓的要求呢&#xff1f; 2.关于实时数仓的选型 如果选择hbase&#xff0c;建议选择kudu 如果选择kudu, 还可以选择doris 如果选择doris&#xff0c;建议选择iceberg 以上三种选择&#xff0c;要配合具体…

C++实现身份证号码过滤与排序

1.描述 警察办案里检索到一批(n个)身份证号码&#xff0c;希望按出生日期对它们进行从大到小排序&#xff0c;如果有相同日期&#xff0c;则按身份证号码大小进行排序&#xff0c;如果是错误的身份证号&#xff0c;则从排序列表中删除(仅需判断前两位省级地区编码是否在下面的…

知识图谱-KGE-语义匹配-双线性模型-2016:NAM

【paper】 Probabilistic Reasoning via Deep Learning: Neural Association Models【简介】 本文是中科大和科大讯飞联合发表在 IJCAI 2016 上的工作&#xff0c;本文提出了 NAM&#xff08;Neural Association Model&#xff09;用于概率推理&#xff0c;并具体化为 DNN&…

十二月7号

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 boot:引导 loader&#xff1a;加载 2.uboot是引导加载程序中的一种 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X8…

Blazor 部署 pdf.js 不能正确显示中文资源解决办法

原文链接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor项目嵌入 pdf.js 时不能正确显示中文,浏览器F12显示如下错误 错误 l10n.js /web/locale/locale.properties not found. 我找到了解决方案。它不仅消除了上面提到的错误&#xff08;即 404 - locale.p…

nextjs13 webpack5 使用wasm报错

问题描述&#xff1a; 在next 13, webpack 5, react 18的项目中使用Rust编写的wasm报错&#xff1a; ./node_modules/image-map-path/image_map_path_bg.wasm Module parse failed: Unexpected character (1:0) The module seem to be a WebAssembly module, but module is n…

freemarker

文章目录创建项目引入依赖创建配置文件创建启动类和测试类语法listMapif运算符处理空值使用??指定缺失变量默认值内建函数集合长度数据类型布尔值时间类型数值类型字符串类型sequence序列类型hash类型常见指令assign自定义变量指令json转成对象实例list通过下标取值map取值通…