質問: 環境はamd64 ATT表記においてなのですがC言語で mainで引数を取ったもので 第一引数はediレジスタに 第二引数はrsi+0x8に第二引数が入ることはありますか?(またこの時はレジスタ+8に先頭でそこからrsi(アドレス)にむかって配列がのびている?) また、逆アセンブラの結果をみて メモリアドレスをレジスタに直接入れている場合は何が考えられますか? 宜しくお願い致します。
回答: > > 第一引数はediレジスタに、第二引数はrsi+0x8に第二引数が入ることはありますか > > > GCCだと第一引数はedi又はrdiレジスタです。ただその場合、第二引数はrsiレジスタであり、rsi+8などではありません。 Linux X86-64 の呼出規約(calling Convention)を Gdb で確認する しかしコンパイラが違えば呼出規約も違うと思ったほうがよい。現に第一引数はRCX、第二引数はRDXというものもあります。 レジスタの使用(Visual Studio) > > メモリアドレスをレジスタに直接入れている場合は何が考えられますか > > > Cのプログラムをビルド(コンパイル、リンク)した結果、CPUレジスタにアドレス値が定数としてロードされる事はあまり多くないように思います。でも無いとは限らない。すぐ思いつくのは * 動作時のメモリマップが固定的に決まっている場合。グローバル変数・static変数のアドレスや関数のアドレス等はビルド時に決定できるので、そのメモリアドレスは定数です。 * IOレジスタをアクセスする場合。IOレジスタのアドレスは固定、即ち定数だから。つまり組込み機器を制御する場合やデバイスドライバを書く場合。 その値は本当にメモリアドレスなのでしょうか。検討を要すると思います。