+ -
当前位置:首页 → 问答吧 → 汇编中的获取系统时间

汇编中的获取系统时间

时间:2011-04-12

来源:互联网

XML code
dymamictime proc
    s: db 9,8,7,4,2,0 
     s1: db '/','/',' ',':',':',' ' 
start22: mov cx,6 
         mov bx,offset s 
         mov si,offset s1 
         mov di,0 
start1: push cx          
         mov al,cs:[bx]        
         mov dl,cs:[si] 
         out 70h,al 
         in al,71h 
         mov ah,al 
         mov cl,4 
         shr ah,cl 
         and al,00001111b 
         add ah,30h 
         add al,30h 
         mov bp,0b800h 
         mov es,bp 
         mov byte ptr es:[1980+di],ah 
         mov byte ptr es:[1982+di],al 
         mov byte ptr es:[1984+di],dl 
         inc bx 
         inc si 
         add di,6 
         pop cx 
         loop start1


in al,60h

cmp al,10h ;Q键的扫描码

je quit

jmp start22

           ;以上4句为动态获取系统时间的关键

quit:   mov ax,4c00h

        int 21h
ret
dymamictime endp 哪位能帮忙解释下这个子程序呢?有些地方看不懂

作者: icdpc   发布时间: 2011-04-12



先点位

作者: ado_cc   发布时间: 2011-04-12

MS我在BCCN已经回答你了

作者: va_zaixuexi   发布时间: 2011-04-12


楼上的,我把你BCCN的代码给复制过来了
Assembly code
;CMOS RAM芯片
;该芯片内部有两个端口,端口地址为70h和71h
;CPU通过这两个端口来读写CMOS RAM
;70h为地址端口,存放要访问的CMOS RAM单元的地址
;71h为数据端口,存放从选定的CMOS RAM单元中读取的数据
;---------------------------------------------------
; YEAR    MONTH    DATE    HOUR    MINUTE    SECOND
;  9      8      7       4        2       0
;---------------------------------------------------
    .model tiny
    .code
    main proc far
start:
    xor ax,ax
    push ds
    push ax
    call dynamictime
    ret
    main endp
    dynamictime proc
    jmp short start22
s:
    db 9,8,7,4,2,0
s1:
    db '/','/',' ',':',':',' '
start22:
    mov cx,6                    ;CX=6
    mov bx,offset s             ;BX指向s,  s为70端口每次所需要的入口参数的首地址
    mov si,offset s1            ;SI指向s1, s1为显示格式
    mov di,0                    ;显示下标DI = 0
start1:
    push cx                     ;保存次数
    mov al,cs:[bx]              ;取当前需要的70端口的入口参数
    mov dl,cs:[si]              ;取当前需要的显示格式
    out 70h,al                  ;al->PORT 70,指示71端口要取的数据
    in al,71h                   ;PORT 71->al
    mov ah,al
    mov cl,4
    shr ah,cl
    and al,00001111b
    add ah,30h
    add al,30h                  ;数字转ASCII
    mov bp,0b800h
    mov es,bp
    mov byte ptr es:[1980+di],ah
    mov byte ptr es:[1982+di],al
    mov byte ptr es:[1984+di],dl;送B800显示
    inc bx
    inc si                      ;2个缓冲区指针分别加1,指向后一个内存单元
    add di,6                    ;每次显示3个字符,加上属性=>3*2
    pop cx                      ;恢复当前计数
    loop start1                 ;CX-1!=0,循环到start1
    in al,60h                   ;读键盘
    cmp al,10h                  ;Q键的扫描码
    je quit                     ;Q键退出
    jmp start22                 ;跳转到start22
quit:
    ret                         ;返回
    dynamictime endp
    end start

作者: ado_cc   发布时间: 2011-04-12

该回复于2011-04-12 16:03:19被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#5楼 得分:0回复于:2011-04-12 15:35:54
查表的方式。主要是受实验13第三个实验的题目影像而写,你实验13做了吗??做了就应该比较好理解了。


Assembly code
assume cs:code

code segment
s0:db 9,8,7,4,2,0        ;这个是年,月,日等的排序
s1:db '// ::'           ;这个是符号,比如11/04/12 15:33的符号
start22: mov cx,6             
         mov bx,offset s  ;bx表示年月日时秒
         mov si,offset s1 ;si表示那些符号
         mov di,0 
start1: push cx          
         mov al,cs:[bx]        
         mov dl,cs:[si] 
         out 70h,al      
         in al,71h      ;这个书本有说到,我忘了
         mov ah,al 
         mov cl,4 
         shr ah,cl        ;这个书本也有例子
         and al,00001111b 
         add ah,30h 
         add al,30h         ;
         mov bp,0b800h 
         mov es,bp 
         mov byte ptr es:[1980+di],ah 
         mov byte ptr es:[1982+di],al 
         mov byte ptr es:[1984+di],dl 
         inc bx 
         inc si 
         add di,6 
         pop cx 
         loop start1


in al,60h

cmp al,10h ;Q键的扫描码

je quit

jmp start22     ;不断重复的意思,跳转到开始

           ;以上4句为动态获取系统时间的关键

quit:   mov ax,4c00h

        int 21h
ret

作者: va_zaixuexi   发布时间: 2011-04-12