灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4084回复:0

[汇编源码]获取当前系统时间

楼主#
更多 发布于:2011-10-26 09:24
;========================================== 
;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


喜欢0 评分0
游客

返回顶部