Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. global  _start
  2.    
  3. bufsize equ 4096
  4. SYS_EXIT equ 60
  5. READ_ONLY equ 0
  6. SYS_READ equ 0
  7. SYS_OPEN equ 2
  8.  
  9.  
  10. section .bss align=16
  11.     bufor: resb bufsize
  12.  
  13. section .text
  14.  
  15. exit_error:
  16.     mov rax, SYS_EXIT
  17.     mov rdi, 1
  18.     pop r14
  19.     pop r13
  20.     pop r12
  21.     syscall
  22.  
  23. exit_ok:
  24.     mov rax, SYS_EXIT
  25.     xor rdi, rdi  
  26.     pop r14
  27.     pop r13
  28.     pop r12
  29.     syscall
  30.  
  31. _start:
  32.     cmp qword [rsp], 2
  33.     jne exit_error
  34.     mov rdi, [rsp + 16]
  35.  
  36. openFile:
  37.     mov rax, SYS_OPEN
  38.     mov rsi, READ_ONLY
  39.     syscall
  40.     push r12                            ;rejestr przechowujący wartość wczytaną z bufora
  41.     push r13                            ;rejestr mówiący do której liczby z bufora chcemy się odwołać
  42.     push r14                            ;rejestr bedzie slużył do sprawdzania czy wystąpiła liczba
  43.                                         ;z zakresu 68020 i 2^31, jesli tak to ustawiamy r14 na 0
  44.     cmp rax, 0
  45.     jl exit_error
  46.     mov r14, 1
  47.     mov r8, 1                           ;rejestr r8 sprawdza czy wystąpiła sekwencja 6,8,0,2,0
  48.     xor r9, r9                          ;rejestr r9 sluży jako licznik sumy
  49.     mov rdi,  rax                       ;deskryptor pliku
  50.  
  51. readBuffer:                             ;wczytywanie kolejnej serii liczb z pliku do bufora
  52.     mov rax, SYS_READ
  53.     mov rsi, bufor
  54.     mov rdx, bufsize
  55.     syscall
  56.     cmp rax, 0
  57.     jl exit_error
  58.     test rax, 11b
  59.     jnz exit_error
  60.     xor r13, r13
  61.     cmp rax, 0
  62.     jz end
  63.  
  64. readFromBuf:                            ;wczytywanie kolejnej liczby z bufora
  65.     mov r12d, dword [bufor+r13]
  66.     bswap r12d
  67.     add r9d, r12d
  68.     cmp r12d, 68020
  69.     je exit_error
  70.     jna notBetween
  71.     cmp r12d, 2147483648
  72.     jnb notBetween
  73.     xor r14, r14
  74.  
  75. notBetween:                             ;liczba nie zawiera się między 68020 a 2^31
  76.     cmp r12, 8
  77.     ja tooBig
  78.     shl r10, 48
  79.     shr r10, 44
  80.     add r10, r12
  81.     cmp r10d, 0110_1000_0000_0010_0000b
  82.     jz foundSequecne
  83.     jmp continue
  84.  
  85.  
  86. tooBig:                                 ;liczba jest większa niż 8
  87.     xor r10, r10
  88.     jmp continue
  89.  
  90. foundSequecne:                          ;znaleziono sekwencję 6,8,0,2,0
  91.     xor r8, r8
  92.  
  93. continue:
  94.     add r13, 4
  95.     sub rax, 4
  96.     jz readBuffer
  97.     jmp readFromBuf
  98.  
  99. end:
  100.     cmp r14, 0
  101.     jne exit_error
  102.     cmp r8, 0
  103.     jne exit_error
  104.     cmp r9d, 68020
  105.     jne exit_error
  106.     jmp exit_ok
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement