在实模式汇编中超出RTC输出

时间:2018-03-27 23:29:43

标签: assembly x86 nasm real-mode real-time-clock

我正在尝试制作在16位实模式操作系统中返回时间和日期的命令。 但是,当我从RTC读取时,会返回一些奇怪的值。根据RTC,似乎每分钟90秒,每小时90分钟。

下面,您会看到一段代码,应该在0到59秒之间打印,但打印在0到89之间:

get_seconds:
  xor ax, ax        ; clear AX
  mov al, 0x00      ; get seconds
  out 0x70, al      ; set index
  in al, 0x71       ; load index to AL
  call print_decimal        ; print contents of AX as decimal

print_decimal:
  lea si, [decimal_str+9]   ; point SI to last byte in buffer
  mov cx, 10        ; 10 = divisor for base 10 printing

 .loop
  xor dx, dx        ; clear DX
  div cx            ; AX = AX / 10, remainder in DX
  add dl, '0'       ; convert remainder to ASCII
  dec si            ; store digits from right to left
  mov [si], dl      ; store remainder as ASCII in the buffer
  test ax,ax        ; check if AX = 0
  jz .print         ; if AX = 0, print decimal-string
  jmp .loop 

 .print
  mov bx, si        ; set BX to last stored ASCII-digit
  call print_string     ; regular int 10h string printer

 .done 
  ret

decimal_str: times 10 db 0  ; buffer

1 个答案:

答案 0 :(得分:1)

我发现了问题。将AX除以10将其视为十六进制,而实际上是BCD。所以为了解决我的问题,我互换了:

mov cx, 10

有关:

mov cx 16