161 lines
2.3 KiB
ArmAsm
161 lines
2.3 KiB
ArmAsm
|
global _start
|
||
|
[bits 32]
|
||
|
[section .text]
|
||
|
|
||
|
%include "utils.s"
|
||
|
|
||
|
_start:
|
||
|
|
||
|
; HASH
|
||
|
mov esi, file
|
||
|
xor ebx, ebx ; current value
|
||
|
xor edi, edi ; current label high
|
||
|
xor ecx, ecx ; current label low
|
||
|
mov ebp, 17 ; mul value
|
||
|
hash:
|
||
|
movzx eax, byte [esi]
|
||
|
inc esi
|
||
|
cmp al, 10
|
||
|
je next_seq
|
||
|
cmp al, '-'
|
||
|
je minus
|
||
|
cmp al, '='
|
||
|
je equals
|
||
|
; save label
|
||
|
cmp ecx, 0x00ffffff
|
||
|
ja .needs_high
|
||
|
shl ecx, 8
|
||
|
mov cl, al
|
||
|
jmp .do_hash
|
||
|
.needs_high:
|
||
|
xchg eax, edi
|
||
|
shl eax, 8
|
||
|
mov al, cl
|
||
|
xchg eax, edi
|
||
|
mov cl, al
|
||
|
.do_hash:
|
||
|
; do HASH
|
||
|
; current += new
|
||
|
add eax, ebx
|
||
|
; current *= 17
|
||
|
mul ebp
|
||
|
; current %= 256
|
||
|
movzx ebx, al
|
||
|
jmp hash
|
||
|
; i'm not using a linked list whatever
|
||
|
minus:
|
||
|
; box *box = boxes+current*1024
|
||
|
shl ebx, 10
|
||
|
lea ebp, [ebx+boxes]
|
||
|
lea ebx, [ebx+boxes+4]
|
||
|
; box->max
|
||
|
mov eax, [ebp]
|
||
|
.find_eq:
|
||
|
test eax, eax
|
||
|
jz .done
|
||
|
dec eax
|
||
|
cmp [ebx], ecx
|
||
|
jne .cont
|
||
|
cmp [ebx+4], edi
|
||
|
jne .cont
|
||
|
xchg esi, edx
|
||
|
; remove match, move others down
|
||
|
mov edi, ebx
|
||
|
lea esi, [ebx+12]
|
||
|
; len = eax*8 + eax*4
|
||
|
mov ecx, eax
|
||
|
shl ecx, 3
|
||
|
shl eax, 2
|
||
|
add ecx, eax
|
||
|
rep movsd
|
||
|
xchg esi, edx
|
||
|
; decrease max
|
||
|
dec dword [ebp]
|
||
|
jmp .done
|
||
|
.cont:
|
||
|
add ebx, 12
|
||
|
jmp .find_eq
|
||
|
.done:
|
||
|
inc esi
|
||
|
jmp next_seq
|
||
|
equals:
|
||
|
; box *box = boxes+current*1024
|
||
|
shl ebx, 10
|
||
|
lea ebp, [ebx+boxes]
|
||
|
lea ebx, [ebx+boxes+4]
|
||
|
; box->max
|
||
|
mov eax, [ebp]
|
||
|
.find_eq:
|
||
|
test eax, eax
|
||
|
jz .no_match
|
||
|
dec eax
|
||
|
cmp [ebx], ecx
|
||
|
jne .cont
|
||
|
cmp [ebx+4], edi
|
||
|
jne .cont
|
||
|
; update match
|
||
|
mov al, [esi] ; ascii num
|
||
|
sub al, '0' ; to binary
|
||
|
mov [ebx+8], al
|
||
|
jmp .done
|
||
|
.cont:
|
||
|
add ebx, 12
|
||
|
jmp .find_eq
|
||
|
.no_match:
|
||
|
; new entry
|
||
|
mov [ebx], ecx
|
||
|
mov [ebx+4], edi
|
||
|
mov al, [esi]
|
||
|
sub al, '0'
|
||
|
mov [ebx+8], al
|
||
|
; inc max
|
||
|
inc dword [ebp]
|
||
|
.done:
|
||
|
add esi, 2
|
||
|
next_seq:
|
||
|
xor ebx, ebx ; current value
|
||
|
xor edi, edi ; current label high
|
||
|
xor ecx, ecx ; current label low
|
||
|
mov ebp, 17 ; mul value
|
||
|
cmp esi, file.over
|
||
|
jb hash
|
||
|
|
||
|
mov esi, boxes
|
||
|
calc_shit:
|
||
|
cmp dword [esi], 0
|
||
|
je .cont
|
||
|
mov edi, esi
|
||
|
sub edi, boxes
|
||
|
shr edi, 10 ; box idx
|
||
|
inc edi ; box num
|
||
|
mov ecx, 1 ; slot num
|
||
|
lea ebx, [esi+4] ; lenses
|
||
|
.inner:
|
||
|
mov eax, edi ; box num
|
||
|
mul ecx ; slot num
|
||
|
mul dword [ebx+8] ; focal length
|
||
|
add [final_value], eax
|
||
|
add ebx, 12
|
||
|
inc ecx
|
||
|
cmp ecx, [esi]
|
||
|
jbe .inner
|
||
|
.cont:
|
||
|
add esi, 1024
|
||
|
cmp esi, boxes.end
|
||
|
jb calc_shit
|
||
|
|
||
|
game_over:
|
||
|
mov eax, [final_value]
|
||
|
call print_dec
|
||
|
call newline
|
||
|
jmp exit
|
||
|
|
||
|
[section .data]
|
||
|
final_value: dd 0
|
||
|
file: incbin "input"
|
||
|
.over:
|
||
|
|
||
|
[section .bss]
|
||
|
boxes: resb 256*1024
|
||
|
.end:
|