Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .section .data
- .equ SYS_OPEN, 5
- .equ SYS_WRITE, 4
- .equ SYS_READ, 3
- .equ SYS_CLOSE, 6
- .equ SYS_EXIT, 1
- .equ O_RDONLY, 0
- .equ O_CREAT_WRONLY_TRUNC, 03101
- .equ STDIN, 0
- .equ STDOUT, 1
- .equ STDERR, 2
- .equ LINUX_SYSCALL, 0x80
- .equ END_OF_FILE, 0
- .equ NUMBER_ARGUEMNTS, 2
- .section .bss
- .equ BUFFER_SIZE, 500
- .lcomm BUFFER_DATA, BUFFER_SIZE
- .section .text
- .equ ST_SIZE_RESERVE, 16
- .equ ST_FD_IN, -8
- .equ ST_FD_OUT, -16
- .equ ST_ARGC, 0
- .equ ST_ARGV_1, 8
- .equ ST_ARGV_1, 16
- .equ ST_ARGV_2, 24
- .globl _start
- _start:
- mov %rsp, %rbp
- sub $ST_SIZE_RESERVE, %rsp
- open_files:
- open_fd_in:
- mov $SYS_OPEN, %rax
- mov ST_ARGV_1(%rbp), %rbx
- mov $O_RDONLY, %rcx
- mov $0666, %rdx
- int $LINUX_SYSCALL
- store_fd_in:
- mov %rax, ST_FD_IN(%rbp)
- open_fd_out:
- mov $SYS_OPEN, %rax
- mov ST_ARGV_2(%rbp), %rbx
- mov $O_CREAT_WRONLY_TRUNC, %rcx
- mov $0666, %rdx
- int $LINUX_SYSCALL
- store_fd_out:
- mov %rax, ST_FD_OUT(%rbp)
- read_loop_begin:
- mov $SYS_READ, %rax
- mov ST_FD_IN(%rbp), %rbx
- mov $BUFFER_DATA, %rcx
- mov $BUFFER_SIZE, %rdx
- int $LINUX_SYSCALL
- cmp $END_OF_FILE, %rax
- jle end_loop
- continue_read_loop:
- push $BUFFER_DATA
- push %rax
- call convert_to_upper
- pop %rax
- add $4, %rsp
- mov %rax, %rdx
- mov $SYS_WRITE, %rax
- mov ST_FD_OUT(%rbp), %rbx
- mov $BUFFER_DATA, %rcx
- int $LINUX_SYSCALL
- jmp read_loop_begin
- end_loop:
- mov $SYS_CLOSE, %rax
- mov ST_FD_OUT(%rbp), %rbx
- int $LINUX_SYSCALL
- mov $SYS_CLOSE, %rax
- mov ST_FD_IN(%rbp), %rbx
- int $LINUX_SYSCALL
- .equ LOWERCASE_A, 'a'
- .equ LOWERCASE_Z, 'z'
- .equ UPPER_CONVERSION, 'A' - 'a'
- .equ ST_BUFFER_LEN, 8 #Length of buffer
- .equ ST_BUFFER, 12 #actual buffer
- convert_to_upper:
- push %rbp
- mov %rsp, %rbp
- movl ST_BUFFER(%rbp), %eax
- mov ST_BUFFER_LEN(%rbp), %rbx
- movl $0, %edi
- cmp $0, %rbx
- je end_convert_loop
- convert_loop:
- movb (%rax,%rdi,1), %cl
- cmpb $LOWERCASE_A, %cl
- jl next_byte
- cmpb $LOWERCASE_Z, %cl
- jg next_byte
- addb $UPPER_CONVERSION, %cl
- movb %cl, (%rax,%rdi,1)
- next_byte:
- inc %rdi
- cmp %rdi, %rbx
- jne convert_loop
- end_convert_loop:
- mov %rbp, %rsp
- pop %rbp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement