非常に低レベルなものについて質問があります。マイクロプロセッサが簡単なアセンブラ プログラムをどのように実行するかを分析していました。ロジック アナライザを使用していたので、.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] への書き込みがこれほど遅くなったのはなぜですか?
スタックへの値のプッシュは、プッシュ命令の直後に行うべきだと考えていました。