汇编第十七节-使用BIOS进行键盘输入和磁盘读写
来源:互联网 发布:php nginx 一键安装包 编辑:程序博客网 时间:2024/05/22 18:22
第十七节:使用BIOS进行键盘输入和磁盘读写
1.int9中断例程对键盘输入的处理:
CPU在9号中断发生后,执行int9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中
比如 A键的扫描码1eh和对应的ASCII码,即字母’a’的ASCII码61h,写入键盘缓冲区。缓冲区的字单元中,高位字节存储扫描码,低位字节存储ASCII码
2.使用int 16h中断例程读取键盘缓冲区:
int 16h中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘键入,该功能的编号为0。
下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除:
mov ah,0int 16h
结果:(ah)=扫描码,(al)=ASCII码
int 16h中断例程的0号功能,进行如下工作:
1.检测键盘缓冲区中是否有数据2.没有则继续做第一步3.读取缓冲区第一个字单元中的键盘输入4.将读取的扫描码送入ah,ASCII码送入al5.将已读取的键盘输入从缓冲区中删除
int 9中断例程和int 16h中断例程是一对相互配合的程序。
int 9 中断例程向键盘缓冲区写入,有键按下的时候向键盘缓冲区中写入数据。
int 16h 中断例程从缓冲区中读出,有应用程序对其进行调用的时候,将数据从键盘缓冲区中读出
3.字符串的输入:
最基本的字符串输入程序,需具备以下功能:
1.在输入的同时需要显示这个字符串
2.一般在输入回车符后,字符串输入结束
3.能够删除已经输入的字符
(dh),(dl)=字符串在屏幕上显示的行,列位置
ds:si指向字符串的存储空间,字符串以0为结尾符
分析如下:
1.字符的输入和删除:按照栈的访问规则进行,后进后出,字符栈中的所有字符,从栈底到栈顶,组成一个字符串2.在输入回车符后,字符串输入结束:输入回车符后,可以在字符串中加入0,表示字符串结束3.在输入的同时需要显示这个字符串:每次有新的字符输入和删除一个字符的时候,都应该重新显示字符串。4.程序的处理过程: a.调用int 16h读取键盘输入 b.如果是字符,进入字符栈,显示字符栈中所有的字符;继续执行a c.如果是退格键,从字符栈中弹出一个字符,显示字符栈中所有字符;继续执行a d.如果是enter键,向字符栈中压入0,返回
子程序:字符栈的入栈,出栈和显示
参数说明:
(ah)=功能号,0表示入栈,1表示出栈,2表示显示 ds:si指向字符栈空间 对于0号功能:(al)=入栈字符 对于1号功能:(al)=返回的字符 对于2号功能:(dh),(dl)=字符串在屏幕上显示的行,列位置
charstack: jmp short charstarttable dw charpush,charpop,charshowtop dw 0 ;栈顶charstart: push bx push dx push di push es cmp ah,2 ja sret mov bl,ah mov bh,0 add bx,bx jmp word ptr table[bx]charpush: mov bx,top mov [si][bx],al inc top jmp sretcharpop: cmp top,0 je sret dec top mov bx,top mov al,[si][bx] jmp sretcharshow: mov bx,0b800h mov es,bx mov al,160 mov ah,0 mul dh mov di,ax add dl,dl mov dh,0 add di,dx mov bx,0charshows: cmp bx,top jne noempty mov byte ptr es:[di],' ' jmp sretnoempty: mov al,[si][bx] mov es:[di],[al] mov byte ptr es:[di+2],' ' inc bx add di,2 jmp charshowssret: pop es pop di pop dx pop bx
在显示栈中字符的时候,要注意清楚屏幕上上一次显示的内容。写出完整的接受字符串输入的子程序
getstr: push axgetstrs: mov ah,0 int 16h cmp al,20h jb nochar ;ASCII码小于20h,说明不是字符 mov ah,0 call charstack ;字符入栈 mov ah,2 call charstack ;显示栈中的字符 jmp getstrsnocharL: cmp ah,0eh ;退格键的扫描码 je backspace cmp ah,1ch ;enter键的扫描码 je enter jmp getstrsbackspace: mov ah,1 call charstack ;字符出栈 mov ah,2 call charstack ;显示栈中的字符 jmp getstrsenter: mov al,0 mov ah,0 call charstack ;0入栈 mov ah,2 call charstack ;显示栈中的字符 pop ax ret
4.应用int 13h中断例程对磁盘进行读写:
3.5英寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512个字节
则:2面*80磁道*18扇区*512字节=1440KB~~1.44MB
磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘,只能以扇区为单元对磁盘进行读写。在读写扇区的时候,要给出面号,磁道号和扇区号,面号的磁道号从0开始,而扇区号从1开始。
BIOS提供的访问磁盘的中断例程为int 13h。
读取0面0道1扇区的内容到0:200的程序如下:
mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,2int 13h
入口参数:(ah)=int 13h的功能号(2表示读扇区)(al)=读取的扇区数(ch)=磁道号 (cl)=扇区号(dh)=磁头号(对于软盘即面号,一个面用一个磁头来读写)(dl)=驱动器号 软盘从0开始,0:软驱A,1:软驱B 硬盘从80h,80h:硬盘C,81h:硬盘Des:bx 指向接受从扇区读入数据的内存区返回参数:操作成功:(ah)=0,(al)=读入的扇区数操作失败:(ah)=出错代码
将0:200中的内容写入0面0到1扇区。
mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,3int 13h
入口参数:(ah)=int 13h的功能号(3表示写扇区)(al)=读取的扇区数(ch)=磁道号 (cl)=扇区号(dh)=磁头号(对于软盘即面号,一个面用一个磁头来读写)(dl)=驱动器号 软盘从0开始,0:软驱A,1:软驱B 硬盘从80h,80h:硬盘C,81h:硬盘Des:bx 指向将写入磁盘的数据返回参数:操作成功:(ah)=0,(al)=写入的扇区数操作失败:(ah)=出错代码
- 汇编第十七节-使用BIOS进行键盘输入和磁盘读写
- [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写
- 汇编语言学习笔记第十七章 使用BIOS进行键盘输入和磁盘读写
- 王爽《汇编语言》(第二版) 学习笔记 (第十七章 使用BIOS进行键盘输入和磁盘读写)
- 汇编语言--使用BIOS进行键盘输入和磁盘读写
- 汇编语言--使用BIOS进行键盘输入和磁盘读写
- 第17章 使用BIOS进行键盘输入和磁盘读写
- 第17章 使用BIOS进行键盘输入和磁盘读写
- 汇编语言笔记17-使用BIOS进行键盘输入和磁盘读写
- 第17章 使用BIOS进行键盘输入和磁盘读写 笔记2
- 汇编学习--7.17--键盘输入和磁盘读写
- 外中断、使用中断完成键盘输入和磁盘读写
- 《汇编语言》学习(十七)键盘输入和磁盘读写
- 正确的使用dd进行磁盘读写速度测试
- 正确的使用dd进行磁盘读写速度测试
- 使用DD进行Linux的磁盘读写性能测试
- 正确的使用dd进行磁盘读写速度测试
- 如何使用x86汇编对硬盘进行读写
- 学校在第十五届山东省大学生软件设计大赛获佳绩
- 机器学习相关基础概念(基本术语)
- 骨骼蒙皮动画(SkinnedMesh Animation)的实现
- XMLHttpRequest cannot load Chrome不支持本地Ajax请求
- 中国大数据技术大会全日程和讲师曝光 | BDTC 2017
- 汇编第十七节-使用BIOS进行键盘输入和磁盘读写
- windows服务器下tomcat发布项目中出现域名访问与站内访问配置方案
- Spark SQL将数据写入Mysql表的一些坑
- 我的生产my.cnf
- java访问远程接口返回json数据接收
- maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。
- DICOM文件的读取显示和本地JPG格式的存储
- hdoj 1026
- ViewPager+Fragment组合的预加载和懒加载