このコードを説明できる人はいますか? これは古い試験問題で、ネット上で答えを見つけることができません。
void (*x)(); x=0xFFFF0000; printf("1"); x(); printf("2"); x(); printf("3"); x();
従来のリアルモード x86 アーキテクチャでは、アドレス 0xFFFF0000 に対して無条件の JMP を実行することで、システムの起動をトリガーできました。
コードは基本的に関数として定義x()
し、関数のメモリ内アドレスを 0xFFFF0000 に設定しています。関数を呼び出すと、システムはCALL 0xFFFF000
アセンブラー レベルで実行または同様の処理を行い、BIOS ブート コードに直接ジャンプして、システムの再起動をトリガーします。
あなたが持っている
void (*x)();
これは、void を返し、void を入力として受け入れる関数へのポインターです。試験によると、コールド ブート機能が配置されているメモリ位置 0xFFFF0000 をポイントします。
次に、3 つの printfs() に続いて、そこにある関数を 3 回呼び出します。しかし、私は本当に要点がわかりません。質問はありますか?試験問題はこれだけですか?