2012-04-21 25 views
1

非常に低レベルのものについて質問があります。私たちは、マイクロプロセッサが単純なアセンブラプログラムを実行する方法を分析していました。私たちはロジックアナライザを使用していました。したがって、私は.lawファイルを持っています。これは、我々が使用したコードです(コメント欄に、私はオペコードを置い):アセンブリーとロジックアナライザー - 実行順序

mov ax, 1000 
mov ds, ax 
mov bx, 2000 
mov ax, 0aa 

mov cx, 100 

petla 
    push cx ;51 
    mov [bx],al ;8807 
    mov ax,[bx] ;8B07 
    inc al;FEc0 
    pop cx;59 
loop ;here goes address 

我々は、デバッグプログラムでそれを書いて組み立てられ、出力を見ました。

http://img805.imageshack.us/img805/241/mikro.png

が、ここで奇妙な(少なくとも私にとっては)ものである:ここではイメージです

Data bus:51 - push cx 
Data bus:8807 - mov [bx],al 
Data bus:0001 - writing to 1EF6A 
Data bus:8B07 - mov ax,[bx] 
Data bus AA, address bus:12000 - that is writing al to [bx] (ds - 1000, bx - 2000) 

突然、彼はメモリ内のいくつかの場所にある値を書き込みます(私は1EF6AがSS:SPの物理アドレスであると考えています)。それが理由

push CX? 

はいなら、なぜ彼は

mov [bx],al 

後にそれをするのか、なぜ[BX]への書き込みがこんなに遅く起きますか?

プッシュ命令の直後にスタックに値をプッシュする必要があると私は考えていました。

+1

おそらくアウトオブオーダー実行のアーティファクトです。おそらくインオーダーのARMチップのような、よりシンプルなCPUを手に入れ、それを最初に勉強することをお勧めします。 – zwol

+0

それはマイクロプロセッサークラスの一部に過ぎないので、私は自宅にロジックアナライザーを持っていません。あなたは行動が正常ではないと言いますか?私は結果を考えていたので、誰かがmov [bx]の後にある1つの命令でメモリの一部を読み込もうとすると、後で書き込みが行われるため、更新された値は読み込まれません。 – Andna

+0

いいえ、その動作は最新のx86チップでは全く正常です。あなたがそれを期待していない場合はちょうど混乱し、すべての種類の髪の毛の結果があります - 誰かが書き込み後に読んでしようとすると何が起こるのだろうと思ったときに正しい線に沿って考えている。 (CPUは、_sameスレッド_の命令は、書き込みが起こったかのようにメモリを参照しますが、別のコアの別のスレッドは、を読んでください。しかし、あなたの頭が爆発するかもしれないと警告しています。) – zwol

答えて

4

(申し訳ありませんが、私はまだ、コメントするのに十分な担当者を持っていないので、私はこの答えを書くに頼るています。)

@Andna:これは右、8088ですか?そのため、アナライザトレースのメモリアクセスはバイト単位で行われます。したがって、8088のプリフェッチユニットの結果は、メモリから命令バイトを盲目的に読み取って、実行ユニットが後でそれらを使用することを望むように短い(4バイト)プリフェッチキューに保持します。

実行ユニットが実際に実行する命令に起因するデータ操作は、後でバスに表示されます。そのため、push CX命令が読み込まれた直後にメモリに書き込まれたCX値が表示されず、MOV AX,[BX]命令が読み込まれるまでAL書き込みがバスに表示されないのはなぜですか。また、ループの終わり(残念ながらこのトレーススナップショットには表示されません)では、ループ命令の後に続くプリフェッチユニットの読み込み指示が表示されます。ただし、実行ユニットはこれらの命令を実行しません。

プリフェッチユニットの先読みの可能性のある悪影響については心配するのは間違いありませんが、プリフェッチユニットがその前の値をすでに収集した後に書き込まれるメモリ位置を扱う場合にのみ危険が生じます現在のプログラム実行ポイントのすぐ上にあるメモリ位置を扱っているときにのみ発生する可能性があります。その状況になっている場合は、新しく書き込まれた場所を読み取ろうとする前に、先読みキューの内容を無効にする何かを行う必要があります。 JMPを実行するとそれが実行されます。

@Zack:ここでは順序が違う実行はありません。マルチコアやマルチスレッドはなく、キャッシュさえありません。盲目的で投機的なプリフェッチのわずかな量。はい、プリフェッチは、トレースに続いて、たとえば8085よりもわずかにトリッキーです。

+0

はい、それは8088です。それは非常に有益な投稿です、ありがとうございます。 – Andna

+0

ああ、今はばかげている。もっと新しいものを見ていると思った! (私はまだ、モダンではあるが順番の高いARMコアが、解析する最初のCPUであろうと考えているか、6502かもしれない) – zwol