値渡し

値渡しとは、サブルーチンに引数として、例えば、変数*aを渡した際に、aの値が引数としてサブルーチンに渡されることです。

値渡しでは、サブルーチン内で仮引数である変数*の値を書き換えても、aの値に影響を与えません。

値渡しに対応しているかは、プログラミング言語によって異なります。

例えば、以下は、あるプログラミング言語で値渡しを行っている例です。

void test(int b){
    b = 2;
    return;
}
int a = 1;
test(a);

上記のように、サブルーチンtestを呼び出すと、仮引数bには1が代入されます。

その後、bに2を代入してもaの値は1のままです。

値渡しの仕組み(ハードウェアレベル)

値渡しは、ハードウェアレベルでは、以下の仕組みで実現されています。

・コール命令でサブルーチンを呼び出す前に、引数として渡した変数*の値をPUSH命令でコールスタックにPushします。

・サブルーチン内で仮引数を利用するには、ベースポインタを基準とした相対アドレスを使って、ロード命令やストア命令でコールスタックに直接アクセスします。