84 lines
1.3 KiB
ArmAsm
84 lines
1.3 KiB
ArmAsm
global _start
|
|
[bits 32]
|
|
[section .text]
|
|
|
|
%include "utils.s"
|
|
|
|
_start:
|
|
|
|
; read in sequence
|
|
read_seq:
|
|
mov byte [seq_len], 0
|
|
mov esi, [char_ptr]
|
|
mov edi, sequence
|
|
.l:
|
|
call sign_dec_parse
|
|
stosd
|
|
inc byte [seq_len]
|
|
cmp byte [esi-1], 10 ; \n
|
|
je seq_over
|
|
jmp .l
|
|
seq_over:
|
|
mov [char_ptr], esi
|
|
|
|
; calc differences
|
|
mov byte [depth], 1
|
|
calc_diff:
|
|
lea esi, [sequence+4] ; i=1
|
|
mov ebx, [sequence] ; last, i=0
|
|
mov edi, sequence
|
|
xor edx, edx ; all zero flag
|
|
movzx ecx, byte [seq_len]
|
|
dec ecx
|
|
push dword [sequence+ecx*4]
|
|
.l:
|
|
lodsd ; curr
|
|
mov ebp, eax ; save curr
|
|
sub eax, ebx ; curr - last
|
|
setnz dh ; dl = 1 if not zero
|
|
add dl, dh
|
|
stosd ; save in new seq
|
|
mov ebx, ebp ; last = curr
|
|
loop .l
|
|
test edx, edx
|
|
jz .all_zeros
|
|
; we need another layer
|
|
inc byte [depth]
|
|
dec byte [seq_len]
|
|
jmp calc_diff
|
|
.all_zeros:
|
|
xor ebx, ebx ; start diff is 0
|
|
movzx ecx, byte [depth]
|
|
.predict_l:
|
|
pop eax ; curr
|
|
add eax, ebx ; curr += last diff
|
|
mov ebx, eax ; last diff = curr
|
|
loop .predict_l
|
|
call print_sign_dec
|
|
call space
|
|
call space
|
|
add [final_value], eax
|
|
mov eax, [final_value]
|
|
call print_sign_dec
|
|
call newline
|
|
cmp dword [char_ptr], file.over-1
|
|
jb read_seq
|
|
|
|
game_over:
|
|
mov eax, [final_value]
|
|
call print_sign_dec
|
|
jmp exit
|
|
|
|
[section .data]
|
|
final_value: dd 0
|
|
file_lim: dd file.over - file
|
|
dd 0
|
|
file: incbin "input"
|
|
.over:
|
|
char_ptr: dd file
|
|
seq_len: db 0
|
|
depth: db 0
|
|
|
|
[section .bss]
|
|
sequence: resd 32
|