Question about display date
Author Message
Question about display date

after using
MOV AH,2AH
INT 21H
....
how to convert the binary values in registers to ASCII characters and
display on screen.

Mon, 28 Oct 2002 03:00:00 GMT
Question about display date
There are different ways to do this.
Here is one in MASM

--

Eric P. van Westendorp  Tel: +31(0252)210579
Reigerslaan 22  2215NN Voorhout  Netherlands

TITLE   DATEDOS.ASM

;Shows Dos date as dd-mm-yyyy

;MASM 6.11D used ML /AT DATEDOS.ASM to create .COM file

CODE            SEGMENT 'CODE'
ASSUME  DS:CODE,SS:CODE
ORG     0100H
.RADIX  10H

MAIN            PROC    FAR
MOV     AH,2A                   ;Get Date
INT     21                      ;Dos
MOV     AL,DL                   ;Day of month
CALL    BIN2ASCII               ;Into ASCII
MOV     WORD PTR[DAY],AX        ;Into message
MOV     AL,DH                   ;Month
CALL    BIN2ASCII               ;Into ASCII
MOV     WORD PTR[MONTH],AX      ;Into message
MOV     AX,CX                   ;Year
XOR     DX,DX                   ;0
MOV     BX,0064                 ;Divider 100
DIV     BX                      ;AX=quotient, DX=remainder
CALL    BIN2ASCII               ;AL into ASCII
MOV     WORD PTR[YEAR],AX       ;Into message
MOV     AX,DX                   ;Get DL, years, into AL
CALL    BIN2ASCII               ;Into ASCII
MOV     WORD PTR[YEAR+02],AX    ;Into message

MOV     DX,OFFSET DATE_MESS     ;Show date on screen

;Print message DS:DX
MOV     AH,09                   ;Print string
INT     21                      ;Dos

MOV     AX,4C00                 ;Terminate program
INT     21                      ;Dos
MAIN            ENDP

;Procedure to convert bin values in AL (<=99) to ASCII in AX
BIN2ASCII       PROC    NEAR
AAM
ADD     AX,"00"
XCHG    AL,AH
RET
BIN2ASCII       ENDP

;Message to show on screen
DATE_MESS       DB      0A,0D,"Dos date is "
DAY             DB      "  -"
MONTH           DB      "  -"
YEAR            DB      "    \$"

CODE            ENDS
END     MAIN

Quote:

> after using
> MOV AH,2AH
> INT 21H
> ....
> how to convert the binary values in registers to ASCII characters and
> display on screen.

Mon, 28 Oct 2002 03:00:00 GMT
Question about display date

Quote:

>after using
>MOV AH,2AH
>INT 21H
>....
>how to convert the binary values in registers to ASCII characters and
>display on screen.

Here's one way to do it.

; showdate.asm
;
; prints the date and time to stdout
; equivalent to the following C++ program:
;
;#include <iostream.h>
;#include <time.h>
;
;int main()
;{
;    time_t t;
;    time(&t);                  // get the current time
;    cout << ctime(&t);         // convert to string and print
;    return 0;
;}
;
; written on Thu  05-11-2000  by Edward J. Beroset
;  and donated to the public domain by the author
;
; This code may be assembled and linked using Borland's TASM:
;   tasm /la /m2 showdate
;   tlink /Tdc showdate
;
STDOUT                  equ     01h     ; handle of standard output
device

DOS_GET_DATE            equ     02ah    ; get system date
DOS_GET_TIME            equ     02ch    ; get system time
DOS_WRITE_HANDLE        equ     040h    ; write to handle
DOS_TERMINATE           equ     04ch    ; terminate with error code

DOSINT macro function, subfunction
IFB <subfunction>
mov     ah,(function AND 0ffh)
ELSE
mov     ax,(function SHL 8) OR (subfunction AND 0ffh)
ENDIF
int     21h                     ; invoke DOS function
endm

MODEL tiny
;.STACK 100h
.CODE

;****************************************************************************
;
main
;
; calls showdate routne and exists with 00 error code
;
; Entry:
;
; Exit:
;
; Trashed:
;       none
;
;****************************************************************************
main proc far
.STARTUP                ; sets up DS and stack
call    showdate        ;
.EXIT 0                 ; return with errcode=0
main endp

;****************************************************************************
;
showdate
;
; fetches the DOS system date, prints it to stdout and exits
; the format of the output is identical to that of the Posix ctime()
; function:
;
;      Thu May 11 16:11:30 2000
;
; The day of week and month are always 3 characters long.  The time of
; day is in 24hour form (e.g. 16:11:30 is a few minutes after four in
; the afternoon) and the year is always four digits.  The whole thing
is
; followed by a newline character (line feed = 0ah), making 25
; characters total.
;
; Note that ctime() returns 26 characters which is all of the above,
; followed by a terminating NUL char but this program does not emit a
; NUL.)
;
; Entry:
;       DS points to segment for our data tables
;
; Exit:
;       carry may be set if last write failed
;
; Trashed:
;       none
;
;****************************************************************************
showdate proc
push    ax bx cx dx     ;
DOSINT  DOS_GET_DATE    ;
; returns the following
;       cx = year (1980-2099)
;       dh = month (1-12) == (Jan..Dec)
;       dl = day (1-31)
;       al = day of week (0-6) == (Sun..Sat)

push    cx              ;
push    dx              ; save the return values

; write the day of week
mov     dx, offset dayname  ;
mov     cx,3            ; number of bytes to write
call    WriteSubstring  ;

