2012-03-28 9 views
0

私はいくつかのプログラムをデバッグしています。命令当たりのデバッグ(EclipseのCDT)では、私はこれに遭遇していますこの命令は間違っていますか? (movabs%al、0xe400000000004049)

movabs %al,0xe400000000004049 
rex.WB 

movabs命令を実行した後、デバッグがSEGVで終了します。 私はこれらの指示を見ましたが、そのうちの2番目の指示は1つのように見えません。

これが原因ではないかもしれませんが、私はよく尋ねます。

GNUアセンブラの構文ですが、Linux Gentoo 64bitで動作しているので、私のCPUはIntel 2600K(i7 second gen)です。

+4

有効な命令ストリームのようには見えません。データを実行しようとしていますか? –

答えて

-2
0xe400000000004049 

マイナスは少し大きめに入れてください。 (32ビットレジスタ) だから私は(多分間違っている)64ビットのアーチALは16ビット=> 0xFFFF最大であると仮定します。

+4

ALはx86_64ではまだ8ビットです。すべてのレジスタは同じサイズのままです。rax/rbx/rcx/rdx/rsi/rsp/rbp/ripレジスタのサブビューです。 – pmdj

+4

'0xe400000000004049'はメモリアドレスであり、格納される値ではありません。 – interjay

+1

Okは何かを学んだ。構文は常にmovabs%al、[0xe400000000004049 ]です。0xe400000000004049 をAL – grifos

6

命令

movabs %al,0xe400000000004049 

は、アドレス0xe400000000004049にalの値を記憶するようになっています。後者のアドレスは有効ではありません。なぜなら、現在のx86_64アーキテクチャでは、上位17(17)ビットのアドレスがすべて0または1でなければならないからです。 異なる表現では、現在の仮想アドレス空間は、48ビット符号拡張、つまり0xffff 8000 0000 0000から0x0000 7fff ffff ffffまでです。

これは将来変更される可能性がありますが、おそらくいくつかの世代のCPUが出回ってくるでしょう。

+0

私は、カーネルが非常に一番下のユーザアプリケーションに位置していることを知っています。つまり、あなたが言うことです。今、それはすべてのアドレス空間の真ん中にあります。したがって:Nevermind – imacake

+1

@imacakeいいえ、あなたが与えたアドレスは、カーネルやアプリケーションがどこにあっても違法であると言います。 – hirschhornsalz

関連する問題