Browse Source

Set hours string in a single memory access

Yann Weber 5 years ago
parent
commit
891f720dbc
1 changed files with 35 additions and 39 deletions
  1. 35
    39
      wtfstopw.asm

+ 35
- 39
wtfstopw.asm View File

80
 	SIGACTION sigaction
80
 	SIGACTION sigaction
81
 
81
 
82
 	align 8
82
 	align 8
83
-	hours: times 8 db '0' ; allows storing max hours in 1<<64 secs
83
+	hours: times 8 db '0' ; 8 digits is the max for hours
84
 	timestr: db ":00:00." 
84
 	timestr: db ":00:00." 
85
-		times 8 db '0'
85
+		times 8 db '0' ; 8 digits for nanoseconds
86
 		times 0xE db ' '
86
 		times 0xE db ' '
87
 		db 0
87
 		db 0
88
 	timestrend: align 8
88
 	timestrend: align 8
89
 	timestrlen: equ timestrend - timestr
89
 	timestrlen: equ timestrend - timestr
90
-	hourslen: equ timestr - hours ; hours len -> the max number of digits
90
+	%define HOURSLEN 8
91
 
91
 
92
 	lapsmsg: db "Lap : "
92
 	lapsmsg: db "Lap : "
93
 	lapsmsglen: equ $ - lapsmsg
93
 	lapsmsglen: equ $ - lapsmsg
291
 	xor rdx, rdx
291
 	xor rdx, rdx
292
 	div qword [ts_sleep.tv_nsec] ; Divide result given time_res
292
 	div qword [ts_sleep.tv_nsec] ; Divide result given time_res
293
 
293
 
294
+	mov r9, [rsp + 8]
295
+	mov byte [timestr+timestrlen-1], r9b ; set last chr from 1st argument
296
+
294
 	; set the nanosec chars (time_res chars) in timestr
297
 	; set the nanosec chars (time_res chars) in timestr
295
 	mov rbx, 0x2020202020202020
298
 	mov rbx, 0x2020202020202020
296
 	mov rcx, [time_res]
299
 	mov rcx, [time_res]
298
 	procpt_loopns:
301
 	procpt_loopns:
299
 		xor rdx, rdx
302
 		xor rdx, rdx
300
 		div r8
303
 		div r8
301
-		add dl, '0'
304
+		or dl, 0x30 ; '0'
302
 		shl rbx, 8
305
 		shl rbx, 8
303
 		mov bl, dl
306
 		mov bl, dl
304
 		loop procpt_loopns
307
 		loop procpt_loopns
317
 	xor dl, dl
320
 	xor dl, dl
318
 	div r9
321
 	div r9
319
 	mov bl, dl
322
 	mov bl, dl
320
-	add bx, 0x3030
323
+	or bx, 0x3030
321
 	mov word [timestr + 4], bx
324
 	mov word [timestr + 4], bx
322
 
325
 
323
 	xor dl, dl
326
 	xor dl, dl
326
 	xor dl, dl
329
 	xor dl, dl
327
 	div r9
330
 	div r9
328
 	mov bl, dl
331
 	mov bl, dl
329
-	add bx, 0x3030
332
+	or bx, 0x3030
330
 	mov word [timestr + 1], bx
333
 	mov word [timestr + 1], bx
331
 
334
 
332
-	; filling the hours buffer
333
-	; rcx will contain max_digits - digits_count
334
-	; digits max is hourslen - 1
335
-	mov rcx, hourslen - 1
336
-	mov rdi, hours + hourslen - 1
337
-	mov r10, 10
338
-	procpt_loop:
335
+	; using rbx to stores the hours string
336
+	xor rbx, rbx
337
+	mov rcx, HOURSLEN
338
+	mov r8, 10
339
+	procpt_looph:
339
 		xor dl, dl
340
 		xor dl, dl
340
-		div r10
341
-		cmp rax, 0
342
-		jne procpt_loopcont
343
-		cmp dl, 0
344
-		je procpt_loop_end
345
-
346
-		procpt_loopcont:
347
-		xchg al, dl
348
-		add al, 0x30
349
-		stosb
350
-		mov al, dl
351
-		cmp rcx, 0
352
-		je fault
341
+		div r8
342
+		shl rbx, 8
343
+		mov bl, dl
353
 		cmp rax, 0
344
 		cmp rax, 0
354
-		loopne procpt_loop
355
-	procpt_loop_end:
356
-
357
-	; set rcx for 2 digits at least for hours
358
-	mov r9, hourslen - 2
359
-	add rcx, 1
360
-	cmp rcx, r9
361
-	cmovnle rcx, r9
345
+		loopne procpt_looph
346
+	procpt_looph_end:
347
+
348
+	mov r8, HOURSLEN - 2
349
+	cmp rcx, HOURSLEN - 2
350
+	cmovl r8, rcx ; r8 stores hours digit count (at least 2)
351
+	cmp rcx, 0
352
+	jz procpt_looph2_end
353
+	procpt_looph2:
354
+		shl rbx, 8
355
+		loopne procpt_looph2
356
+	procpt_looph2_end:
362
 
357
 
363
-	mov r10, [rsp + 8] ; leading chr as 1st argument
364
-	mov byte [timestr+timestrlen-1], r10b
358
+	mov r9, 0x3030303030303030 ; ASCII convertion
359
+	or rbx, r9
360
+	mov [hours], rbx
365
 
361
 
366
 	mov rax, 1 ; write
362
 	mov rax, 1 ; write
367
 	mov rdi, [rsp + 16] ; fd as 2nd argument
363
 	mov rdi, [rsp + 16] ; fd as 2nd argument
368
-	mov rdx, timestrlen + hourslen
369
-	sub rdx, rcx ; timestr + hours len
370
-	lea rsi, [hours + rcx] ; hours start pointer
364
+	lea rsi, [hours + r8] ; hours start pointer
365
+	mov rdx, timestrlen + HOURSLEN
366
+	sub rdx, r8 ; timestr + hours len
371
 	syscall
367
 	syscall
372
 
368
 
373
 	ret 16
369
 	ret 16

Loading…
Cancel
Save