Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .section .data
  2. .equ SYS_OPEN, 5
  3. .equ SYS_WRITE, 4
  4. .equ SYS_READ, 3
  5. .equ SYS_CLOSE, 6
  6. .equ SYS_EXIT, 1
  7.  
  8. .equ O_RDONLY, 0
  9. .equ O_CREAT_WRONLY_TRUNC, 03101
  10.  
  11. .equ STDIN, 0
  12. .equ STDOUT, 1
  13. .equ STDERR, 2
  14. .equ LINUX_SYSCALL, 0x80
  15. .equ END_OF_FILE, 0
  16. .equ NUMBER_ARGUEMNTS, 2
  17.  
  18. .section .bss
  19. .equ BUFFER_SIZE, 500
  20. .lcomm BUFFER_DATA, BUFFER_SIZE
  21.  
  22. .section .text
  23. .equ ST_SIZE_RESERVE, 16
  24. .equ ST_FD_IN, -8
  25. .equ ST_FD_OUT, -16
  26. .equ ST_ARGC, 0
  27. .equ ST_ARGV_1, 8
  28. .equ ST_ARGV_1, 16
  29. .equ ST_ARGV_2, 24
  30.  
  31. .globl _start
  32. _start:
  33. mov %rsp, %rbp
  34. sub $ST_SIZE_RESERVE, %rsp
  35.  
  36. open_files:
  37. open_fd_in:
  38. mov $SYS_OPEN, %rax
  39. mov ST_ARGV_1(%rbp), %rbx
  40. mov $O_RDONLY, %rcx
  41. mov $0666, %rdx
  42. int $LINUX_SYSCALL
  43.  
  44. store_fd_in:
  45. mov %rax, ST_FD_IN(%rbp)
  46.  
  47. open_fd_out:
  48. mov $SYS_OPEN, %rax
  49. mov ST_ARGV_2(%rbp), %rbx
  50. mov $O_CREAT_WRONLY_TRUNC, %rcx
  51. mov $0666, %rdx
  52. int $LINUX_SYSCALL
  53.  
  54. store_fd_out:
  55. mov %rax, ST_FD_OUT(%rbp)
  56.  
  57. read_loop_begin:
  58. mov $SYS_READ, %rax
  59. mov ST_FD_IN(%rbp), %rbx
  60. mov $BUFFER_DATA, %rcx
  61. mov $BUFFER_SIZE, %rdx
  62. int $LINUX_SYSCALL
  63.  
  64. cmp $END_OF_FILE, %rax
  65. jle end_loop
  66.  
  67. continue_read_loop:
  68. push $BUFFER_DATA
  69. push %rax
  70. call convert_to_upper
  71. pop %rax
  72. add $4, %rsp
  73. mov %rax, %rdx
  74. mov $SYS_WRITE, %rax
  75. mov ST_FD_OUT(%rbp), %rbx
  76. mov $BUFFER_DATA, %rcx
  77. int $LINUX_SYSCALL
  78. jmp read_loop_begin
  79.  
  80. end_loop:
  81. mov $SYS_CLOSE, %rax
  82. mov ST_FD_OUT(%rbp), %rbx
  83. int $LINUX_SYSCALL
  84.  
  85. mov $SYS_CLOSE, %rax
  86. mov ST_FD_IN(%rbp), %rbx
  87. int $LINUX_SYSCALL
  88.  
  89.  
  90. .equ LOWERCASE_A, 'a'
  91. .equ  LOWERCASE_Z, 'z'
  92.  
  93. .equ  UPPER_CONVERSION, 'A' - 'a'
  94.  
  95. .equ  ST_BUFFER_LEN, 8 #Length of buffer
  96. .equ  ST_BUFFER, 12    #actual buffer
  97.  
  98. convert_to_upper:
  99. push %rbp
  100. mov %rsp, %rbp
  101.  
  102. movl ST_BUFFER(%rbp), %eax
  103. mov ST_BUFFER_LEN(%rbp), %rbx
  104. movl $0, %edi
  105. cmp $0, %rbx
  106. je end_convert_loop
  107.  
  108. convert_loop:
  109. movb (%rax,%rdi,1), %cl
  110. cmpb $LOWERCASE_A, %cl
  111. jl next_byte
  112. cmpb $LOWERCASE_Z, %cl
  113. jg next_byte
  114.  
  115. addb $UPPER_CONVERSION, %cl
  116. movb %cl, (%rax,%rdi,1)
  117.  
  118. next_byte:
  119. inc %rdi
  120. cmp %rdi, %rbx
  121. jne convert_loop
  122.  
  123. end_convert_loop:
  124. mov %rbp, %rsp
  125. pop %rbp
  126. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement