値渡しとは、サブルーチンに引数として、例えば、変数*aを渡した際に、aの値が引数としてサブルーチンに渡されることです。
値渡しでは、サブルーチン内で仮引数である変数*の値を書き換えても、aの値に影響を与えません。
値渡しに対応しているかは、プログラミング言語によって異なります。
例えば、以下は、あるプログラミング言語で値渡しを行っている例です。
void test(int b){
b = 2;
return;
}
int a = 1;
test(a);
上記のように、サブルーチンtestを呼び出すと、仮引数bには1が代入されます。
その後、bに2を代入してもaの値は1のままです。
値渡しは、ハードウェアレベルでは、以下の仕組みで実現されています。
・コール命令でサブルーチンを呼び出す前に、引数として渡した変数*の値をPUSH命令でコールスタックにPushします。
・サブルーチン内で仮引数を利用するには、ベースポインタを基準とした相対アドレスを使って、ロード命令やストア命令でコールスタックに直接アクセスします。