汇编实验14:访问CMOS RAM

任务

编程,以“年/月/日 时:分:秒”的格式,显示当前的日期,时间。

预备知识

CMOS存储当前时间的信息:年、月、日、时、分、秒。这六个信息的长度均为1个字节,并且以BCD码的形式存放(什么是BCD码?这里就不科普了,自行百度,反正我也只是略懂),存放的单元如下表所示:

0 2 4 7 8 9

那么怎么访问CMOS的端口呢?这就要用到inout指令。另外要注意的是,这两条指令只能用寄存器AX和AL发送和接收端口的数据。
也就是只能用in ax/al,端口号读入数据,只能用out 端口号,ax/al写数据,当然,这里的端口号既可以放在寄存器里,也可以凡在内存单元里,也可以是立即数,这无所谓。

CMOS芯片内部有两个端口,地址分别为70h与71h。

  • 70h为地址端口,存放要访问的CMOS单元地址
  • 71为数据端口,存放读写数据

要读取CMOS的2号单元,应该这么写

    mov     al,2
out 70h,al ;将2送入端口70h中
in al,71h ;从端口71h读取2号单元的内容

要将“0”写入CMOS的2号单元,应该这么写

    mov     al,2
out 70h,al ;将2送入端口70h
mov al,0
out 71h,al ;从端口71h写入0放到2号单元

编程思路

有了前面知识的铺垫,编程就变得相当简单。

在数据段先定义好输出格式

 time db '00/00/00 00:00:00$'

后面为什么加了个$符号呢?那是为了调用dos中断,用int 21h的9号功能输出字符串(没错,我就是这么懒,不想自己造轮子)。
接下来要从CMOS中读取时间信息,并且存放到数据段中去了。
显然这里要用到循环结构,为了方便,我还要定义一个地址表,给出各个时间信息的存放单元

list    db 9,8,7,4,2,1
;分别为年、月、日、时、分、秒的单元地址

用寄存器DI指向time字符串,用寄存器SI指向list地址表。每次循环调整时,
只要inc siadd di,3即可。

循环的核心部分思路,王爽的书中已经给出详细代码,就不在赘述(好吧,我就是懒)。这里有一点要注意的是,由于循环体中用到了CX寄存器,因此使用loop指令要注意寄存器CX的保护。其次,对于时间信息来说(这里以年为例子),‘16’年中数字16中的十位数字“ 1 ”在存储单元低地址位置,而个位数字“ 6 ”在存储单元高地址位置,因此我在实现的过程中,将数字“1”的ascii码放在寄存器AL中,将数字“6”的ascii码放在寄存器AH中,然后将寄存器AX整体复制到time字符串中。当然中间将BCD码转换成ASCII码的实现,在王爽的书里已经有了,就不贴出来了。

代码实现

其实这次实验很简单,代码也简单明了,一看就懂,没必要写注释了(偷懒偷得理直气壮,笑)

assume      cs:code,ds:data,ss:stack

data        segment
time db '00/00/00 00:00:00$'
list db 9,8,7,4,2,0
data ends stack segment
db 256 dup(0)
stack ends code segment main: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,256 mov si,offset list
mov di,offset time
mov cx,6
s: push cx
mov al,[si]
out 70h,al
in al,71h mov ah,al
mov cl,4
shr al,cl
and ah,00001111b
add ax,3030h mov [di],ax add di,3
inc si
pop cx
loop s mov ah,9
mov dx,offset time
int 21h mov ax,4c00h
int 21h code ends end main

最后的效果是这样的:

总结

