「オペレーティングシステム」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎発展的な話題: s/コンパイル/アセンブル/
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎発展的な話題: 2022年現在のx86プロセッサは、x86命令セットをマイクロ命令に分解し、マイクロ命令の組合せによっては複合的なマイクロ命令に合成し実行しています。ところが、lodsbの様な複雑な命令はマイクロ命令に翻訳されず固定的なマイクロコードにより実行されます。このため、かつて命令読込みのオーバーヘッドがなくせるという理由で「最適化」の代表だった複雑な命令を使うことは、現在は実行速度を低下させることになります。
タグ: 2017年版ソースエディター
948 行
;その他の例
 
次のようlodsb 命令とsiレジスタを使っても良。lodsbは[ds:si]からalに1バイトぶんだけレジスタsiの指し示す先のデータを込む(ロード load)命令であり、さらに使用後に自動的にsiレジスタの指し示す位置を1バイトぶんだけインクリメント(DF=0の場合、DF=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, [aisi]
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>
 
 
この他、lodsb を他の命令に書き換える方法もあるが、説明がメンドウなので省略。
 
=== メモリ直書き ===