使用BIOS进行键盘输入和磁盘读写
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}
| 1e61 | 3062 | 2e63 | 2064 | 1265 |
| 1e61 | 3062 | 2e63 | 2064 | 1265 | 1e41 |
| 1e61 | 3062 | 2e63 | 2064 | 1265 | 1e41 | 1e61 |
| mov ah , 0 int 16h |
(ah)=扫描码 (al)=ASCII码 |
| 2e63 | 2064 | 1265 | 1e41 | 1e61 |
| 编程,接收用户的键盘输入,输入"r",将屏幕上的字符设置为红色;输入"g",将屏幕上的字符设置为绿色;输入"b",将屏幕上的字符设置为蓝色,输入其他字符不做任何改变; |
assume cs:code
code segment
start: mov ah , 0
int 16h ; 从键盘缓存区读取键盘输入,空则循环等待
mov ah , 1 ; 设置(ah)=00000001b
cmp al , 'r' ; 待设置的颜色属性为红色,100
je red
cmp al , 'g' ; 待设置的颜色属性为绿色,010
je green
cmp al , 'b' ; 待设置的颜色属性为蓝色,001
je blue
jmp short sret ; 其他键不做特殊处理,直接退出
red: shl ah , 1 ; 属性红色就要把ah的1左移两位
green: shl ah , 1 ; 属性绿色就要把ah的1左移一位
blue: mov bx , 0b800h
mov es , bx
mov bx , 1
mov cx , 2000
s: and byte ptr es:[bx] , 11111000b
or es:[bx] , ah
add bx , 2
loop s
sret: mov ax , 4c00h
int 21h
code ends
end start
|
| 编写一个接收字符串的输入子程序,实现上面三个基本功能。因为在输入的过程中的需要显示,子程序的参数如下: (dh)、(dl)=字符串在屏幕上显示的行、列位置; ds:si 指向字符串的存储空间,字符串以 0 为结尾负。 |
| 1、字符的输入和删除。 每个新输入的字符都存储在前一个输入的字符之后,而删除是从最后面的字符进行的。 eg: 空字符串: 输入"a": a 输入"b": ab 输入"c": abc 输入"d": abcd 删除一个字符:abc 删除一个字符:ab 字符串的存储空间实际上是一个字符栈,字符栈中的所有字符,从栈低到栈顶,组成一个字符串。 |
| 2、在输入回车符后,字符串输入结束。 输入回车符后,可以在字符串中加入0,表示字符串结束。 |
| 3、在输入的同时需要显示这个字符串。 每次有新的字符输入和删除一个字符的时候,都应该重新显示字符串,即从字符栈的栈低到栈顶,显示所有的字符。 |
| 4、程序的处理过程。 ① 调用 int 16h 读取键盘输入; ② 如果是字符,进入字符栈,显示字符栈中的所有字符;继续执行①; ③ 如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符;继续执行①; ④ 如果是 Enter 键,向字符栈中压入0,返回; |
| 字符栈的入栈、出栈和显示栈中的内容,是需要在多处使用的功能,我们应该将它们写为子程序。 |
| 子程序:字符栈的入栈、出栈和显示。 参数说明: (ah)=功能号,0 表示入栈,1 表示出栈,2 表示显示; ds:si 指向字符栈空间; 对于 0 号功能:(al)=入栈字符; 对于 1 号功能:(al)=返回的字符; 对于 2 号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置。 |
| 显示栈中字符的时候,要注意清除屏幕上上一次显示的内容。 |
应用 int 13h 中断例程对磁盘进行读写
| 3.5 英寸软盘只能采用 CHS 方式寻址: 3.5 英寸软盘的 CHS 参数: 80个柱面,柱面编号 0 ~ 79; 2个磁头,磁头编号 0、1;
每个磁道有 18 个扇区,每个磁道上扇区编号 1 ~ 18;
每个扇区可存放 512 字节的数据。
CHS寻址方式的容量由CHS三个参数决定:
磁头(磁面)数最大为255 (用 8 个二进制位存储)。从0开始编号。
柱面(磁道)数最大为1023(用 10 个二进制位存储)。从0开始编号。
扇区数最大数 63(用 6个二进制位存储)。从1始编号。
所以CHS寻址方式的最大寻址范围为:
255 * 1023 * 63 * 512 / 1048576 = 7.837 GB ( 1M =1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8.414 GB ( 1M =1000000 Bytes ) |
CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector)。
磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁头就可以表示数据在哪个磁面。
柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。
扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。
CHS寻址的缺点:
显然,由于要求每个磁道的扇区数相等,而外道的周长要大于内道,所以外道的记录密度要远低于内道,不仅造成了硬盘空间的浪费,也限制了硬盘的容量。为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇区比内圈磁道多,采用这种结构后,硬盘不再具有实际的CHS参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址。
但一些古老的软件仍然使用CHS寻址方式(如使用BIOSInt13H接口的软件),为了兼容这样的程序,在硬盘控制器内部安装了一个地址翻译器,可以通过它将老式CHS参数翻译成新的线性参数。 |
|
读取 0 面 0 道 1 扇区的内容到 0:200
mov ax , 0
mov es , ax
mov bx , 200h
mov al , 1 ; 读取一个扇区
mov ch , 0 ; 0号磁道
mov cl , 1 ; 1号扇区
mov dh , 0 ; 0面
mov dl , 0 ; 驱动器号0,软驱A
mov ah , 2 ; 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 ; 0号磁道
mov cl , 1 ; 1号扇区
mov dh , 0 ; 0面
mov dl , 0 ; 驱动器号0,软驱A
mov ah , 3 ; 3号功能,写扇区
int 13h
|
入口参数: (ah)=int 13h 功能号 (3表示写扇区) (al)=写入的扇区数 (ch)=磁道号 (cl)=扇区号 (dh)=磁头号(面) (dl)=驱动器号 es:bx 指向将写入磁盘的数据 返回参数: 操作成功:(ah)=0 , (al)=写入的扇区数
操作失败:(ah)=出错代码
|
使用BIOS进行键盘输入和磁盘读写的更多相关文章
- [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写
第十七章 使用BIOS进行键盘输入和磁盘读写 17.1 int 9 中断例程对键盘输入的处理 17.2 int 16 读取键盘缓存区 mov ah,0 int 16h 结果:(ah)=扫描码,(al) ...
- 汇编学习笔记(14)BIOS对键盘输入的处理
字符的处理 键盘输入的字符一般由int9中断例程从60h端口中读取,并存放在键盘缓冲区中,由int16h例程从键盘缓冲区中读取相应字符,CPU对键盘输入a.shift_a的处理过程如下 1.一开始没有 ...
- Python 3 学习笔记之——键盘输入和读写文件
1. 键盘输入 Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘.input 可以接收一个 Python 表达式作为输入,并将运算结果返回. str = inp ...
- VB模拟键盘输入的N种方法
VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...
- android键盘输入读取
android键盘输入读取 监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...
- 【Linux】磁盘读写 测试
一.如何查看当前磁盘的IO使用情况 使用命令:iotop Total DISK READ: 3.89 K/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DI ...
- 8086键盘输入实验——《x86汇编语言:从实模式到保护模式》读书笔记07
1.BIOS中断 我们可以为所有中断类型自定义中断处理过程,包括内部中断.硬件中断和软中断. BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能.通常,为了区分针对同一硬件的 ...
- C++学习笔记10_输入输出流.文件读写
//从键盘输入到程序,叫标准input:从程序输出到显示器,叫标准output:一并叫标准I/O //文件的输入和输出,叫文件I/O cout<<"hellow word&quo ...
- C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,
//学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...
随机推荐
- Java的成员变量初始化
对于方法里面的成员变量,Java要求程序员强制提供一个初始化的值.比如下面这个方法就会出错: public class Breakyizhan{ public void Z(){ int z; z++ ...
- SQL Server 禁用扩展存储过程
概述 扩展存储过程是 SQL Server 实例可以动态加载和运行的 DLL.扩展存储过程是使用 SQL Server 扩展存储过程 API 编写的,可直接在 SQL Server 实例的地址空间中运 ...
- 【知了堂学习心得】浅谈c3p0连接池和dbutils工具类的使用
1. C3P0概述 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. 2. C3P ...
- Redis进阶实践之二如何在Linux系统上安装安装Redis
一.引言 上一篇文章写了"如何安装VMware Pro虚拟机"和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我们才可以在该系统上安装Redis. ...
- Lottie的使用
一.简介 Lottie是Airbnb开源的一个面向IOS.Android.React Native的动画库,能分析Adobe After Effects导出的动画,并且能让原生App像使用静态素材一样 ...
- 使用jemeter手工编写注册、登陆脚本 运用 fiddler (三)
手工注册脚本的录制 我们可以发现 编写手工脚本 需要用到两个软件一起合作才能编写成功 工作亦是如此 养成良好的团队合作精神 是必不可少的 现在我们来看手工编写注册脚本 第一步 :我们先进入网站首页 ...
- 解决:java.io.IOException: No FileSystem for scheme: hdfs
解决:java.io.IOException: No FileSystem for scheme: hdfs 开发项目初期,写完代码开始放到服务器上开始测试的时候,报出这样的一个错,不知道怎么处理了, ...
- windows server,nginx安装,配置,运行nodeJS后端的web项目的实现,以及错误分析及解决方法
一.安装nginx 下载windows版nginx (http://nginx.org/download/nginx-1.12.2.zip),之后解压到需要放置的位置(C:\nginx) 二.将Ngi ...
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
"/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...
- CTF---编程入门第一题 循环
循环分值:10 来源: 北邮天枢战队 难度:易 参与人数:1478人 Get Flag:467人 答题人数:523人 解题通过率:89% 给出一个循环公式,对于一个整数n,当n为奇数时,n=3n+1, ...