Advertisement
Guest User

Untitled

a guest
Oct 8th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .text
  2.  
  3. string_length:
  4.  xor rax, rax
  5.  .loop:
  6.  cmp byte[rdi + rax], 0
  7.  jz .string_length_ret
  8.  inc rax
  9.  jmp .loop
  10.  .string_length_ret:
  11.  ret
  12. print_string:
  13.  call string_length
  14.  mov rsi, rdi
  15.  mov rdx, rax
  16.  mov rax, 1
  17.  mov rdi, 1
  18.  syscall
  19.  ret
  20. print_char:
  21. push rdi
  22. mov rdi, rsp
  23. call print_string
  24. pop rdi
  25. ret
  26. print_newline:
  27.  mov rdi, 0xA
  28.  call print_char
  29.  ret
  30. print_uint:
  31.  push 0
  32.  mov rsi, rsp
  33.  times 8 push 0 ; creating buffer on stack
  34.  mov rax, rdi ; devidend
  35.  mov rdx, 0 ; end of the future string
  36.  mov [rsi], rdx
  37.  dec rsi
  38.  .loop:
  39.  mov rbx, 10 ; devider
  40.  mov rdx, 0 ; remainder
  41.  div rbx ; rax div rbx
  42.  add rdx, 0x30 ; add 0x30 so that number matches it's code in ASCII
  43.  mov [rsi], dl ; move to buffer
  44.  dec rsi
  45.  cmp rax, 0 ; check if number has ended
  46.  jnz .loop
  47.  inc rsi
  48.  mov rdi, rsi ; pass string address on stack as argument to print_string
  49.  call print_string
  50.  times 9 pop rax ; restore rsp
  51.  ret
  52. print_int: ;wtf
  53.  mov rax, rdi
  54.  cmp rax, 0
  55.  jl .neg
  56.  call print_uint
  57.  jmp .end
  58.  .neg:
  59.  mov rdi, '-'
  60.  push rax
  61.  call print_char
  62.  pop rax
  63.  neg rax
  64.  mov rdi, rax
  65.  call print_uint
  66.  .end:
  67.  ret
  68. string_equals:
  69.  xor rcx, rcx
  70.  .string_equals_loop:
  71.  mov r10b, [rdi+rcx] ; maybe byte
  72.  mov r11b, [rsi+rcx]
  73.  cmp r10b, r11b
  74.  jne .string_equals_fail
  75.  inc rcx
  76.  test r10b, r10b
  77.  jz .string_equals_null_check
  78.  jmp .string_equals_loop
  79.  .string_equals_null_check:
  80.  test r11b, r11b
  81.  jnz .string_equals_fail
  82.  mov rax, 1
  83.  ret
  84.  .string_equals_fail:
  85.  mov rax, 0
  86.  ret
  87. ; uses: rax, rdi, rdx, rsi
  88. read_char:
  89.  xor rax, rax ; syscall #1 read
  90.  xor rdi, rdi; stdin $0
  91.  mov rdx, 1 ; read 1 byte
  92.  push rax ; reserve place on stack for input
  93.  mov rsi, rsp ; save char on stack
  94.  syscall
  95.  pop rax ; return char in rax
  96.  ret
  97. read_word:
  98.  push r12 ; save used registers
  99.  push r13
  100.  mov r12, rdi ; move buffer address and buffer size to callee-saved regs
  101.  mov r13, rsi ; to avoid pushing and popping them later
  102.  .read_word_skip_whitespaces:
  103.  call read_char
  104.  cmp al, 0x9 ; tabulation
  105.  je .read_word_skip_whitespaces
  106.  cmp al, 0x10 ; line break
  107.  je .read_word_skip_whitespaces
  108.  cmp al, 0x20 ; space
  109.  je .read_word_skip_whitespaces
  110.  mov rcx, -1 ; initialize rcx with -1
  111.  .read_word_reading_chars:
  112.  inc rcx ; increase the letter counter
  113.  cmp al, 0 ; check for null-termination
  114.  je .read_word_success
  115.  cmp al, 0x20 ; check for space after word
  116.  je .read_word_success
  117.  mov [r12+rcx], al ; move the result of read_char to buffer
  118.  cmp r13, rcx ; check if letter count is bigger than buffer size
  119.  jbe .read_word_fail
  120.  push rcx
  121.  call read_char ; read next char
  122.  pop rcx
  123.  jmp .read_word_reading_chars
  124.  .read_word_fail:
  125.  mov rax, 0
  126.  pop r13
  127.  pop r12
  128.  mov rdx, rcx
  129.  ret
  130.  .read_word_success:
  131.  mov byte[r12+rcx], 0
  132.  mov rax, r12 ; return buffer address or 0
  133.  pop r13 ; restore used registers
  134.  pop r12
  135.  mov rdx, rcx
  136.  ret
  137. parse_uint:
  138.  xor rsi, rsi
  139.  xor rcx, rcx
  140.  xor rax, rax
  141.  mov r10, 10
  142.  .parse_uint_loop:
  143.  mov sil, [rdi+rcx]
  144.  cmp sil, 0x30
  145.  jb .parse_uint_ret
  146.  cmp sil, 0x39
  147.  ja .parse_uint_ret
  148.  sub sil, 0x30
  149.  mul r10
  150.  add rax, rsi
  151.  inc rcx
  152.  jmp .parse_uint_loop
  153.  .parse_uint_ret:
  154.  mov rdx, rcx
  155.  ret
  156. parse_int:
  157.  cmp byte[rdi], '-'
  158.  je .parse_int_negative
  159.  call parse_uint
  160.  ret
  161.  .parse_int_negative:
  162.  inc rdi
  163.  call parse_uint
  164.  test rdx, rdx
  165.  jz .parse_int_ret
  166.  neg rax
  167.  inc rdx
  168.  .parse_int_ret:
  169.  ret
  170.  
  171. string_copy:
  172.  xor r10, r10
  173.  push rsi
  174.  push rdi
  175.  push rdx
  176.  call string_length
  177.  pop rdx
  178.  pop rdi
  179.  pop rsi
  180.  inc rax
  181.  cmp rdx, rax
  182.  jl .string_copy_fail
  183.  xor rcx, rcx
  184.  .loop:
  185.  mov r10, [rdi+rcx]
  186.  mov [rsi+rcx], r10
  187.  inc rcx
  188.  dec rax
  189.  jnz .loop
  190.  jmp .string_copy_end
  191.  
  192.  .string_copy_fail:
  193.  mov rax, 0
  194.  .string_copy_end:
  195.  ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement