Work on problem 2 in fasm
This commit is contained in:
parent
708e2caf3c
commit
c09f3d0a7d
@ -3,6 +3,7 @@ include "lib/linux_syscall.inc"
|
|||||||
include "lib/print.inc"
|
include "lib/print.inc"
|
||||||
include "lib/itoa.inc"
|
include "lib/itoa.inc"
|
||||||
include "lib/file.inc"
|
include "lib/file.inc"
|
||||||
|
include "lib/string.inc"
|
||||||
|
|
||||||
segment readable executable
|
segment readable executable
|
||||||
entry main
|
entry main
|
||||||
@ -11,8 +12,14 @@ main:
|
|||||||
mov rdi, input_filename
|
mov rdi, input_filename
|
||||||
call load_file
|
call load_file
|
||||||
|
|
||||||
call part_1
|
mov r8, [input]
|
||||||
|
mov [input_pointer], r8
|
||||||
|
|
||||||
|
.go:
|
||||||
|
call print_line
|
||||||
|
jmp .go
|
||||||
|
|
||||||
|
call unload_file
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
part_1:
|
part_1:
|
||||||
@ -24,10 +31,67 @@ part_1:
|
|||||||
call print_c_string
|
call print_c_string
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
print_line:
|
||||||
|
mov r11, 0
|
||||||
|
mov rdi, [input_pointer]
|
||||||
|
mov rsi, current_line
|
||||||
|
mov dl, 'x'
|
||||||
|
call copy_until_token_to_string
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call atoi
|
||||||
|
add r11, rax
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call string_length
|
||||||
|
add [input_pointer], rax
|
||||||
|
inc [input_pointer]
|
||||||
|
|
||||||
|
alarm r11
|
||||||
|
|
||||||
|
mov rdi, [input_pointer]
|
||||||
|
mov rsi, current_line
|
||||||
|
mov dl, 'x'
|
||||||
|
call copy_until_token_to_string
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call atoi
|
||||||
|
add r11, rax
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call string_length
|
||||||
|
add [input_pointer], rax
|
||||||
|
inc [input_pointer]
|
||||||
|
|
||||||
|
alarm r11
|
||||||
|
|
||||||
|
mov rdi, [input_pointer]
|
||||||
|
mov rsi, current_line
|
||||||
|
mov dl, 10
|
||||||
|
call copy_until_token_to_string
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call atoi
|
||||||
|
add r11, rax
|
||||||
|
|
||||||
|
mov rdi, current_line
|
||||||
|
call string_length
|
||||||
|
add [input_pointer], rax
|
||||||
|
inc [input_pointer]
|
||||||
|
|
||||||
|
alarm r11
|
||||||
|
|
||||||
|
alarm 0
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
segment readable writable
|
segment readable writable
|
||||||
input_filename db '../data/2015/2/input.txt', 0
|
input_filename db '../data/2015/2/input.txt', 0
|
||||||
|
input_pointer dq -1
|
||||||
part_1_verbiage db 'Part 1: '
|
part_1_verbiage db 'Part 1: '
|
||||||
part_1_answer db ' ', 0
|
part_1_answer db ' ', 0
|
||||||
part_2_verbiage db 'Part 2: '
|
part_2_verbiage db 'Part 2: '
|
||||||
part_2_answer db ' ', 0
|
part_2_answer db ' ', 0
|
||||||
number db '42069', 0
|
number db '42069', 0
|
||||||
|
current_line db ' ', 0
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
year=$1
|
year=$1
|
||||||
day=$2
|
day=$2
|
||||||
|
|
||||||
bin/fasm $year/$day/problem.asm $year/$day/problem && time ./$year/$day/problem
|
bin/fasm $year/$day/problem.asm $year/$day/problem && strace ./$year/$day/problem
|
||||||
|
71
fasm/lib/string.inc
Normal file
71
fasm/lib/string.inc
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
;;; rdi should contain the source to copy from
|
||||||
|
;;; rsi should contain the destination pointer
|
||||||
|
;;; rdx should contain the number of bytes to copy
|
||||||
|
copy_mem_to_string:
|
||||||
|
cmp rdx, 0
|
||||||
|
jz .finish
|
||||||
|
mov r8, [rdi]
|
||||||
|
mov [rsi], r8
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
dec rdx
|
||||||
|
jmp copy_mem_to_string
|
||||||
|
|
||||||
|
.finish:
|
||||||
|
mov byte [rsi], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
;;; rdi should contain the source to copy from
|
||||||
|
;;; rsi should contain the destination pointer
|
||||||
|
copy_line_to_string:
|
||||||
|
mov rax, 0
|
||||||
|
.start:
|
||||||
|
cmp byte [rdi], 10
|
||||||
|
jz .finish
|
||||||
|
|
||||||
|
mov r8, [rdi]
|
||||||
|
mov [rsi], r8
|
||||||
|
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
inc rax
|
||||||
|
jmp copy_line_to_string
|
||||||
|
|
||||||
|
.finish:
|
||||||
|
mov byte [rsi], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
;;; rdi should contain the source to copy from
|
||||||
|
;;; rsi should contain the destination pointer
|
||||||
|
;;; dl should contain the delimiter
|
||||||
|
copy_until_token_to_string:
|
||||||
|
mov rax, 0
|
||||||
|
.start:
|
||||||
|
cmp byte [rdi], dl
|
||||||
|
jz .finish
|
||||||
|
|
||||||
|
mov r8, [rdi]
|
||||||
|
mov [rsi], r8
|
||||||
|
|
||||||
|
inc rsi
|
||||||
|
inc rdi
|
||||||
|
inc rax
|
||||||
|
jmp copy_until_token_to_string
|
||||||
|
|
||||||
|
.finish:
|
||||||
|
mov byte [rsi], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
;;; rdi should contain the string to measure
|
||||||
|
string_length:
|
||||||
|
mov rax, 0
|
||||||
|
.start:
|
||||||
|
cmp byte [rdi], 0
|
||||||
|
jz .finish
|
||||||
|
|
||||||
|
inc rdi
|
||||||
|
inc rax
|
||||||
|
jmp string_length
|
||||||
|
|
||||||
|
.finish:
|
||||||
|
ret
|
Loading…
Reference in New Issue
Block a user