O padr C como definido por Kernighan & amp; Ritchie em seu livro "The C Programming Language" não define como os parâmetros são passados às funções, nem define como as variáveis locais são armazenadas, o que deixa a implementação definida.
A documentação do seu compilador deve informar como os parâmetros são passados, caso contrário, você não poderá escrever o código de assembly para vincular-se a ele. Para variáveis locais, há ainda menos restrições, pois elas só serão acessadas de dentro da função, de modo que o compilador pode decidir não armazenar a variável na memória, de modo que ela possa mantê-la em um registrador. Como você pediu o endereço da variável, o compilador foi forçado a armazená-lo na memória, mas, a menos que você use um ponteiro para uma variável específica, não é necessário.
Dois compiladores diferentes podem fazer as coisas de maneira diferente. Muitos compiladores optam por usar a pilha, mas outros usarão os registradores onde isso for possível e, mesmo quando eles usam a pilha, a ordem dos parâmetros está na implementação.
O padrão ANSI C não mudou isso.
Em suma, o Ubuntu não armazena variáveis na ordem errada. O compilador que você usa no Ubuntu apenas os armazena em uma ordem diferente daquela que você usa na universidade. Nem está errado. Eles são apenas diferentes e a documentação do compilador deve explicar como ela é implementada.
Para o gcc, que é o que a maioria das pessoas usa no Linux, a documentação é aqui .