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)

突然、彼はメモリ内のどこかに CX レジスタにある値を書き込みます (1EF6A は SS:SP の物理アドレスであると思われます)。のせいか

push CX?

はいの場合、なぜ彼はその後にそれを行うのですか

mov [bx],al

[bx] への書き込みがこれほど遅くなったのはなぜですか?

スタックへの値のプッシュは、プッシュ命令の直後に行うべきだと考えていました。

4

1 に答える 1

4

(申し訳ありませんが、コメントするのに十分な担当者がまだいないため、これを回答として書くことに頼っています。)

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

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

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

@Zack: ここでは順不同の実行はなく、マルチコアやマルチスレッドもキャッシュもありません。盲目的で投機的なプリフェッチのごく一部です。はい、プリフェッチにより、トレースの追跡が、たとえば 8085 よりもわずかに複雑になります。

于 2012-04-21T23:45:46.333 に答える