8086键盘输入实验——《x86汇编语言:从实模式到保护模式》读书笔记07
1.BIOS中断
我们可以为所有中断类型自定义中断处理过程,包括内部中断、硬件中断和软中断。
BIOS中断,又称BIOS功能调用,主要是为了方便地使用最基本的硬件访问功能。通常,为了区分针对同一硬件的不同功能,使用寄存器AH来指定具体的功能编号。
比如说,以下的指令用于从键盘读取一个按键:
mov ah,0x00 ;0功能号对应从键盘读字符
int 0x16 ;键盘服务, int 0x16
; 中断返回时,字符的ASCII在AL中
需要说明的是,BIOS可能会为一些简单地外围设备提供初始化代码和功能调用代码,并填写中断向量表,但是有一些BIOS中断是由外部设备接口自己建立的。
首先,每个外部设备接口,包括各种板卡,如网卡、显卡、键盘接口电路、硬件控制器等,都有自己的只读存储器(ROM),类似于BIOS芯片,这些ROM中提供了它们自己的功能调用例程,以及本设备的初始化代码。按照规范,前两个单元的内容是0x55和0xAA,第三个单元是本ROM中的代码长度(以512字节为单位);从第四个单元开始,就是实际的ROM代码。
其次,我们知道,从内存物理地址A0000开始,到FFFFF结束,有相当一部分空间是留给外围设备的。如果设备存在,那么它自带的ROM会映射到分配给它的地址范围内。
在计算机启动期间,BIOS会以2KB为单位搜索内存地址C0000~E0000之间的区域。当它发现某个区域的前两个字节是0x55和0xAA时,那意味着该区域有ROM代码的存在,是有效的。接着,它对该区域做累加和检查,看结果是否和第三个单元相符。如果相符,就从第四个单元进入。这时候,处理器执行的是硬件自带的程序指令,这些指令初始化外部设备的相关寄存器和工作状态。最后,填写相关的中断向量表,使其指向自带的中断处理过程。
2.键盘读字符并显示的实验
(1)代码清单
;代码清单9-2
;文件名:c09_2.asm
;文件说明:用于演示BIOS中断的用户程序
;创建日期:2012-3-28 20:35 ;===============================================================================
SECTION header vstart=0 ;定义用户程序头部段
program_length dd program_end ;程序总长度[0x00] ;用户程序入口点
code_entry dw start ;偏移地址[0x04]
dd section.code.start ;段地址[0x06] realloc_tbl_len dw (header_end-realloc_begin)/4
;段重定位表项个数[0x0a] realloc_begin:
;段重定位表
code_segment dd section.code.start ;[0x0c]
data_segment dd section.data.start ;[0x14]
stack_segment dd section.stack.start ;[0x1c] header_end: ;===============================================================================
SECTION code align=16 vstart=0 ;定义代码段(16字节对齐)
start:
mov ax,[stack_segment]
mov ss,ax
mov sp,ss_pointer
mov ax,[data_segment]
mov ds,ax mov cx,msg_end-message
mov bx,message .putc:
mov ah,0x0e
mov al,[bx]
int 0x10
inc bx
loop .putc .reps:
mov ah,0x00
int 0x16 mov ah,0x0e
mov bl,0x07
int 0x10 jmp .reps ;===============================================================================
SECTION data align=16 vstart=0 message db 'Hello, friend!',0x0d,0x0a
db 'This simple procedure used to demonstrate '
db 'the BIOS interrupt.',0x0d,0x0a
db 'Please press the keys on the keyboard ->'
msg_end: ;===============================================================================
SECTION stack align=16 vstart=0 resb 256
ss_pointer: ;===============================================================================
SECTION program_trail
program_end:
(2)使用BIOS中断向屏幕写字符
关于代码,头部的部分和SS,DS的初始化自然不用多说,我们已经很熟悉了。
mov cx,msg_end-message
mov bx,message .putc:
mov ah,0x0e
mov al,[bx]
int 0x10
inc bx
loop .putc
首先,把重复次数传入CX,然后让BX指向要显示的信息的首地址。
接下来,我们要利用0x10号中断的0x0e号功能。
BIOS中断显示服务(Video Service——INT 10H)
功能描述:在Teletype模式下显示字符,具体说就是在屏幕的光标处写一个字符,并推进光标的位置。
入口参数:
AH=0EH
AL=字符
BH=页码
BL=前景色(图形模式);注意,仅在图形模式下,设置BL才会改变前景色;在文本模式下,这个参数不起作用(我们的实验工作在文本模式下)
出口参数:无
(3)使用BIOS中断从键盘读取字符
.reps:
mov ah,0x00
int 0x16 mov ah,0x0e
mov bl,0x07 ;我觉得这句可以不要
int 0x10 jmp .reps
前面已经说了,0x16号中断的0x00号子功能是从键盘读字符。
然后,再次利用0x10号中断的0x0e号功能,把我们从键盘输入的字符显示出来。
BIOS中断键盘服务(Keyboard Service——INT 16H)
功能描述:从键盘读入字符
入口参数:
AH=00H——读键盘
AH=10H——读扩展键盘(可根据0000:0496H单元的内容判断:扩展键盘是否有效 )
出口参数:
AH=键盘的扫描码
AL=字符的ASCII码
(4)实验结果截图
上图就是启动Bochs后,再按C之后的画面。接下来,我们就可以尝试按键,看看会发生什么
下一次,我们就开始探索32位的x86了,你是否很期待呢?
8086键盘输入实验——《x86汇编语言:从实模式到保护模式》读书笔记07的更多相关文章
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01
本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ...
- 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
(十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...
- 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
首先来段题外话:之前我发现我贴出的代码都没有行号,给讲解带来不便.所以从现在起,我要给代码加上行号.我写博客用的这个插入代码的插件,确实不支持自动插入行号.我真的没有找到什么好方法,无奈之下,只能按照 ...
- 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...
- ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT) 32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...
- 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18
本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄 ...
随机推荐
- windows phone制作引导页
适用于WP7 WP8+ 源码下载撸这里 制作动画gif小软件下载 小技巧 ①图片是纯色背景:将页面设置跟图片背景一样颜色 ②图片是渐变or其他,切图时候:单独切背景(页面设置这个为背景)跟图片里面元素 ...
- WPF中在摄像头视频上叠加控件的解决方案
一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...
- 201621123012 《java程序设计》第3周学习总结
1. 本章学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键词:继承 多态 抽象类 abstract 覆盖 object siper 1.2 尝试使用思维导图将这些关键词组织起来. ...
- UIButton的几种触发方式
1.说明 说明:由于是在"iOS 模拟器"中测试的,所以不能用手指,只能用鼠标. 1)UIControlEventTouchDown 指鼠标左键按下(注:只是"按下&qu ...
- 1235: 入学考试[DP]
1235: 入学考试 [DP] 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 12 统计 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近 ...
- [Swift实际操作]九、完整实例-(4)在项目中使用CocoaPod管理类库和插件
本文将为你演示,如何使用CocoaPod第三方类库管理工具,在项目中安装未来需要使用的类库.首先创建一份文本文件.可以使用一个脚本创建文件,你可以采用自己的方式是创建一份文本文件,接着在文件名称上点击 ...
- Flink学习笔记:异步I/O访问外部数据
本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...
- ThinkCMF Foreach标签
foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,例如: <foreach name="list" item="vo"> ...
- [USACO07DEC]泥水坑Mud Puddles BFS BZOJ 1627
题目描述 Farmer John is leaving his house promptly at 6 AM for his daily milking of Bessie. However, the ...
- JS 命名规范
JS的命名规则和规范 规则 - 必须遵守的,不遵守会报错 由字母.数字.下划线.$符号组成,不能以数字开头 不能是关键字和保留字,例如:for.while. 区分大小写 规范 - 建议遵守的,不遵守不 ...