; write the month
pop     ax              ; recall month/day
push    ax              ; and save it again
mov     al,ah           ; isolate just month
mov     dx, offset monthname - 3  ; monthname array is 1-based
mov     cx,3            ; number of bytes to write
call    WriteSubstring  ;

; write the day of the month
pop     ax              ;
call    WriteNumber     ;
call    WriteSpace      ;

; write the hour
DOSINT  DOS_GET_TIME    ; ch = hour, cl = min,
; dh = sec, dl = hundredths

push    dx              ; save seconds
push    cx              ; save minutes
mov     al,ch           ;
call    WriteNumber     ;
call    WriteColon      ;

; write the minutes
pop     ax              ;
call    WriteNumber     ;
call    WriteColon      ;

; write the seconds
pop     ax              ;
mov     al,ah           ;
call    WriteNumber     ;
call    WriteSpace      ;

; write the year (century first)
pop     ax              ;
xor     dx,dx           ; clear other reg before divide
mov     cx,100          ; ax = ax/100, dx = remainder
div     cx              ;
push    dx              ; save remainder
call    WriteNumber     ;

; write the year (year within century)
pop     ax              ;
call    WriteNumber     ;
mov     dx,offset newlinechar
call    PrintOne        ;
pop     dx cx bx ax     ; restore stack
ret                     ;
showdate endp

;****************************************************************************
;
WriteSubstring
;
; writes a short substring to stdout
; specifically, prints CL characters, starting at DS:(DX+CL*AL)
;
; Entry:
;       DS:DX ==> pointer to base of string array
;       CL    =   size of each string
;       AL    =   string selector (i.e. which string)
;
; Exit:
;       CY set if there was an error writing last byte
;       if CY clear,
;               AX = 1 (number of bytes written)
;       else
;               AX = error code
;
; Trashed:
;       BX CX DX
;
;****************************************************************************
WriteSubstring proc
mul     cl              ; ax = cl * al
add     dx,ax           ; offset now points to appropriate day
string
call    PrintIt         ;
WriteSubstring endp
; deliberately fall through
;****************************************************************************
;
WriteSpace
;
; writes a single space character (20h) to stdout
;
; Entry:
;       DS points to data table segment
;
; Exit:
;       CY set if there was an error writing last byte
;       if CY clear,
;               AX = 1 (number of bytes written)
;       else
;               AX = error code
;
; Trashed:
;       BX CX DX
;
;****************************************************************************
WriteSpace proc
mov     dx,offset spacechar;
WriteSpace endp
; deliberately fall through
;****************************************************************************
;
PrintOne
;
; prints a single character pointed to by DS:DX
;
; Entry:
;       DS:DX ==> points to the character to be printed
;
; Exit:
;       CY set if there was an error writing last byte
;       if CY clear,
;               AX = 1 (number of bytes written)
;       else
;               AX = error code
;
; Trashed:
;       BX CX DX
;
;****************************************************************************
PrintOne proc
mov     cx,1            ;
PrintOne endp
; deliberately fall through
;****************************************************************************
;
PrintIt
;
; prints the passed string to stdout
;
; Entry:
;       DS:DX ==> points to string to be printed
;       CX    =   number of bytes to be printed
;
; Exit:
;       CY set if there was an error writing to stdout
;       if CY clear,
;               AX = number of bytes written
;       else
;               AX = error code
;
; Trashed:
;       none
;
;****************************************************************************
PrintIt proc
mov     bx,STDOUT       ;
DOSINT  DOS_WRITE_HANDLE  ; write to the file
ret                     ;
PrintIt endp

;****************************************************************************
;
WriteColon
;
; writes a colon character to stdout
;
; Entry:
;       DS points to data segment
;
; Exit:
;       CY set if there was an error writing to stdout
;       if CY clear,
;               AX = 1 (number of bytes written)
;       else
;               AX = error code
;
; Trashed:
;       none
;
;****************************************************************************
WriteColon proc
mov     dx,offset colonchar;
jmp     PrintOne        ;
WriteColon endp

;****************************************************************************
;
WriteNumber
;
; prints the number in AL to stdout as two decimal digits
;
; Entry:
;       AL      = number to be printed.  It must be in the range 00-99
;
; Exit:
;       CY set if there was an error writing to stdout
;       if CY clear,
;               AX = 2 (number of bytes written)
;       else
;               AX = error code
;
; Trashed:
;       BX CX DX
;
;****************************************************************************
WriteNumber proc
xor     ah,ah           ; clear out high half
mov     cl,10           ; prepare to convert to decimal (base
10)
div     cl              ; divide it out
or      ax,3030h        ; convert to ASCII digits
push    ds              ; remember DS for later
push    ax              ; push converted chars on stack
mov     dx,ss           ;
mov     ds,dx           ; ds = ss
mov     dx,sp           ; print data from stack
mov     cx,2            ; two characters only
call    PrintIt         ;
pop     bx              ; fix stack
pop     ds              ; restore ds pointer
ret                     ;
WriteNumber endp

;.DATA
dayname         db "SunMonTueWedThuFriSat"
monthname       db "JanFebMarAprMayJunJulAugSepOctNovDec"
spacechar       db " "
colonchar       db ":"
newlinechar     db 0ah   ; in C this is \n

end

Ed

Tue, 29 Oct 2002 03:00:00 GMT

 Page 1 of 1 [ 3 post ]

Relevant Pages

Powered by phpBB® Forum Software