Yann Weber 5 лет назад
Родитель
Сommit
5091c3a0d5
1 измененных файлов: 56 добавлений и 9 удалений
  1. 56
    9
      wtfstopw.asm

+ 56
- 9
wtfstopw.asm Просмотреть файл

87
 	nl: db 0x0A
87
 	nl: db 0x0A
88
 	buf: db 0
88
 	buf: db 0
89
 
89
 
90
-	lapsmsg: db 0x0d, "New lap : "
90
+	lapsmsg: db 0x0d, "Lap : "
91
 	lapsmsglen: equ $ - lapsmsg
91
 	lapsmsglen: equ $ - lapsmsg
92
 
92
 
93
+	lapcount: db "00000000"
94
+	lapcountlen: equ $ - lapcount
95
+	laplen: dq 2
96
+
93
 section .text
97
 section .text
94
 global _start
98
 global _start
95
 _start:
99
 _start:
108
 cmp rax, 0
112
 cmp rax, 0
109
 jne fault
113
 jne fault
110
 
114
 
115
+; initializing lapptr
116
+
111
 ; preparing SIGINT catch
117
 ; preparing SIGINT catch
112
-mov rax, lap_handler
118
+mov rax, proc_lap_handler
113
 mov qword [sigaction.sa_handler], rax
119
 mov qword [sigaction.sa_handler], rax
114
 mov eax, 0x10000000 ; SA_RESTART
120
 mov eax, 0x10000000 ; SA_RESTART
115
 or eax, 0x04000000 ; SA_RESTORER
121
 or eax, 0x04000000 ; SA_RESTORER
134
 main_loop:
140
 main_loop:
135
 	push 2 ; stderr
141
 	push 2 ; stderr
136
 	push 0x0D ; \r
142
 	push 0x0D ; \r
137
-	call print_time
143
+	call proc_print_time
138
 
144
 
139
 	; Attempt to read from stdin
145
 	; Attempt to read from stdin
140
 	; if something read, enter has been pressed
146
 	; if something read, enter has been pressed
193
 ;
199
 ;
194
 ; Print current time on FD r10 and put r13b as leading char
200
 ; Print current time on FD r10 and put r13b as leading char
195
 ;
201
 ;
196
-print_time:
202
+proc_print_time:
197
 	pop r8
203
 	pop r8
198
 	pop r9
204
 	pop r9
199
 	pop r10
205
 	pop r10
317
 
323
 
318
 	ret
324
 	ret
319
 
325
 
320
-
321
-lap_handler:
326
+;
327
+;	sig handler for SIGINT displaying lap count and time on stdout
328
+;
329
+proc_lap_handler:
322
 	mov rax, 1
330
 	mov rax, 1
323
 	mov rdi, 1
331
 	mov rdi, 1
324
 	mov rsi, lapsmsg
332
 	mov rsi, lapsmsg
325
-	mov rdx, lapsmsglen
333
+	mov rdx, 5 ; "Lap "
334
+	syscall
335
+
336
+	; increment the lapcount str directly
337
+	mov rbx, lapcount ; first digit ptr
338
+	add rbx, lapcountlen ; rightmost digit ptr
339
+	sub rbx, 1
340
+	mov r8, 1 ; counter
341
+	lap_handler_inc_lap:
342
+		mov r10b, [rbx]
343
+		cmp r10b, 0x39 ; '9'
344
+		jl lap_handler_inc_end
345
+
346
+		add r8, 1
347
+		cmp r8, [laplen]
348
+		jl lap_handler_laplen_noupd
349
+		mov [laplen], r8 ; update laplen
350
+
351
+		lap_handler_laplen_noupd:
352
+		mov byte [rbx], 0x30 ; set current digit to '0'
353
+		sub rbx, 1
354
+		cmp rbx, lapcount
355
+		jl fault
356
+		jmp lap_handler_inc_lap
357
+	lap_handler_inc_end:
358
+		add r10b, 1
359
+		mov [rbx], r10b
360
+	
361
+
362
+	mov rax, 1
363
+	mov rdi, 1
364
+	mov rdx, [laplen]
365
+	mov rsi, lapcount
366
+	add rsi, lapcountlen
367
+	sub rsi, rdx ; leftmost digit ptr
368
+	syscall
369
+
370
+	mov rax, 1
371
+	mov rdi, 1
372
+	mov rsi, lapsmsg + 4
373
+	mov rdx, 3 ; " : "
326
 	syscall
374
 	syscall
327
 
375
 
328
 	push 1 ; stdout
376
 	push 1 ; stdout
329
 	push 0x0A ; \n
377
 	push 0x0A ; \n
330
-	call print_time
378
+	call proc_print_time
331
 
379
 
332
-dbg2:
333
 	ret
380
 	ret
334
 
381
 
335
 sig_restorer:
382
 sig_restorer:

Загрузка…
Отмена
Сохранить