|
@@ -66,7 +66,7 @@ section .data
|
66
|
66
|
|
67
|
67
|
ts_sleep:
|
68
|
68
|
tv_sleep_s dq 0
|
69
|
|
- tv_sleep_us dq 10000000
|
|
69
|
+ tv_sleep_us dq 10000000 ; set for 4 digits bellow seconds
|
70
|
70
|
|
71
|
71
|
;; 1/2s sleep
|
72
|
72
|
;ts_sleep:
|
|
@@ -81,11 +81,27 @@ section .data
|
81
|
81
|
db 0xA
|
82
|
82
|
startmsglen: equ $ - startmsg
|
83
|
83
|
|
|
84
|
+ usage_pre: db "Usage : "
|
|
85
|
+ usage_prelen: equ $ - usage_pre
|
|
86
|
+
|
|
87
|
+ usage_post: db " [-h] [-r NDIGITS]", 0xA
|
|
88
|
+ db "Options :", 0xA
|
|
89
|
+ db 0x9, "-h print this help and exit", 0xA
|
|
90
|
+ db 0x9, "-r Number of digits bellow seconds, between [1..8]"
|
|
91
|
+ db 0xA
|
|
92
|
+ usage_postlen: equ $ - usage_post
|
|
93
|
+
|
|
94
|
+ badarg_msg: db "Unexpected argument : "
|
|
95
|
+ badarg_msglen: equ $ - badarg_msg
|
|
96
|
+
|
|
97
|
+ badval_msg: db "Value for -r should be in [1..8] but got "
|
|
98
|
+ badval_msglen: equ $ - badval_msg
|
|
99
|
+
|
84
|
100
|
hours: db "000000000"
|
85
|
101
|
timestr: db ":00:00.0 ", 0x0a
|
86
|
102
|
timestrlen: equ $ - timestr
|
87
|
103
|
|
88
|
|
- time_res: dq 3 ; 3 digits bellow seconds
|
|
104
|
+ time_res: dq 4 ; 4 digits bellow seconds
|
89
|
105
|
|
90
|
106
|
nl: db 0x0A
|
91
|
107
|
buf: db 0
|
|
@@ -103,6 +119,10 @@ section .text
|
103
|
119
|
global _start
|
104
|
120
|
_start:
|
105
|
121
|
|
|
122
|
+; parse arguments and set time_res value
|
|
123
|
+jmp arg_parse
|
|
124
|
+arg_ok:
|
|
125
|
+
|
106
|
126
|
; set stdin non blocking
|
107
|
127
|
xor rdx, rdx
|
108
|
128
|
xor rdi, rdi
|
|
@@ -432,4 +452,116 @@ sig_restorer:
|
432
|
452
|
xor rdi, rdi
|
433
|
453
|
syscall
|
434
|
454
|
|
|
455
|
+;
|
|
456
|
+; Argument parsing
|
|
457
|
+;
|
|
458
|
+arg_parse:
|
|
459
|
+ ; Checking argument count
|
|
460
|
+ mov rax, [rsp]
|
|
461
|
+ cmp rax, 3
|
|
462
|
+ je parse_r
|
|
463
|
+ cmp rax, 1
|
|
464
|
+ je arg_ok
|
|
465
|
+ ; If 1 argument only it can only be -h
|
|
466
|
+ arg_err: ; badval & badarg jmp here too
|
|
467
|
+ mov rax, [rsp+8] ; argv[0] program name
|
|
468
|
+ mov rdi, -1 ; return status
|
|
469
|
+ jmp usage
|
|
470
|
+ parse_r:
|
|
471
|
+ mov rax, [rsp+16] ; 1st arg should be "-r"
|
|
472
|
+ mov bl, [rax]
|
|
473
|
+ cmp bl, '-'
|
|
474
|
+ jne badarg
|
|
475
|
+ mov bl, [rax+1]
|
|
476
|
+ cmp bl, 'h' ; -h given with another argument
|
|
477
|
+ je arg_err
|
|
478
|
+ cmp bl, 'r'
|
|
479
|
+ jne badarg
|
|
480
|
+ mov bl, [rax+2]
|
|
481
|
+ cmp bl, 0
|
|
482
|
+ ; the 1st argument is -r the second must be a 1 digit integer in [1..8]
|
|
483
|
+ mov rax, [rsp+24]
|
|
484
|
+ xor rbx, rbx
|
|
485
|
+ mov bl, [rax]
|
|
486
|
+ cmp bl, '1'
|
|
487
|
+ jl badval
|
|
488
|
+ cmp bl, '8'
|
|
489
|
+ jg badval
|
|
490
|
+ sub bl, '0'
|
|
491
|
+ dbg1:
|
|
492
|
+ mov [time_res], rbx
|
|
493
|
+ jmp arg_ok
|
|
494
|
+
|
|
495
|
+badval: ; print an error message, usage and exit
|
|
496
|
+ mov rsi, badval_msg
|
|
497
|
+ mov rdx, badval_msglen
|
|
498
|
+ mov rax, [rsp+24]
|
|
499
|
+ jmp arg_strerr
|
|
500
|
+
|
|
501
|
+badarg: ; print an error message, usage and exit
|
|
502
|
+ mov rsi, badarg_msg
|
|
503
|
+ mov rdx, badarg_msglen
|
|
504
|
+ mov rax, [rsp+16]
|
|
505
|
+ jmp arg_strerr
|
|
506
|
+
|
|
507
|
+arg_strerr: ; rsi msg ptr, rdx msg len, rax arg ptr
|
|
508
|
+ mov r8, rax
|
|
509
|
+ mov rax, 1
|
|
510
|
+ mov rdi, 1
|
|
511
|
+ syscall
|
|
512
|
+ mov rsi, r8
|
|
513
|
+ mov rax, r8
|
|
514
|
+ call strlen
|
|
515
|
+ mov rax, 1
|
|
516
|
+ syscall
|
|
517
|
+ mov rax, 1
|
|
518
|
+ mov rsi, nl
|
|
519
|
+ mov rdx, 1
|
|
520
|
+ syscall
|
|
521
|
+ syscall
|
|
522
|
+ jmp arg_err
|
|
523
|
+
|
|
524
|
+;
|
|
525
|
+; Print usage and exit
|
|
526
|
+; Except rax to point on programm name and rdi to be the return code
|
|
527
|
+;
|
|
528
|
+usage:
|
|
529
|
+ push rdi
|
|
530
|
+ push rax
|
|
531
|
+
|
|
532
|
+ mov rax, 1 ; write
|
|
533
|
+ mov rdi, 1 ; stdout
|
|
534
|
+ mov rsi, usage_pre
|
|
535
|
+ mov rdx, usage_prelen
|
|
536
|
+ syscall
|
|
537
|
+
|
|
538
|
+ pop rsi
|
|
539
|
+ mov rax, rsi
|
|
540
|
+ call strlen
|
|
541
|
+ mov rax, 1
|
|
542
|
+ syscall
|
|
543
|
+
|
|
544
|
+ mov rax, 1
|
|
545
|
+ mov rsi, usage_post
|
|
546
|
+ mov rdx, usage_postlen
|
|
547
|
+ syscall
|
|
548
|
+
|
|
549
|
+ mov rax, 60
|
|
550
|
+ pop rdi
|
|
551
|
+ syscall
|
|
552
|
+
|
|
553
|
+; With rax pointing on the string, the result will be in rdx
|
|
554
|
+strlen:
|
|
555
|
+ mov r8, rax
|
|
556
|
+ mov r9, r8
|
|
557
|
+ sub r9, 1
|
|
558
|
+ strlen_loop:
|
|
559
|
+ add r9, 1
|
|
560
|
+ mov al, [r9]
|
|
561
|
+ cmp al, 0
|
|
562
|
+ jne strlen_loop
|
|
563
|
+ sub r9, r8
|
|
564
|
+ mov rdx, r9
|
|
565
|
+ ret
|
|
566
|
+
|
435
|
567
|
.end:
|