2016-06-23 13 views
-3

32ビットx86 imul opcodeの1つのセマンティクスと混同しています。ここでの例である:2つの32ビットレジスタを持つx86 imulオペコード

mov eax, 0x0fffffff 
mov ebx, 0x0fffffff 
imul eax, ebx   <---- eax?? 

0x0fffffff * 0x0fffffffとして、0xffffffffより大きい0xffffffe0000001に等しいので、eaximul0xe0000001に割り当てられるべきであると思われます。

ここで私の質問ですが、上位ビット(0x00ffffff)はどこに行きますか? cpuは、より高いビットを格納するために、例えば、edxを使用しますか?それとも、単にoverflowフラグを設定するだけですか?

+4

あなたがマニュアルを読んで検討していますか? 'imul'の – fuz

+0

複数のオペランドの形式は、符号なし' MUL R32、R/m32'バージョンが必要とされていない理由である、どこでも高の半分を格納しないでください。 –

+0

関連、かなり重複していない:http://stackoverflow.com/questions/4039378/x86-mul-instruction-from-vs-2008-2010は、フラグは、デバッガからちょうどどのように機能するかを学ぶのに注意してください –

答えて

2

タグwikiには、さまざまな指示に関する情報を参照するために使用できるリソースの一覧が含まれています。たとえば、IMULをhttp://www.felixcloutier.com/x86/に検索すると、http://www.felixcloutier.com/x86/IMUL.htmlにつながります。

2つのオペランドバリアントが使用され、結果が切り捨てられた場合、1つのオペランド(IMUL ebx)が使用された場合、結果はedx:eaxになりますので、アセンブラがどのようにコンパイルするかによって異なります。

フラグについて:確かにデバッグしますが、2つのオペランドのバージョンは、結果が切り捨てられたときにCF/OFを設定します。したがって、CF = 1、OF = 0ですか? (符号なし切り捨て、符号なしオーバーフロー)。 3時間後


は後で... は、1を持っている便利でいる可能性があるため、私は実際には、DOS時代におけるBorlandから「TD」のように、いくつかの素晴らしいLinuxのデバッガを再度検索する必要があることを、私に起こりました。

もちろん、gdbは常にありますが、私はそれを気に入ることができません(特に私が個人的に好まないAT & Tの構文になっています)。

私はUbuntuリポジトリで直接利用できる「ddd」(データ表示デバッガ)を試しましたが、ちょっと古いようです(MOTIF、あなたが知っていれば、MOTIFを聞いたことがないなら、十分な年齢ではない)。 gdbに基づいています...おそらくGNUパスに行きたいと思っている人にはここで言及する価値はありますが、私はさらに検索しました。

そして、私はダウンロードを終了し、edb-debuggerをコンパイルしました。いくつかの試行の後、私はそれを古いUbuntuでコンパイルして実行しています。それはITです。好みの中でわずかなクリックだけで、 "TD"の感覚がここにあります。

私はあなたの指示を試しました。NASMのサンプルからhelloworld.asmをコンパイルしてテスト用のバイナリをバイナリにしなければならなかったので、デバッガでこれらの短い質問を直接上書きすることができます。

IMUL eax,ebx後、CPUの状態の変更は、次のとおり

eax = 0xe0000001 
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ... 

IMUL ebx後、CPUの状態の変更は、次のとおり

eax = 0xe0000001 
edx = 0x00ffffff 
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ... 

(したがって、この場合にフラグが同じです)。


このような質問をするのを止めるには、すばらしいデバッガを入手することを強くお勧めします。1つのデバッガを稼働させることが自分の興味に沿っていなければ、私は答えに気にしません。

+3

。多くの命令では、フラグが「未定義」になっています。特定のCPUでは、通常は明確な動作パターンが存在するため、マニュアルの内容を確認して、マニュアルの内容を確認する必要があります。 (そうでなければ、実装定義の振る舞いに依存するので、他の既存のx86 CPUに移植できないコードを書くかもしれません)。 –

+1

は、しかし、この場合には、私は、乗算の上半分には関係なく、あなたはどこにでも上半分を保存する形式を使用するかどうかの、非ゼロの場合、CFとOFが設定されていることを言うようにマニュアルをお読みください。 –

+0

re:debuggers:私は 'edb'を一度試してみたと思いますが、シンボルテーブル情報を使用するのは本当に厄介です。したがって、コンパイル済みのCプログラムをasmでデバッグしたり、asm関数を 'gcc -g'でビルドされたCプログラムにリンクすると、あまり便利ではありませんでした。私は何か見落としてますか?私は通常gonを 'layout reg'や' display/x $ xmm0.v16_int8'などのKonsoleで使います。それは素晴らしいことではありませんが、主に十分に機能します。 –

関連する問題