AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

获取当前系统时间

51自学网 http://www.51zixue.net

;==========================================
;A little assembly app that shows the current date and time.
;It can be done a lot easier, but this way you will
;see how to do some basic memory manipulation, and how to use 'variables'.
;==========================================

.model small
.stack

;===========================
;Data segment starts here
;===========================
.data
date_str db "Current date is: yyyy-mm-dd", 0Ah, 0Dh, "$"
time_str db "Current time is: hh.mm.ss:xx", 0Ah, 0Dh, "$"
min_size dw ?
padd_chr db ?


;===========================
;Code segment starts here
;===========================
.code
main proc
mov ax, seg @data ;First we get the data segment address
mov ds, ax ;and store it into ds

mov [min_size], 02h ;Results should always be at least two digits
mov [padd_chr], '0' ;Use '0' as padding-character

mov ah, 2Ah ;Then we call int 21h,2Ah, which will give
int 21h ;us the current date

lea di, date_str ;Then we load the address of the date_str string
add di, 17 ;and set si to point at the first y in yyyy-...


mov ax, cx ;Next we mov cx to ax and
call todec ;call todec
inc di ;We skip the '-' character...

xor ax, ax ;Then we empty ax
mov al, dh ;And set the low-byte of ax to dh
call todec
inc di ;Skip character in string...

xor ax, ax ;Empty ax
mov al, dl ;Set low-byte to dl
call todec ;Convert it to base10


lea di, time_str ;Now we load the time_str string
add di, 17 ;And set the correct pointer offset

mov ah, 2Ch ;And then we call int 21h,2Ch
int 21h ;which will give us the current time


xor ax, ax ;Empty ax
mov al, ch ;Set low-byte to ch
call todec ;Convert it to base10
inc di ;Skip character

mov al, cl ;Set low-byte to cl
call todec ;Convert to base10
inc di ;Skip character

mov al, dh ;Set low-byte to dh
call todec ;Convert to base10
inc di ;Skip character

mov al, dl ;Set low-byte to dl
call todec ;Convert to base10


mov dx, offset date_str ;Now load offset of the date_str string into dx
call print ;And print the (modified) string

mov dx, offset time_str ;Load offset of the time_str string into dx
call print ;And print the (modified) string

mov ax, 4C00h ;Do a clean exit(error code=00)
int 21h

;===================================================================
;todec - converts the contents of ax into base10 ascii character(s)
; of length bx
; min_size defines minimum length of result, and padd_char
; defines the padding character.
;The result(s) are stored at ds:di
;===================================================================
todec proc
push ax ;Save all registers
push bx
push cx
push dx


xor cx,cx ;Empty the POP counter
mov bx,10 ;Base divisor
decloop:
xor dx,dx ;Set the high 16-bits to 0
div bx ;Preform division(dx=remainder, ax=quotient)
inc cx ;Increase the counter
push dx ;and save the remainder
cmp ax,0 ;If the quotient != 0
jnz decloop ;then get one more number


mov bx, [min_size] ;Load min_size value into bx
mov dl, [padd_chr] ;Load padd_chr value into dl
padd_result:
cmp cx, bx ;Is cx >= min_size?
jge poploop ;If so, proceed

mov byte ptr ds:[di], dl ;Else padd with padd_chr
inc di ;and increase string pointer
dec bx ;decrease bx
jmp padd_result ;and test for more padding

poploop:
pop dx ;Get the number of the stack
add dl,'0' ;and add '0' to it
mov byte ptr ds:[di], dl ;Modify the string at ds:di
inc di ;Increase the string pointer
dec cx ;Decrease the loop counter
jnz poploop


pop dx ;Restore all registers
pop cx
pop bx
pop ax
ret ;And return from call
todec endp


;===========================================================
;print - prints the string pointed to by dx using int 21h,09
;===========================================================
print proc
push ax ;Save ax
push ds ;and ds onto the stack

mov ax, @data ;Then get the address of the data segment
mov ds, ax ;and store it into ds
mov ax, 0900h
int 21h ;and then print the message pointed to by dx

pop ds ;Retrieve ds
pop ax ;and ax from stack

ret
print endp

main endp
end main

 

 

 
上一篇:CIH V1.5版本病毒源码  下一篇:简单的取系统时间小程序