当前位置: 首页 > article >正文

汇编语言 访问CMOS RAM并打印时间(未完)

题目:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间

提示:在此代码的基础上加以改造

assume cs:code
code segment
start:
	mov al,9	;年
	out 70h,al	;传入9号单元的地址
	in al,71h	;取9号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2],ah 
	mov byte ptr es:[160*12+40*2+1],2h
	mov es:[160*12+40*2+2],al
	mov byte ptr es:[160*12+40*2+3],2h
	mov ax,4c00h
	int 21h
code ends
end start

方案1

assume cs:code
code segment
start:
  s: 
	mov al,9	;年
	out 70h,al	;传入9号单元的地址
	in al,71h	;取9号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2],ah 
	mov byte ptr es:[160*12+40*2+1],7h ;为黑底白字
	mov es:[160*12+40*2+2],al
	mov byte ptr es:[160*12+40*2+3],7h ;为黑底白字
	
    mov byte ptr es:[160*12+40*2+4],2fh ;ASCII码对应/
	mov byte ptr es:[160*12+40*2+5],7h ;为黑底白字
	
	;这行不需要写xor ax,ax,原因是下方指令执行时会覆盖掉旧值
    mov al,8	;月
	out 70h,al	;传入8号单元的地址
	in al,71h	;取8号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+6],ah 
	mov byte ptr es:[160*12+40*2+7],7h ;为黑底白字
	mov es:[160*12+40*2+8],al
	mov byte ptr es:[160*12+40*2+9],7h ;为黑底白字
	
	mov byte ptr es:[160*12+40*2+10],2fh ;ASCII码对应/
	mov byte ptr es:[160*12+40*2+11],7h ;为黑底白字
	
	mov al,7	;日
	out 70h,al	;传入7号单元的地址
	in al,71h	;取7号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+12],ah 
	mov byte ptr es:[160*12+40*2+13],7h ;为黑底白字
	mov es:[160*12+40*2+14],al
	mov byte ptr es:[160*12+40*2+15],7h ;为黑底白字
	
	mov byte ptr es:[160*12+40*2+16],20h ;ASCII码对应空格
	mov byte ptr es:[160*12+40*2+17],7h ;为黑底白字
	
	mov al,4	;时
	out 70h,al	;传入4号单元的地址
	in al,71h	;取4号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+18],ah 
	mov byte ptr es:[160*12+40*2+19],7h ;为黑底白字
	mov es:[160*12+40*2+20],al
	mov byte ptr es:[160*12+40*2+21],7h ;为黑底白字
	
	mov byte ptr es:[160*12+40*2+22],3Ah ;ASCII码对应:
	mov byte ptr es:[160*12+40*2+23],7h ;为黑底白字
	
	mov al,2	;分
	out 70h,al	;传入2号单元的地址
	in al,71h	;取2号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+24],ah 
	mov byte ptr es:[160*12+40*2+25],7h ;为黑底白字
	mov es:[160*12+40*2+26],al
	mov byte ptr es:[160*12+40*2+27],7h ;为黑底白字
	
	mov byte ptr es:[160*12+40*2+28],3Ah ;ASCII码对应:
	mov byte ptr es:[160*12+40*2+29],7h ;为黑底白字
	
	mov al,0	;秒
	out 70h,al	;传入0号单元的地址
	in al,71h	;取0号单元的内容,高4位为十位、低4位为各位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+30],ah 
	mov byte ptr es:[160*12+40*2+31],7h ;为黑底白字
	mov es:[160*12+40*2+32],al
	mov byte ptr es:[160*12+40*2+33],7h ;为黑底白字
	jmp s ;无限条件1循环,一直刷新时间
	mov ax,4c00h
	int 21h
code ends
end start

最容易想到,虽然能成功显示,但是不够简洁,执行效率较低 

方案2

可以在方案1的基础上内嵌两个循环

CMOS RAM的存放单元为:

秒:0 分:2 时:4 日:7 月:8 年:9

0,2,4单元间隔2   7,8,9单元是连续的

注意:调用loop循环时必定会用到cx,但是在显示时间时用到了cx(mov cl,4),因此要入栈保存

assume cs:code
code segment
start:
s:
    xor si,si
	mov dl,9    ;从9号单元开始
	mov cx,3    ;循环3次  
    s1: 
	push cx     ;保存cx的值
	mov al,dl	;年
	out 70h,al	;传入al号单元的地址
	in al,71h	;取9号单元的内容,高4位为十位、低4位为个位
	mov ah,al
	mov cl,4             
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h  ;转换为十进制的ASCII码值
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+0+si],ah 
	mov byte ptr es:[160*12+40*2+1+si],7h ;为黑底白字
	mov es:[160*12+40*2+2+si],al
	mov byte ptr es:[160*12+40*2+3+si],7h ;为黑底白字
	
    mov byte ptr es:[160*12+40*2+4+si],2fh ;ASCII码对应/
	mov byte ptr es:[160*12+40*2+5+si],7h ;为黑底白字
	dec dl
	add si,6
	pop cx   ;恢复cx的值
	loop s1  ;年/月/日/打印的循环
	
	sub si,2
	;把日后面的/改成空格
	mov byte ptr es:[160*12+40*2+si],20h ;ASCII码对应空格
	add si,2 ;恢复si的值
	

    mov dl,4 ;从4号单元开始
	mov cx,3
    s2:
	push cx
	mov al,dl	
	out 70h,al	;传入al号单元的地址
	in al,71h	;取al号单元的内容,高4位为十位、低4位为个位
	mov ah,al
	mov cl,4
	shr ah,cl			;高4位 
	and al,00001111b	;低4位
	add ah,30h  ;转换为十进制的ASCII码值
	add al,30h	;转换为十进制的ASCII码值
	mov bx,0b800h
	mov es,bx 
	mov es:[160*12+40*2+18+0+si],ah 
	mov byte ptr es:[160*12+40*2+1+si],7h ;为黑底白字
	mov es:[160*12+40*2+2+si],al
	mov byte ptr es:[160*12+40*2+3+si],7h ;为黑底白字
	mov byte ptr es:[160*12+40*2+4+si],3Ah ;ASCII码对应:
	mov byte ptr es:[160*12+40*2+5+si],7h ;为黑底白字
	sub dl,2
	add si,6
	pop cx
	loop s2
	jmp s ;一直刷新时间
	
	mov ax,4c00h
	int 21h
code ends
end start


http://www.kler.cn/news/324309.html

相关文章:

  • 6-演员和蓝图
  • 计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档
  • MySQL—触发器详解
  • vector的模拟实现以及oj题(2)
  • Linux —— Socket编程(二)
  • NetworkPolicy访问控制
  • Windows 开发工具使用技巧
  • PAT甲级1003Emergency
  • 【分布式微服务云原生】10分钟揭秘Dubbo负载均衡:如何让服务调用更智能?
  • 发明专利实用新型专利外观设计专利
  • List几种遍历方法速度
  • 【GUI设计】基于图像分割的GUI系统(3),matlab实现
  • leetcode91. 解码方法,动态规划
  • uniapp设置从右上角到左下角的三种渐变颜色
  • 滚雪球学MySQL[2.1讲]:基础SQL操作
  • 如何使用 Go 获取你的 IP 地址
  • MMD模型及动作一键完美导入UE5-IVP5U插件方案(二)
  • Vue3中的30个高频重点面试题
  • 金镐开源组织成立,增加最新KIT技术,望能为开源添一把火
  • 加法器以及标志位
  • Qt学习笔记
  • HTTP请求过程 part-1
  • 高通Android 12 音量API设置相关代码
  • (undone) MIT6.824 Lecture1 笔记
  • OpenGL ES 绘制一个三角形(2)
  • zookeeper 服务搭建(集群)
  • 解决SpringBoot 3.3.x集成Micrometer和Prometheus,导致项目阻塞,无法启动
  • 演示:基于WPF的DrawingVisual开发的频谱图和律动图
  • Meta首款多模态Llama 3.2开源:支持图像推理,还有可在手机上运行的版本 | LeetTalk Daily...
  • Python连接Kafka收发数据等操作