汇编实验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. gridview导出exe处理时遇到RegisterForEventValidation can only be called during Render();错误

    如题,今天在利用GridView作execl导出时,遇到RegisterForEventValidation can only be called during Render();问题.根据网上找到的 ...

  2. IOS 集成友盟分享

    #import <Foundation/Foundation.h> @interface UMSocialSinaHandler : NSObject +(void)openSSOWith ...

  3. arcgis for javascript ArcGISDynamicMapServiceLayer 过滤图层点

    记录下过滤 ArcGISDynamicMapServiceLayer 图层服务的方法 function filterArcGISDynamicMapServiceLayer(){ map.graphi ...

  4. Spring Boot 推荐的基础 POM 文件

    名称 说明 spring-boot-starter 核心 POM,包含自动配置支持.日志库和对 YAML 配置文件的支持. spring-boot-starter-amqp 通过 spring-rab ...

  5. 【luogu P1040 加分二叉树】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1040 今天考试考了一个区间DP...没错就是这个... 太蒟了真是连区间DP都不会...看了看题解也看不懂, ...

  6. Angularjs 数据过滤

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. linux命令进阶及和windows进行文件传输的所有方式

    1.图例 ------>原图出处 2. 结构图 根目录说明 3.linux相关命令 cd(change directory切换目录): cd /. 进入根目录 cd .. 返回上一次目录 cd ...

  8. Python基础—04-流程控制

    流程控制 循环结构(while) 格式 while 表达式: 语句块 执行流程:当程序执行到while语句时,首先判断表达式的真假.若表达式的值为真,则执行对应的语句块,之后返回while继续判断表达 ...

  9. LINUX日志的错误等级

    LINUX日志的错误等级 - CSDN博客 https://blog.csdn.net/solmyr_biti/article/details/50634533讯息等级 系统将讯息分为七个主要的等级, ...

  10. <<学会提问>>第一章学习笔记

    中国应不应该现在取消死刑? 中医是不是伪科学? 读书无用论? 集体主义和团队精神? 欧洲难民危机,你是支持接收难民,还是反对? 欧洲白左是不是幼稚圣母,抑或是右派种族歧视,顽固保守? 如何看待&quo ...