Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- global _start
- bufsize equ 4096
- SYS_EXIT equ 60
- READ_ONLY equ 0
- SYS_READ equ 0
- SYS_OPEN equ 2
- section .bss align=16
- bufor: resb bufsize
- section .text
- exit_error:
- mov rax, SYS_EXIT
- mov rdi, 1
- pop r14
- pop r13
- pop r12
- syscall
- exit_ok:
- mov rax, SYS_EXIT
- xor rdi, rdi
- pop r14
- pop r13
- pop r12
- syscall
- _start:
- cmp qword [rsp], 2
- jne exit_error
- mov rdi, [rsp + 16]
- openFile:
- mov rax, SYS_OPEN
- mov rsi, READ_ONLY
- syscall
- push r12 ;rejestr przechowujący wartość wczytaną z bufora
- push r13 ;rejestr mówiący do której liczby z bufora chcemy się odwołać
- push r14 ;rejestr bedzie slużył do sprawdzania czy wystąpiła liczba
- ;z zakresu 68020 i 2^31, jesli tak to ustawiamy r14 na 0
- cmp rax, 0
- jl exit_error
- mov r14, 1
- mov r8, 1 ;rejestr r8 sprawdza czy wystąpiła sekwencja 6,8,0,2,0
- xor r9, r9 ;rejestr r9 sluży jako licznik sumy
- mov rdi, rax ;deskryptor pliku
- readBuffer: ;wczytywanie kolejnej serii liczb z pliku do bufora
- mov rax, SYS_READ
- mov rsi, bufor
- mov rdx, bufsize
- syscall
- cmp rax, 0
- jl exit_error
- test rax, 11b
- jnz exit_error
- xor r13, r13
- cmp rax, 0
- jz end
- readFromBuf: ;wczytywanie kolejnej liczby z bufora
- mov r12d, dword [bufor+r13]
- bswap r12d
- add r9d, r12d
- cmp r12d, 68020
- je exit_error
- jna notBetween
- cmp r12d, 2147483648
- jnb notBetween
- xor r14, r14
- notBetween: ;liczba nie zawiera się między 68020 a 2^31
- cmp r12, 8
- ja tooBig
- shl r10, 48
- shr r10, 44
- add r10, r12
- cmp r10d, 0110_1000_0000_0010_0000b
- jz foundSequecne
- jmp continue
- tooBig: ;liczba jest większa niż 8
- xor r10, r10
- jmp continue
- foundSequecne: ;znaleziono sekwencję 6,8,0,2,0
- xor r8, r8
- continue:
- add r13, 4
- sub rax, 4
- jz readBuffer
- jmp readFromBuf
- end:
- cmp r14, 0
- jne exit_error
- cmp r8, 0
- jne exit_error
- cmp r9d, 68020
- jne exit_error
- jmp exit_ok
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement