当前位置: 首页 > news >正文

使用BIOS进行键盘输入和磁盘读写03 - 零基础入门学习汇编语言77(完)

第十七章:使用BIOS进行键盘输入和磁盘读写03

 

让编程改变世界

Change the world by program


 

字符串的输入

  先看下字符栈的模拟代码:相关代码下载   另外一个要注意的问题是:显示栈中字符的时候,要注意清除屏幕上上一次显示的内容。   我们现在写出完整的接收字符串输入的子程序。 参考源码: 相关代码下载  

应用int13h中断例程对磁盘进行读写

这本书毕竟是经典,经典的东西嘛……就是古老的东西,所以这里主要以 3.5 英寸软盘为例,进行讲解,但原理依旧不变。  

常用的3.5英寸软盘的结构:

分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512B。 总容量为:2面×80磁道×18扇区×512B=1440KB≈1.44MB 磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。   注意,我们只能以扇区为单位对磁盘进行读写。 在读写扇区的时候,要给出面号、磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。   如果我们通过直接控制磁盘控制器来访问磁盘,则需要涉及许多硬件细节。 BIOS提供了对扇区进行读写的中断例程,这些中断例程完成了许多复杂的和硬件相关的工作。 我们可以通过调用BIOS中断例程来访问磁盘。 BIOS 提供的访问磁盘的中断例程为int 13h 。  

如下,读取0面0道1扇区的内容到0:200:

mov ax,0

mov es,ax

mov bx,200h

mov al,1

mov ch,0

mov cl,1

mov dl,0

mov dh,0

mov ah,2

int 13h

  入口参数

(ah)=int 13h的功能号(2表示读扇区)

(al)=读取的扇区数

(ch)=磁道号

(cl)=扇区号

(dh)=磁头号(对于软驱即面号,因为一个面用一个磁头来读写)

(dl)=驱动器号 

    软驱从0开始,0:软驱A,1:软驱B; 硬盘从80h开始,80h:硬盘C,81h:硬盘D。 es:bx指向接收此扇区读入数据的内存区   返回参数: 操作成功: (ah)=0,(al)=读入的扇区数 操作失败: (ah)=出错代码  

接下来,我们看下将0:200中的内容写入0面0道1扇区示例!

mov ax,0

mov es,ax

mov bx,200h

mov al,1

mov ch,0

mov cl,1

mov dl,0

mov dh,0

mov ah,3

int 13h

  (ah)=int 13h的功能号(3表示写扇区) (al)=写入的扇区数 (ch)=磁道号 (cl)=扇区号 (dh)=磁头号(面) (dl)=驱动器号   软驱从0开始,0:软驱A,1:软驱B; 硬盘从80h开始,80h:硬盘C,81h:硬盘D。 es:bx指向将写入磁盘的数据   返回参数: 操作成功: (ah)=0,(al)=写入的扇区数 操作失败: (ah)=出错代码   注意: 下面我们要使用int 13h 中断例程对软盘进行读写。直接向磁盘扇区写入数据是很危险的,很可能覆盖掉重要的数据。 如果向软盘的0 面0 道1 扇区中写入了数据,要使软盘在现有的操作系统下可以使用,必须要重新格式化。   在编写相关的程序之前,必须要找一张空闲的软盘。在使用int 13h中断例程时一定要注意驱动器号是否正确,千万不要随便对硬盘中的扇区进行写入。  

编程练习:将当前屏幕的内容保存在磁盘上。

  分析:1 屏的内容占4000个字节,需要8 个扇区,我们用0面0道的1~8扇区存储显存中的内容。 参考源代码: 相关代码下载 [buy]  获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LYLAJCDUZOIC']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2011/06/14/3846106.html

相关文章:

  • MFC中的窗口绘图问题
  • 【转载】Linux下进程的建立
  • SQL SERVER2005几个性能优化综述
  • windows phone7 mango 多人在线游戏
  • ISAG短信上下行的纠结
  • ASP.NET MVC3书店--第三节 视图与视图模型(转)
  • ASP.NET Session丢失问题原因及解决方案
  • SetWaitableTimer 通过异步程序调用(APC)实现的定时功能
  • C#扩展和收缩代码
  • Activity的taskAffinity属性
  • C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互)
  • Oracle Namespace 说明
  • linux目录配置 FHS
  • 排除软件缺陷的两种重要手段
  • 我收藏了 NHibernate之旅系列文章导航
  • SegmentFault for Android 3.0 发布
  • .pyc 想到的一些问题
  • Babel配置的不完全指南
  • ES6语法详解(一)
  • maven工程打包jar以及java jar命令的classpath使用
  • mockjs让前端开发独立于后端
  • MySQL用户中的%到底包不包括localhost?
  • Sass 快速入门教程
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • text-decoration与color属性
  • TypeScript实现数据结构(一)栈,队列,链表
  • Web Storage相关
  • 利用DataURL技术在网页上显示图片
  • 算法-图和图算法
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 学习笔记TF060:图像语音结合,看图说话
  • 在Mac OS X上安装 Ruby运行环境
  • const的用法,特别是用在函数前面与后面的区别
  • puppet连载22:define用法
  • Python 之网络式编程
  • raise 与 raise ... from 的区别
  • 国内开源镜像站点
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #include
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (C)一些题4
  • (C语言)二分查找 超详细
  • (Forward) Music Player: From UI Proposal to Code
  • (Java数据结构)ArrayList
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (九)信息融合方式简介
  • (十三)Maven插件解析运行机制
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .Net - 类的介绍
  • .net core 6 redis操作类
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET企业级应用架构设计系列之开场白