【问题标题】:Assembly 8086 - Get time without using interrupts from DOS程序集 8086 - 在不使用 DOS 中断的情况下获取时间
【发布时间】:2022-11-26 12:22:45
【问题描述】:

如何在不使用 DOS 中断的情况下获取时间?

如何在不使用 DOS 中断的情况下获取时间?

【问题讨论】:

  • 也许read the RTC
  • 如果 ROM-BIOS 处理程序或兼容的处理程序仍被安装和调用,并且 PIT 的 IRQ #0 计时器仍像往常一样设置,那么 dword [40h:6Ch] 将保持滴答到一天。这从 0 到 18_00AFh 从一天的午夜开始到一天结束的午夜之前计数。这几乎正​​好是每小时 64 千二进制刻度,每秒约 18.2 个刻度。 (您可以除以 65536 以获得一天中的大概时间。)

标签: assembly x86-16 emu8086


【解决方案1】:

在不使用 DOS 中断的情况下获取时间

如果你不想使用 DOS.GetSystemTime 函数 2Ch (int 21h),总是有 BIOS.GetRealTimeClockTime 函数 02h (int 1Ah)。这两个函数都以 CH 返回小时,以 CL 返回分钟,以 DH 返回秒与返回整数的 DOS 不同,BIOS 以 BCD 格式返回数字。

23:17:45     DOS     vs     BIOS
         --------------------------
         CH=23 (17h)    CH=35 (23h)
         CL=17 (11h)    CH=23 (17h)
         DH=45 (2Dh)    CH=69 (45h)

如果您不想使用上面提到的任何一个函数,那么一个足够接近的近似值来自于读取内存地址 046Ch (dword) 中保存的 BIOS.TimerTick。由于简化的数学计算,一天的第一分钟(并且只有第一分钟)将花费大约 70 秒。如果您的程序不显示秒数,用户甚至不会注意到这一点。

; -> CH is hours [0,23]
; -> CL is minutes [0,59]
; IN () OUT (cx)
GetTime:
  cli
  push ds
  push ax
  push dx
  xor  cx, cx            ; 00:00
  mov  ds, cx
  mov  al, [046Ch + 2]   ; [0,24]
  cmp  al, 24
  je   .OK
  mov  ch, al            ; Hours [0,23]
  mov  ax, 60
  mul  word ptr [046Ch]
  mov  cl, dl            ; Minutes [0,59]
.OK:
  pop  dx
  pop  ax
  pop  ds
  sti
  ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多