asm(
".text\n"
" .comm read, 24\n"
" .comm FILE_IN, 8\n"
" .comm FILE_OUT, 8\n"
".section .rodata"
"\n"
"digits: .ascii \"0123456789\"\n"
"PATH_IN: .asciz \"adunare.in\"\n"
"PATH_OUT: .asciz \"adunare.out\"\n"
"\n"
".text\n"
".globl main\n"
"\n"
"_print_x:\n"
" pushq %rax\n"
" pushq %rdx\n"
" movq $10, %r8\n"
" xorq %rdx, %rdx\n"
" divq %r8\n"
" test %rax, %rax\n"
" jz _print_x.l1\n"
" callq _print_x@PLT\n"
"_print_x.l1:\n"
" movq $1, %rax\n"
" movq FILE_OUT@GOTPCREL(%rip), %rdi\n"
" movq (%rdi), %rdi\n"
" movq digits@GOTPCREL(%rip), %rsi\n"
" addq %rdx, %rsi\n"
" movq $1, %rdx\n"
" syscall\n"
" popq %rdx\n"
" popq %rax\n"
" ret\n"
"\n"
"parse_int:\n"
" movq $0, %rax\n"
"parse_int.l2:\n"
" movq read@GOTPCREL(%rip), %rcx\n"
" movb (%rcx, %rdi), %cl\n"
" cmpb $0, %cl\n"
" je parse_int.l1\n"
" cmpb $32, %cl\n"
" je parse_int.l1\n"
" cmpb $'\n', %cl\n"
" je parse_int.l1\n"
"\n"
" subb $'0', %cl\n"
" movq $10, %r8\n"
" mulq %r8\n"
" \n"
" movzbq %cl, %rcx\n"
" addq %rcx, %rax\n"
" incq %rdi\n"
" jmp parse_int.l2\n"
"parse_int.l1:\n"
" ret\n"
"\n"
"_error:\n"
" neg %rax\n"
" movq %rax, %rdi\n"
" movq $60, %rax\n"
" syscall\n"
"\n"
"main:\n"
" movq $2, %rax\n"
" movq PATH_IN@GOTPCREL(%rip), %rdi\n"
" movq $0, %rsi\n"
" syscall\n"
" orq %rax, %rax\n"
" js _error\n"
" movq FILE_IN@GOTPCREL(%rip), %rbx\n"
" movq %rax, (%rbx)"
"\n"
" movq $2, %rax\n"
" movq PATH_OUT@GOTPCREL(%rip), %rdi\n"
" movq $577, %rsi\n"
" movq $0644, %rdx\n"
" syscall\n"
" orq %rax, %rax\n"
" js _error\n"
" movq FILE_OUT@GOTPCREL(%rip), %rbx\n"
" movq %rax, (%rbx)"
"\n"
" movq $0, %rax\n"
" movq FILE_IN@GOTPCREL(%rip), %rdi\n"
" movq (%rdi), %rdi\n"
" movq read@GOTPCREL(%rip), %rsi\n"
" movq $23, %rdx\n"
" syscall\n"
"\n"
" movq $0, %rdi\n"
" callq parse_int\n"
"\n"
" pushq %rax\n"
" incq %rdi\n"
"\n"
" callq parse_int\n"
"\n"
" addq (%rsp), %rax\n"
"\n"
" callq _print_x\n"
"\n"
" movq $3, %rax\n"
" movq FILE_IN@GOTPCREL(%rip), %rdi\n"
" movq (%rdi), %rdi\n"
" syscall\n"
" \n"
" movq $3, %rax\n"
" movq FILE_OUT@GOTPCREL(%rip), %rdi\n"
" movq (%rdi), %rdi\n"
" syscall\n"
" \n"
" movq $60, %rax\n"
" xorq %rdi, %rdi\n"
" syscall\n"
);