- ベストアンサー
マシン語で再起動を書くには?
アセンブラで、CPUを再起動させたり、シャットダウン、停止など行うプログラムをマシン語で書きたいのですが、参考になるものはありますか? CPU (AMD使っていますが)のマニュアルってあるのですか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
大概の16ビット以上のCPUは、0x00000000番地にリセットベクトルがあるので、 mov.l #0x00000000,er0 ; 0x00000000番地をレジスタに指定。 mov.l @er0,er0 ; er0レジスタで示すアドレスの値をer0レジスタに転送。 jmp @er0 ; er0レジスタで示すアドレスにジャンプ。 ; ただし、mov.lは32ビット転送命令、jmpはジャンプ命令。 ; mov命令は、ソース, ディスティネーションの順。 ; er0は間接参照ができる32ビットレジスタ、@は間接参照、#はイミディエイトデータ。 でいいんじゃないかなぁ? ただ、これが思った通りに動作しても、「本当に」リセットがかかるだけで、「正常なシャットダウン」→「再起動」ではないから気を付けてね。 i80386系のニーモニックを忘れたので、汎用CPU命令で失礼!
その他の回答 (3)
- caceres
- ベストアンサー率43% (61/140)
回答を見て少し気になったのですがスタックなども含めて初期化しないと危ないように思うのですが。 要はマニュアルを見て各レジスタ類をCPUのパワーオン時に設定しないと安全ではないですよね。 >電源断の WindowsAPIにはありますが生で操作するとなるとどこかのI/Oポートに思われますがPCならBIOSレベルではないのかな。 OSが動いていたらいきなり電源OFFはあり得ないしCPU自身で停止するならHALTやらパワーダウン(クロックダウン)など省エネモードの命令はあると思いますがCPUのマニュアルがないとわかりません。 お役に立てなくて失礼しました。
- dekopa-
- ベストアンサー率42% (161/378)
どんな環境でしょうか? 「シャットダウン」「CPUにAMD」と言うあたり、組み込み系ではなくWindowsのような気がしますが。 Windowsに限らず、まっとうなOSは#2さんの様な手段は通じません。CPU側も、それを防ぐ機能があります。 Windowsをシャットダウンしたいなら、マシン語は諦めて普通にC言語でAPIを呼んで下さい。「windows API シャットダウン」で簡単に検索できます。 とりあえず、引っかかったページを参考URLに載せますね。
お礼
なるほどWindowsではAPIじゃないと無理ですね。 しかし、私が知りたかったのはCPUのべたな機能でした。 組み込み系?など良く知らないのですが、CPUの情報について詳しく知りたかったのですが、言葉足らずで申し訳ありません。 今は、再起動が解決したので、IPLにマシン語で電源断のプログラムを書く方法が知りたいです。
- tetnon2000
- ベストアンサー率43% (92/213)
ご使用のOSにも寄りますが16ビットであれば、参考URLがお役にたつでしょう。windows2000以降であれば32bitになってしまうので私には経験がありません。 ただし、私の記憶では(20年位前ですが)シャットダウンしたり、再起動するシステムコールはなかったような気がします。今はもしかしたらあるかも知れません。 後、私のホームページですみませんが、お勧め書籍のところを見てみてください。 http://www2.ttcn.ne.jp/tetnon2000/tet.htm
お礼
なるほど、Windowsではシステムコールでできそうですね。 私は単にCPUがどのようにリセットするのか知りたかったのですが、言葉足らずですみませんでした。
お礼
なるほど、こういう情報を待っていました。 OSの話でなく、直接CPUのべたな仕組みを知りたかった ので、試しにIPL部に次のマシン語を書くと sti mov exa, 0x00000000 jmp exa で再起動できました。 CPUのマップ表など情報を手に入れたいです。