Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .section .data
  2.  
  3.     # System call numbers
  4.     .equ OPEN, 2
  5.     .equ WRITE, 1
  6.     .equ READ, 0
  7.     .equ CLOSE, 3
  8.     .equ EXIT, 60
  9.  
  10.     # File modes
  11.     .equ O_RDONLY, 0
  12.     .equ O_CREAT_WRONLY_TRUNC, 03101
  13.     .equ O_PERMS, 0666
  14.  
  15.     .equ END_OF_FILE, 0     # End of file
  16.  
  17. .section .bss
  18. #... Define buffer(s) here ...
  19. .equ BUFFER_SIZE, 500
  20. .lcomm BUFFER_DATA, BUFFER_SIZE
  21.  
  22. #Stack Postions
  23.  
  24. .equ ST_SIZE_RESERVE, 24
  25. .equ ST_FD_IN, 0
  26. .equ ST_FD_OUT, 8
  27. .equ ST_ARGC, ST_SIZE_RESERVE
  28. .equ ST_ARGV_0, ST_SIZE_RESERVE+8
  29. .equ ST_ARGV_1, ST_SIZE_RESERVE+16
  30. .equ ST_ARGV_2, ST_SIZE_RESERVE+24
  31. .equ ST_ARGV_3, ST_SIZE_RESERVE+32
  32.  
  33.  
  34. .section .text
  35.  
  36.     # RETURN VALUES
  37.     .equ RETURN_SUCCESS, 0
  38.     .equ RETURN_INVALID_NUM_ARGS, 1
  39.     .equ RETURN_ERR_INPUT, 2
  40.     .equ RETURN_ERR_OUTPUT, 3
  41.     .equ RETURN_INVALID_FORMAT, 4
  42.     .equ RETURN_MSG_TOO_LONG, 5
  43.  
  44.     # BMP HEADER OFFSETS
  45.     .equ HO_B, 0
  46.     .equ HO_M, 1
  47.     .equ HO_SIZE_V3, 14
  48.     .equ HO_WIDTH_PIXELS, 18
  49.     .equ HO_HEIGHT_PIXELS, 22
  50.     .equ HO_NUM_BITS_PIXEL, 28
  51.     .equ HO_COMPRESSION, 30
  52.     .equ HO_NUM_COLORS_PALETTE, 46
  53.  
  54.     .globl _start
  55.  
  56. _start:
  57. subq $ST_SIZE_RESERVE, %rsp
  58. movq %rsp, %rbp
  59. movq    ST_ARGC(%rbp), %rdi             #check for 4 args
  60. cmpq $4, %rdi
  61. jne exit_invalid_num_args
  62.  
  63. open_input:
  64. movq ST_ARGV_2, %rdi
  65. movq $O_RDONLY, %rsi
  66. movq $O_PERMS, %rdx
  67. movq $OPEN, %rax
  68. syscall
  69. cmpq $0, %rax
  70. jl exit_err_input
  71. movq %rax, ST_FD_IN(%rbp)
  72.  
  73. open_output:
  74. movq ST_ARGV_3(%rbp), %rdi
  75. movq $O_CREAT_WRONLY_TRUNC, %rsi
  76. movq $O_PERMS, %rdx
  77. movq $OPEN, %rax
  78. syscall
  79. cmpq $0, %rax
  80. jl exit_err_output
  81. movq %rax, ST_FD_OUT(%rbp)
  82.  
  83.  
  84.  
  85. read_loop_begin:
  86. movq ST_FD_IN(%rbp), %rdi
  87. movq $BUFFER_DATA, %rsi
  88. movq BUFFER_SIZE, %rdx
  89. movq $OPEN, %rax
  90. syscall
  91. #check if end of file
  92. cmpq $END_OF_FILE, %rax
  93. jle end_loop
  94. continiue_read_loop:
  95. movq $BUFFER_DATA, %rdi
  96. movq %rax, %rsi
  97. #call method
  98. movq ST_FD_OUT(%rbp), %rdi
  99. movq $BUFFER_DATA, %rsi
  100. movq %rax, %rdx
  101. movq $WRITE, %rax
  102. syscall
  103. jmp read_loop_begin
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110. end_loop:
  111. movq ST_FD_OUT(%rbp), %rdi
  112. movq $CLOSE, %rax
  113. syscall
  114. jmp exit_success
  115.  
  116.  
  117.  
  118.  
  119.  
  120. exit_success:
  121. movq $RETURN_SUCCESS, %rdi
  122. jmp exit
  123.  
  124.  
  125.  
  126. exit_invalid_num_args:                  #invalid number of args
  127. movq $RETURN_INVALID_NUM_ARGS, %rdi
  128. jmp exit
  129.  
  130. exit_err_input:
  131. movq $RETURN_ERR_INPUT, %rdi
  132. jmp exit
  133.  
  134. exit_err_output:
  135. movq $RETURN_ERR_OUTPUT, %rdi
  136. jmp exit
  137.  
  138. exit_invalid_format:
  139. movq $RETURN_INVALID_FORMAT, %rdi
  140. jmp exit
  141.  
  142. exit_msg_too_long:
  143. movq $RETURN_MSG_TOO_LONG, %rdi
  144. jmp exit
  145.  
  146. exit:
  147. movq $EXIT, %rax
  148. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement