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