0

我正在尝试在 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
4

1 回答 1

1

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

mov cx, 10

为了:

mov cx 16
于 2018-03-28T16:02:13.947 回答