Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bits 64
- ; streams:
- %define STDIN 0
- %define STDOUT 1
- %define STDERR 2
- ; syscalls:
- %define INPUT 0
- %define OPEN 2
- %define CLOSE 3
- %define WRITE 1
- %define EXIT 60
- ; fopen modes:
- %define O_RDONLY 0
- %define O_WRONLY 1
- %define O_CREAT 64
- section .text
- global _start
- _start:
- pop rax
- mov [argc], rax
- cmp rax, 2
- jl _argc_error
- xor rdx, rdx
- pop rax
- inc rdx
- _args_loop:
- inc rdx
- cmp rdx, [argc]
- jg _exit
- pop rax
- mov bl, byte [rax]
- cmp bl, byte 45 ; flag start: -
- je _args_flag
- jmp _args_loop
- _args_flag:
- push rax
- push rdx
- push rax
- mov rdi, out_flag
- mov rsi, rax
- call _strcmp
- cmp rax, 0
- jne _args_loop
- pop rax
- push rax
- mov rdi, rax
- call _strlen
- ; print the name of the flag if it is equal to out_flag
- mov rdx, rax
- mov rax, WRITE
- mov rdi, STDOUT
- pop rsi
- syscall
- mov rax, WRITE
- mov rdi, STDOUT
- mov rsi, endl
- mov rdx, 1
- syscall
- pop rdx
- pop rax
- jmp _args_loop
- _exit:
- mov rax, EXIT
- mov rdi, 0
- syscall
- ret
- ; print errors:
- _argc_error:
- mov rdi, argc_error
- call _strlen
- mov rdx, rax
- mov rax, WRITE
- mov rdi, STDERR
- mov rsi, argc_error
- syscall
- jmp _exit_err
- _flag_error:
- mov rdi, flag_error
- call _strlen
- mov rdx, rax
- mov rax, WRITE
- mov rdi, STDERR
- mov rsi, flag_error
- syscall
- jmp _exit_err
- _exit_err:
- mov rax, EXIT
- mov rdi, 1
- syscall
- ret
- ; Functions
- ; function _strlen (string)
- ; returns value to rax (the length of the string)
- _strlen:
- push rcx
- xor rcx, rcx
- _strlen_next:
- cmp [rdi], byte 0
- jz _strlen_null
- inc rdi
- inc rcx
- jmp _strlen_next
- _strlen_null:
- mov rax, rcx
- pop rcx
- ret
- ; function _strcmp (string, string)
- ; returns value to rax (1 if equal, 0 if does not)
- _strcmp:
- push rdi
- push rsi
- push rsi
- push rdi
- mov rdi, rsi
- call _strlen
- mov rbx, rax
- pop rdi
- call _strlen
- pop rsi
- cmp rbx, rax
- jne _streq_not_eq
- _strcmp_loop:
- mov rax, [rdi]
- sub rax, [rsi]
- cmp rax, 0
- jne _streq_not_eq
- cmp byte [rsi], 0
- je _streq_eq
- inc rdi
- inc rsi
- jmp _streq_loop
- _strcmp_not_eq:
- mov rax, 0
- jmp _streq_end
- _strcmp_eq:
- mov rax, 1
- jmp _streq_end
- _strcmp_end:
- pop rsi
- pop rdi
- ret
- section .data
- argc_error: db "Small count of CLI arguments passed!", 10, 0
- flag_error: db "Unexpected flag passed", 10, 0
- output_file: db "out.asm"
- out_flag: db "-o", 0
- endl: db 10
- section .bss
- input_file: resb 255
- argc: resb 8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement