汇编读取CMOS RAM端口程序

题目:按照主程序与子程序的结构,输入并编写读出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

运行结果截图:

猜你喜欢

转载自www.cnblogs.com/godfriend/p/10981990.html
RAM