这篇博文本来我早就想发的,但是因为种种原因,拖到现在才发(我发誓,这次真的不是因为懒)。王爽的《汇编语言(第三版)》马上就要读完了,感觉自己慢慢开始入门了,找到了点汇编的门道,虽然前面的路还很长(32位汇编,实模式,保护模式,AT&T,inte,IA32,以上名词本人一无所知),但我还是有信心可以成为“牛人”的。读完这本书以后,我就要开始数据结构和算法的学习了,业余时间我还想读一读《深入理解计算机系统》(CSAPP),我听说学校有一门课的教材就是这本书,这老师是要把学生培养成“牛人”,然后上天的节奏啊!!!不过这个过程还是很幸苦的。(只要你成为牛人,那么即使成为书呆子也无所谓啦

汇编实验14:访问CMOS RAM的更多相关文章

  1. 汇编语言 实验14 访问CMOS RAM

    汇编语言 访问CMOS RAM CMOS RAM 是什么? 存放计算机开机必备的一些数据的硬件,由BIOS(Basic input/output system)调用其数据. 怎么用? 首先要理解端口的 ...

  2. 汇编程序49:实验14 访问CMOS RAM(显示系统时间)

    assume cs:code ;安装程序,使用指令out和in指令 code segment start: mov ax,cs mov ds,ax mov si,offset sub1 mov ax, ...

  3. 实验十四_访问CMOS RAM

    编程:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间. 注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元写入内容,否则将引起一些系 ...

  4. 汇编试验十四:访问CMOS RAM

    CMOS RAM 芯片的特征: 包含一个时钟和一个有128个存储单元的RAM存储器. 该芯片靠电池供电.所以,关机后其内部的时钟仍可正常工作,RAM中的信息不丢失. 128个字节的RAM中,内部时钟占 ...

  5. ICS2019-Linux汇编实验指导

    ICS2019-Linux汇编实验指导 环境配好了? 开始调试 一. 首先安装NASM 1. 先判断系统是否已经安装了nasm 打开终端,执行  whereis nasm :如果显示nasm: /us ...

  6. 汇编实验15:安装新的int 9中断例程

    汇编实验15:安装新的int 9中断例程 任务 安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,一旦松开后,就显示满屏幕的“A”,其他键照常处理. 预备知识概要 这次实 ...

  7. 汇编实验1(又是作业emm)

    实验任务:学会使用debug 1.使用Debug,将程序段写入内存: 机器码: b8 20 4e 05 16 14 bb 00 20 01 d8 89 c3 01 d8 b8 1a 00 bb 26 ...

  8. 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程

    在装完DosBox环境之后,就可以用debug模式进行汇编指令的编程了. 实验内容:      首先用a指令进行数据的储存,然后用t命令进行调试. 可以发现ax,bx在不同的命令下发生了改变,cs的地 ...

  9. 汇编实验2(又是作业emm)

    实验任务:学会使用debug 1.使用Debug,将程序段写入内存: 首先对0021:0000~0021:000F的内存赋值 这里我赋的值是 11 12 13 14 15 16 17 18 输入mov ...

随机推荐

  1. 学习和运用scrum

    作为长大的大三老腊肉,我们已经在长大生活了两年多,对于什么是长大人最想完善的校园需求.最想拥有的校园服务媒介也有了更加深切的体会. 于是,GoodJob小团队blingbling闪现啦!! GoodJ ...

  2. Jmeter入门17 获取时间点前后一定间隔的时间 __timeShift()

    接口获取时间点前后一定间隔的时间函数: __timeShift(时间格式, 特定时间点(缺省当前时间),时间间隔,地区格式(默认),变量名( 可不填,填写后其他地方用${变量名}引用 )) 举例: 1 ...

  3. IOS 触摸事件的处理

    触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointIn ...

  4. 记一次pda(安卓)环境配置流程

    将git项目git clone下来,接下来就是环境的配置   sdk,jdk,蓝牙插件,热更新 这个顺序   一.java JDK 安装及环境变量配置 https://blog.csdn.net/de ...

  5. Springmvc+Mybatis+Velocity实现小demo(Maven项目)

    转:https://blog.csdn.net/FoolishAndStupid/article/details/52005934 Velocity只是充当一个展示层,和JSP的功能类似,利用myba ...

  6. POJ 2155 Matrix【二维树状数组+YY(区间计数)】

    题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  7. caffe整体框架的学习的博客,这个博客山寨了一个caffe框架

    http://www.cnblogs.com/neopenx/default.html?page=1 这个博主很牛逼,写的东西也很好,多学学,无论是对框架,还是对自己学习c++帮助都非常大

  8. 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...

  9. MvcApplication 中方法的那点事

    最近比较闲,不知道干点啥,想找兼职没有合适的,不找工资又不够花,o(︶︿︶)o 唉! 说多了都是泪,入正题吧. 首先,新建一个MVC4.0项目,建好之后打开Global.asax文件,在MVCAppl ...

  10. GoBelieve Android SDK接入备忘

    Android SDK版本 目前SDK只支持Android 2.2或以上版本的手机系统. AndroidManifest.xml配置 以下配置可以在IMDemo/AndroidManifest.xml ...