非常に低レベルのものについて質問があります。私たちは、マイクロプロセッサが単純なアセンブラプログラムを実行する方法を分析していました。私たちはロジックアナライザを使用していました。したがって、私は.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]への書き込みがこんなに遅く起きますか?
プッシュ命令の直後にスタックに値をプッシュする必要があると私は考えていました。
おそらくアウトオブオーダー実行のアーティファクトです。おそらくインオーダーのARMチップのような、よりシンプルなCPUを手に入れ、それを最初に勉強することをお勧めします。 – zwol
それはマイクロプロセッサークラスの一部に過ぎないので、私は自宅にロジックアナライザーを持っていません。あなたは行動が正常ではないと言いますか?私は結果を考えていたので、誰かがmov [bx]の後にある1つの命令でメモリの一部を読み込もうとすると、後で書き込みが行われるため、更新された値は読み込まれません。 – Andna
いいえ、その動作は最新のx86チップでは全く正常です。あなたがそれを期待していない場合はちょうど混乱し、すべての種類の髪の毛の結果があります - 誰かが書き込み後に読んでしようとすると何が起こるのだろうと思ったときに正しい線に沿って考えている。 (CPUは、_sameスレッド_の命令は、書き込みが起こったかのようにメモリを参照しますが、別のコアの別のスレッドは、を読んでください。しかし、あなたの頭が爆発するかもしれないと警告しています。) –
zwol