首页 > 技术文章 > 汇编读取CMOS RAM端口程序

godfriend 2019-06-05 21:16 原文

题目:按照主程序与子程序的结构,输入并编写读出CMOS RAM端口程序,以“年/月/日 时:分:秒”的格式,显示当前时间。

源程序:

assume cs:code,ds:data
data segment
	db 9,8,7,4,2,0				;储存各时间位置
	db "yy/mm/dd hh:mm:ss",0	;输出格式
data ends

code segment
start:	mov ax,data
		mov ds,ax	;data段挂载到ds
		mov bx,0	;bx初始化为零
		mov si,6	;类似于指针,指向输出格式
		mov cx,6	;循环6次
s:		push cx		;将循环次数入栈保存
		mov al,[bx]	;将ds:[bx]的数据传给al
		out 70h,al	;将al的值传到70h端口,找到端口地址
		in al,71h	;将71h存的值传给al,得到对应时间
		mov ah,al	;保存al的值
		mov cl,4	;循环四次,为下一行右移做准备
		shr ah,cl	;二进制右移cl位,得到十位数
		add ah,30h	;加30h,得到ASCII码
		and al,0fh	;与00001111做与运算,得到个位数
		add al,30h	;加30h,得到ASCII码
		mov [si],ah	;将ah的值传给ds:[si],例如yy的第一个y
		mov [si+1],al	;将al的值传给下一位,yy的第二个y
		inc bx		;bx加一,指向第二个时间位置
		add si,3	;跳到下一个位置,yy到mm需要跳三次
		pop cx		;将保存的循环次数传回cx
		
		loop s		;循环cx次
		mov si,6	;类似于指针,指向输出格式
		mov dl,12	;保存行数,12行
		mov dh,20	;保存列数,20列
		mov cl,17h	
		call show	
		mov ax,4c00h
		int 21h
		
		;按格式输出
show:	push es
		push bx
		push cx
		push si
		push ax
		mov ax,0b800h	
		mov es,ax	
		mov al,160	
		mul dh		
		mov bx,ax	
		mov al,2	
		mul dl		
		add bx,ax	
		mov al,cl	
m0:		mov cl,[si]	
		mov ch,0	
		jcxz m1		
		mov es:[bx],cl	
		mov es:[bx+1],al	
		inc si		
		add bx,2	
		loop m0
		
		jmp m1	
m1:		pop ax
		pop si
		pop cx
		pop bx
		pop es
		ret
code ends
end start

运行结果截图:

推荐阅读