「オペレーティングシステム」の版間の差分
削除された内容 追加された内容
→発展的な話題: s/コンパイル/アセンブル/ タグ: 2017年版ソースエディター |
→発展的な話題: 2022年現在のx86プロセッサは、x86命令セットをマイクロ命令に分解し、マイクロ命令の組合せによっては複合的なマイクロ命令に合成し実行しています。ところが、lodsbの様な複雑な命令はマイクロ命令に翻訳されず固定的なマイクロコードにより実行されます。このため、かつて命令読込みのオーバーヘッドがなくせるという理由で「最適化」の代表だった複雑な命令を使うことは、現在は実行速度を低下させることになります。 タグ: 2017年版ソースエディター |
||
948 行
;その他の例
次のようlodsb 命令とsiレジスタを使っても良い。lodsbは[ds:si]からalに1バイト
※ 2022年現在のx86プロセッサは、x86命令セットをマイクロ命令に分解し、マイクロ命令の組合せによっては複合的なマイクロ命令に合成し実行しています。ところが、lodsbの様な複雑な命令はマイクロ命令に翻訳されず固定的なマイクロコードにより実行されます。このため、かつて命令読込みのオーバーヘッドがなくせるという理由で「最適化」の代表だった複雑な命令を使うことは、現在は実行速度を低下させることになります。
;コード例1
<syntaxhighlight lang="asm">
org 0x7c00
mov ah, 0x0e ; 1文字出力を設定
mov si, msg
981 ⟶ 983行目:
lodsb の内容は
<syntaxhighlight lang="asm">
mov al, [
inc si
</syntaxhighlight>
と等価である(DF=0の場合、また OF, SF, ZF, AF, PF は inc si の結果により修飾されるので厳密には異なる)。
1,000 ⟶ 1,002行目:
jz Loop_break
でも良い。
※ かつては、定数とレジスタの比較はレジスタファイルの読出しハザードがありストールの原因になりましたが、[[W:Sandy Bridgeマイクロアーキテクチャ|Sandy Bridgeマイクロアーキテクチャ]]以降のプロセッサであればマイクロフュージョンの対象となり、test命令やor命令を使うメリットはなく、專ら可読性を損なうだけです。
;コード例2
1,027 ⟶ 1,031行目:
db 0x55 , 0xaa
</syntaxhighlight>
=== メモリ直書き ===
|