基本汇编语言Get&显示系统时间

时间:2016-07-07 03:40:19

标签: assembly x86 dos

我的代码在这里:

org 100h

mov ah, 2ch
int 21h

mov ah, 2
mov dl, ch
int 21h

mov ah, 2 
mov dl, cl
int 21h     

ret

我想要的是显示系统时间。 但它会显示其他字符。我该如何解决这个问题?

编辑: 我怎么能在这里添加一个除法运算?我想我想要的是将ch和cl除以10并单独打印

感谢答案

3 个答案:

答案 0 :(得分:4)

小时范围从0到23.
分钟从0到59。

它们是两位数字,因此必须处理。

没有打印数字的内置服务,Int 21/AH=02h打印字符,您需要将两位数字(8位数量)转换为{{3} (两个8位数量) 1

这个网站有很多例子,这里只使用简单的说明。

ORG 100h

mov ah, 2ch           ;Get time
int 21h

mov dl, ch            ;Show hours
call itoa99

mov ah, 02h           ;Show separator
mov dl, ':'
int 21h

mov dl, cl            ;Show minutes
call itoa99    

mov ax, 4c00h         ;Exit
int 21h



;dl = number to display (0..99)
itoa99:
 push bx
 push ax            ;Save registers used

 xor ax, ax         ;AX = 0
 mov al, dl         ;AX = DL

 mov bl, 10d
 div bl             ;AL = AX/10, AH = AX mod 10

 ;AX contains the digits

 add ax, 3030h      ;Transform digit to digitals

 ;ASCII digits starts at 30h, digit X is the char 30h+X

 ;ASCII value: 30h  31h  32h  33h ... 39h
 ;Character:   0    1    2    3   ... 9



 mov bx, ax         ;Save for later 

 ;Show the digits
 mov dl, bl
 mov ah, 02h
 int 21h

 mov dl, bh
 int 21h

 pop ax
 pop bx
 ret

1 两位数字有......两位数 基数10是位置系统,它意味着数字表示由称为数字的加权数量组成 每个数字本身就是一个数字,但很简单,有一个独特的符号关联,数字 例如,数字4用各种符号表示,取决于文化:'4','ד','四','IV','4',...... <子> 要在基数10中显示数字,我们首先需要提取数字,然后将数字转换为数字。最终结果是数字 要提取0-59范围编号的两个基数10位,我们只需使用:d0 = n mod 10, d1 = n / 10 说服你自己这确实给出了正确的结果,并且每个di都在0到9之间。

答案 1 :(得分:0)

此代码可能对您有所帮助。您可以在此处找到并下载:Timer Tick Example of Assembly Language

[org 0x0100]

    jmp start


incTime: dw 0 
hrs: dw 0
min: dw 0
sec: dw 0

clearScreen:

   push ax
   push di
   push es

   mov ax , 0xB800
   mov es , ax
   mov di , 0
   nextCls:
      mov word [es:di] , 0x0720
      add di , 2
      cmp di , 4000
      jne nextCls

   pop es
   pop di
   pop ax
   ret


printTime:

   push bp
   mov bp , sp
   push ax
   push bx
   push cx
   push dx
   push si
   push di
   push es

   call clearScreen

   mov si , 0  ;counter to use 3 prints i.e. Hrs, Min, Sec
   mov ax , 0xB800
   mov es , ax
   mov di , 142

nextState:

   mov bx , bp
   sub bx , si
   add bx , 8
   mov ax , [bx]    ;BX=BP-SI+8
   mov bx , 10
   mov cx , 0

   nextDigit:
      mov dx , 0
      div bx
      add dl , 0x30
      push dx
      inc cx
      cmp ax , 0
      jnz nextDigit

   nextPos:
      pop dx
      mov dh , 0x07
      mov [es:di] , dx
      add di , 2
      loop nextPos

      add si , 2
      cmp si , 6
      jz return

      mov dl , ':'
      mov [es:di] , dx
      add di , 2
      jmp nextState


   return:
      pop es
      pop di
      pop si
      pop dx
      pop cx
      pop bx
      pop ax
      pop bp

      ret 6

Clock:
   push ax

   inc word [cs:incTime]
   cmp word [cs:incTime] , 18
   jz Reset

   proceedToCall:
      push word [cs:hrs]
      push word [cs:min]
      push word [cs:sec]
      call printTime

      mov al , 0x20 
      out 0x20 , al

      pop ax
      iret

   Reset:
      mov word [cs:incTime] , 0
      inc word [cs:sec]
      cmp word [cs:sec] , 60
      jnz proceedToCall
      mov word [cs:sec] , 0
      inc word [cs:min]
      cmp word [cs:min] , 60
      jnz proceedToCall
      mov word [cs:min] , 0
      inc word [cs:hrs]
      cmp word [cs:hrs] , 24
      jnz proceedToCall
      mov word [cs:hrs] , 0
      jmp proceedToCall


start:
   xor ax , ax
   mov es , ax
   cli
      mov word [es:8*4] , Clock
      mov word [es:8*4+2] , cs
   sti

   mov dx , start
   add dx , 15
   mov cl , 4
   shr dx , cl

   mov ax , 0x3100
   int 0x21

答案 2 :(得分:0)

我明白了!

org 100h

mov ah, 2ch   ;get time
int 21h       ;

mov hour, ch  
mov mins, cl

mov ah, 0     ;
mov al, hour  ;divide by 10
mov bl, 10    ;
div bl        ;

mov hour1, al 
mov hour2, ah 

mov ah, 2     ;
mov dl, hour1 ;  
add dl, 30h   ;
int 21h       ;
              ;print hour
mov ah, 2     ;
mov dl, hour2 ;
add dl, 30h   ;
int 21h       ;

mov ah, 2     
mov dl, ':'   
int 21h       

mov ah, 0     ;
mov al, mins  ;divide by 10
mov bl, 10    ;
div bl        ;

mov min1, al  
mov min2, ah  

mov ah, 2     ;
mov dl, min1  ; 
add dl, 30h   ;
int 21h       ;
              ;print minuntes
mov ah, 2     ;
mov dl, min2  ;
add dl, 30h   ;
int 21h       ;

ret

hour db ?  ;
mins db ?  ; 
hour1 db ? ;
hour2 db ? ;initialize variables
min1 db ?  ;
min2 db ?  ;