Global variables and frame stack
The program is actually using two variables. There is a global variable n, which is used by main(). There is a local variable, confusingly also named n, which is used by binary() and allocated on the stack.



Here are some excerpts from the code generated on my machine:

_binary:
...
        movl    %edi, -4(%rbp)
        cmpl    $0, -4(%rbp)
...

_main:
...
        movq    _n@GOTPCREL(%rip), %rsi
        movl    (%rsi), %edi
        movl    %eax, -4(%rbp)          ## 4-byte Spill
        callq   _binary
...
        .comm   _n,4,2                  ## @n


The first excerpt contains part of the code generated for binary(). The parameter n is passed in the register edi, and is then stored on the stack. The following command compares it to zero, implementing part of n&gt;0.

The second excerpt contains part of the code generated for main(). The global variable n is allocated as a common symbol. The excerpt consists of the function call binary(n). You can see that n is pulled out of the global storage and put into edi, before calling binary().