<Prozedurname> <Argumentliste>die sich durch die folgenden Regeln beschreiben läßt:
<Prozedurname> <Bezeichner>Die Argumentliste kann also fehlen.
<Argumentliste> ( <Argumente> )
<Argumentliste> <leer>
<Argumente> <Argumente> , <Argument>Die Argumente werden also durch Kommas getrennt.
<Argumente> <Argument>
<Argument> <Ausdruck>Dies ist ein Wert-Argument; der Ausdruck wird ausgewertet, und das Ergebnis wird der Prozedur übergeben.
<Argument> <Variable>Dies ist ein Referenz-Argument; die Variable bezeichnet ein Objekt, das die Prozedur ansprechen und auch verändern können soll.
Wert-Argumente und Referenz-Argumente sind in Modula 2 an der Aufrufstelle der Prozedur oft nicht zu unterscheiden; der Unterschied zeigt sich in der Form der Prozedur-Vereinbarung, und natürlich gehört er zum Kontrakt.
Ein Funktionsaufruf sieht (fast) genauso wie ein Prozeduraufruf aus, doch steht er an einer anderen Stelle: nicht als Anweisung, sondern als Ausdruck, oder als Operand eines Ausdrucks, da er ja einen Ergebniswert zurückliefert. Hier sollten nur Wert-Argumente verwendet werden, und bei (selten vorkommenden) parameterlosen Funktionen muß in Modula 2 merkwürdigerweise dennoch eine leere Parameter-Klammer geschrieben werden. (Die in der Sprache C gegebene Möglichkeit, einen Funktionsaufruf auch als Anweisung zu verwenden und den Ergebniswert "wegzuwerfen", ist logisch unsauber und fehleranfällig).
Andere Programmiersprachen bieten gelegentlich noch weitere "Parameter-Übergabemechanismen" wie "call by value/result" oder "call by name" an; wir gehen darauf hier nicht ein.