Advertisement
Guest User

Untitled

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