day 1
This commit is contained in:
commit
963309eaee
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*.o
|
||||
a.out
|
3
01/Makefile
Normal file
3
01/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
all:
|
||||
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
|
||||
|
222
01/main.s
Normal file
222
01/main.s
Normal file
@ -0,0 +1,222 @@
|
||||
%define BUFF_LIM 32768
|
||||
|
||||
; call # val val2
|
||||
; int $0x80 eax eax edx -
|
||||
;
|
||||
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
|
||||
; ebx ecx edx esi edi ebp -
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
_start:
|
||||
push 0 ; eof
|
||||
mov eax, 5 ; open
|
||||
mov ebx, filename
|
||||
xor ecx, ecx ; read only
|
||||
int 0x80
|
||||
mov ebx, eax
|
||||
mov eax, 3 ; read
|
||||
mov ecx, read_buff
|
||||
mov edx, BUFF_LIM
|
||||
int 0x80
|
||||
cmp eax, -1 ; err
|
||||
je exit
|
||||
cmp eax, BUFF_LIM
|
||||
je .no_eof
|
||||
; we hit eof
|
||||
inc dword [esp]
|
||||
.no_eof:
|
||||
; parse section
|
||||
lea edi, [read_buff+eax]
|
||||
mov esi, read_buff
|
||||
.cont_read:
|
||||
xor ecx, ecx ; set if first is found
|
||||
; last digit in ebx
|
||||
xor ebx, ebx
|
||||
; counting loop
|
||||
xor eax, eax
|
||||
push eax ; first digit
|
||||
jmp .count_loop_cont
|
||||
.count_loop:
|
||||
lodsb
|
||||
cmp al, 10 ; newline
|
||||
je .next_line
|
||||
cmp al, '0'
|
||||
jl .count_loop_cont
|
||||
cmp al, '9'
|
||||
jg .check_str
|
||||
sub al, '0'
|
||||
; reset string parsing when we got a numeral
|
||||
call reset_string_wheels
|
||||
.matched:
|
||||
test ecx, ecx
|
||||
jnz .have_first
|
||||
mov [esp], eax ; first digit
|
||||
inc ecx
|
||||
.have_first:
|
||||
mov ebx, eax ; set last to current
|
||||
.count_loop_cont:
|
||||
cmp esi, edi
|
||||
jl .count_loop
|
||||
.next_line:
|
||||
test ecx, ecx
|
||||
jz .check_end ; no digits (huh?)
|
||||
pop eax ; first digit
|
||||
mov dl, 10
|
||||
mul dl
|
||||
add eax, ebx
|
||||
; add to total
|
||||
add [final_value], eax
|
||||
.check_end:
|
||||
; reset string parsing when we got a newline
|
||||
call reset_string_wheels
|
||||
; check for more data
|
||||
cmp esi, edi
|
||||
jl .cont_read
|
||||
; TODO handle files over BUFF_LIM bytes
|
||||
; check for EOF
|
||||
cmp dword [esp], 1
|
||||
jne .cont_read
|
||||
; we're at EOF, print result
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
jmp exit
|
||||
.check_str:
|
||||
call weird_string_parser
|
||||
; check result
|
||||
mov al, [matched_value]
|
||||
test al, al
|
||||
jnz .match_found
|
||||
; nothing matched yet
|
||||
; check if we got a word char
|
||||
cmp byte [matched_any_char], 1
|
||||
je .count_loop_cont
|
||||
; not a word char, reset wheels
|
||||
call reset_string_wheels
|
||||
jmp .count_loop_cont
|
||||
.match_found:
|
||||
; we have a match
|
||||
; reset the matched value
|
||||
; and go back to loop
|
||||
mov byte [matched_value], 0
|
||||
jmp .matched
|
||||
|
||||
reset_string_wheels:
|
||||
push edi
|
||||
push ecx
|
||||
push eax
|
||||
mov edi, number_wheels
|
||||
mov ecx, number_lens - number_wheels
|
||||
xor eax, eax
|
||||
rep stosb
|
||||
pop eax
|
||||
pop ecx
|
||||
pop edi
|
||||
ret
|
||||
|
||||
exit:
|
||||
mov eax, 1
|
||||
int 0x80 ; exit
|
||||
|
||||
; i hate this
|
||||
print_dec:
|
||||
sub esp, 12
|
||||
lea ecx, [esp+11]
|
||||
test eax, eax
|
||||
jz .zero
|
||||
mov esi, 0
|
||||
mov ebx, 10
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
div ebx
|
||||
dec ecx
|
||||
inc esi
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
test eax, eax
|
||||
jnz .div_shit
|
||||
mov edx, esi
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [esp+10], 0
|
||||
lea ecx, [esp+10]
|
||||
mov edx, 1 ; count
|
||||
.write:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12
|
||||
ret
|
||||
|
||||
; i'm in hell
|
||||
weird_string_parser:
|
||||
pushad
|
||||
; reset matched any char
|
||||
mov byte [matched_any_char], 0
|
||||
mov edi, number_wheels
|
||||
mov esi, number_lens
|
||||
mov ebp, numbers
|
||||
mov ecx, 0
|
||||
.test_loop:
|
||||
mov edx, ebp
|
||||
; add current wheel value
|
||||
movzx ebx, byte [edi]
|
||||
add edx, ebx
|
||||
; compare to input
|
||||
cmp byte [edx], al
|
||||
jne .next_test_fail
|
||||
; match - increment counter
|
||||
inc bl
|
||||
; test against length
|
||||
cmp byte [esi], bl
|
||||
je .full_match
|
||||
.partial_match:
|
||||
; partial match - save value
|
||||
mov [edi], bl
|
||||
; we matched any char
|
||||
mov byte [matched_any_char], 1
|
||||
jmp .next_test_match
|
||||
.next_test_fail:
|
||||
; reset the current wheel
|
||||
mov byte [edi], 0
|
||||
; check if it's the start of the word
|
||||
cmp byte [ebp], al
|
||||
jne .next_test_match ; nope
|
||||
; yep! save
|
||||
mov bl, 1
|
||||
jmp .partial_match
|
||||
.next_test_match:
|
||||
inc ecx
|
||||
; check if we're done testing
|
||||
cmp ecx, 9
|
||||
jge .done
|
||||
; add current value length to string
|
||||
movzx ebx, byte [esi]
|
||||
add ebp, ebx
|
||||
inc edi
|
||||
inc esi
|
||||
; loop
|
||||
jmp .test_loop
|
||||
.done:
|
||||
popad
|
||||
ret
|
||||
.full_match:
|
||||
; save matched byte
|
||||
inc ecx ; zero -> one
|
||||
mov byte [matched_value], cl
|
||||
; reset this wheel
|
||||
mov byte [edi], 0
|
||||
; next check
|
||||
jmp .next_test_match
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
matched_value: db 0
|
||||
matched_any_char: db 0
|
||||
number_wheels: db 0,0,0,0,0,0,0,0,0
|
||||
number_lens: db 3,3,5,4,4,3,5,5,4
|
||||
numbers: db "onetwothreefourfivesixseveneightnine"
|
||||
filename: db "input",0
|
||||
|
||||
[section .bss]
|
||||
read_buff: resb BUFF_LIM
|
117
01/main_part1.s
Normal file
117
01/main_part1.s
Normal file
@ -0,0 +1,117 @@
|
||||
%define BUFF_LIM 32768
|
||||
|
||||
; call # val val2
|
||||
; int $0x80 eax eax edx -
|
||||
;
|
||||
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
|
||||
; ebx ecx edx esi edi ebp -
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
_start:
|
||||
push 0 ; eof
|
||||
mov eax, 5 ; open
|
||||
mov ebx, filename
|
||||
xor ecx, ecx ; read only
|
||||
int 0x80
|
||||
mov ebx, eax
|
||||
mov eax, 3 ; read
|
||||
mov ecx, read_buff
|
||||
mov edx, BUFF_LIM
|
||||
int 0x80
|
||||
cmp eax, -1 ; err
|
||||
je exit
|
||||
cmp eax, BUFF_LIM
|
||||
je .no_eof
|
||||
; we hit eof
|
||||
inc dword [esp]
|
||||
.no_eof:
|
||||
; parse section
|
||||
lea edi, [read_buff+eax]
|
||||
mov esi, read_buff
|
||||
.cont_read:
|
||||
xor ecx, ecx ; set if first is found
|
||||
; last digit in ebx
|
||||
xor ebx, ebx
|
||||
; counting loop
|
||||
xor eax, eax
|
||||
push eax ; first digit
|
||||
jmp .count_loop_cont
|
||||
.count_loop:
|
||||
lodsb
|
||||
cmp al, 10 ; newline
|
||||
je .next_line
|
||||
sub al, '0'
|
||||
js .count_loop_cont
|
||||
cmp al, 9
|
||||
jg .count_loop_cont
|
||||
test ecx, ecx
|
||||
jnz .have_first
|
||||
mov [esp], eax ; first digit
|
||||
inc ecx
|
||||
.have_first:
|
||||
mov ebx, eax ; set last to current
|
||||
.count_loop_cont:
|
||||
cmp esi, edi
|
||||
jl .count_loop
|
||||
.next_line:
|
||||
test ecx, ecx
|
||||
jz .cont_read ; no digits!
|
||||
pop eax ; first digit
|
||||
mov dl, 10
|
||||
mul dl
|
||||
add eax, ebx
|
||||
; add to total
|
||||
add [final_value], eax
|
||||
; check for more data
|
||||
cmp esi, edi
|
||||
jl .cont_read
|
||||
; TODO handle files over BUFF_LIM bytes
|
||||
; check for EOF
|
||||
cmp dword [esp], 1
|
||||
jne .cont_read
|
||||
; we're at EOF, print result
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
jmp exit
|
||||
|
||||
exit:
|
||||
mov eax, 1
|
||||
int 0x80 ; exit
|
||||
|
||||
; i hate this
|
||||
print_dec:
|
||||
sub esp, 12
|
||||
lea ecx, [esp+11]
|
||||
test eax, eax
|
||||
jz .zero
|
||||
mov esi, 0
|
||||
mov ebx, 10
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
div ebx
|
||||
dec ecx
|
||||
inc esi
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
test eax, eax
|
||||
jnz .div_shit
|
||||
mov edx, esi
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [esp+10], 0
|
||||
lea ecx, [esp+10]
|
||||
mov edx, 1 ; count
|
||||
.write:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12
|
||||
ret
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
filename: db "input",0
|
||||
|
||||
[section .bss]
|
||||
read_buff: resb BUFF_LIM
|
Loading…
Reference in New Issue
Block a user