segment .data
infp dq 0
argv dq 0
read_mode:
db "r",0
segment .bss
data resb 160
data_size equ $-data
segment .text
global main
extern fopen, fgets, fputs, fclose, stdout
main:
push rbp
mov rbp, rsp
; Step past argv[0]
add rsi, 8
mov [argv], rsi
; Process each file
.more_files:
mov r8, [argv]
mov rdi, [r8] ; get the next filename into rdi
cmp rdi, 0
je .done
add r8, 8 ; advance argv
mov [argv], r8
lea rsi, [read_mode]
call fopen
cmp rax, 0
je .more_files
mov [infp], rax ; save the file pointer
.more_lines:
lea rdi, [data] ; first parameter of fgets
mov rsi, data_size ; second parameter to fgets
mov rdx, [infp] ; third parameter
call fgets
cmp rax, 0
jne .put
mov rdi, [infp]
call fclose ; close the file
jmp .more_files
.put lea rdi, [data] ; first parameter of fputs
mov rsi, [stdout] ; second parameter
call fputs
jmp .more_lines
.done xor eax, eax
leave
ret