汇编语言实验14——访问CMOS RAM

264 阅读3分钟

实验内容

编程:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。——《汇编语言(第三版)》王爽老师著。

背景知识

在CMOS RAM中,存放这当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:

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

这些数据以BCD码的方式存放。

BCD码是以4位二进制表示十进制数码的编码方式,如下所示:

十进制码:     0     1    2    3    4    5    6    7    8    9
对应的BCD码:0000  0001 0010 0011 0100 0101 0110 0111 1000 1001

比如:数值26,用BCD码表示为0010 0110,高4位=2,低四位=6。

可见,一个字节表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示各位。

思路

既然实验的内容是以“年/月/日 时:分:秒”的格式,显示当前的日期、时间,通过背景知识得知,时分秒占8位,年月日占4位,那么可以分开循环处理:

  • 从末位开始,倒序处理日期信息,并以'/'隔开,在屏幕显示,如22/08/13
  • 从第四位开始逆序,处理时间信息,并以':'隔开,在屏幕显示,如16:10:10

代码实现

assume cs:code,ss:stack

stack segment
	db 8 dup(0)
	db 8 dup(0)
stack ends

code segment
start:  mov ax,stack
	mov ss,ax
	mov sp,10h

	mov bx,0b800h
        mov es,bx
        
	mov bx,160*12	;第12行
	mov si,25*2	;第25列

	xor ax,ax		
	mov cx,3	;处理年月日
	mov al,9
ldate:	call pdate
	dec al
	add si,6
	loop ldate	

        mov word ptr es:[bx][si-2],20h ;移除多出的'/'

	xor ax,ax	
	mov cx,3		;处理时分秒
	mov al,4
ltime:	call ptime
	sub al,2
	add si,6
	loop ltime

	mov word ptr es:[bx][si-2],20h ;;移除多出的':'

        mov ax,4c00h
        int 21h

pdate:	push ax
	push cx
	out 70h,al 	;向地址端口70h写入要访问的单元的地址,al由外部传入
	in al,71h	;从数据端口71h中取得指定单元中的数据
	mov ah,al	;(ah)=十位,(al)=个位
		
        mov cl,4	    ;位移向量
	shr ah,cl	    ;(ah)=十位右移,高位补0
	and al,00001111b    ;与运算,丢弃al高4位
	add ah,30h	    ;转为ASCII码
	add al,30h	    ;转为ASCII码
		
        mov byte ptr es:[bx][si],ah	;
        mov byte ptr es:[bx][si+2],al	;
        mov byte ptr es:[bx][si+4],2fh	; 插入'/',如yy/MM/dd
		
	pop cx
	pop ax
	ret	
		

ptime:	push ax
	push cx
	out 70h,al 	;向地址端口70h写入要访问的单元的地址,al由外部传入
	in al,71h	;从数据端口71h中取得指定单元中的数据
	mov ah,al	;(ah)=十位,(al)=个位
		
	mov cl,4		;位移向量
	shr ah,cl		;(ah)=十位右移,高位补0
	and al,00001111b	;与运算,丢弃al高4位
	add ah,30h		;转为ASCII码
	add al,30h		;转为ASCII码
		
	mov byte ptr es:[bx][si],ah		;
        mov byte ptr es:[bx][si+2],al	;
        mov byte ptr es:[bx][si+4],3ah	; 插入':',HH:mm:ss
		
	pop cx
	pop ax
	ret	
		
code ends
end start