mov sreg,r/m 16の16ビットと32ビットプログラミングにおける違い

1246 ワード

『X 86アセンブリ言語実モードから保護モードへ』にまとめられた
X 86シリーズプロセッサーのみ
1.両者の違い:
例:mov ds,ax A.指定16ビットコンパイルモードでは、生成されたバイナリコードは8 E D 8 B.指定32ビットコンパイルモードで(一部の古いコンパイラでしか現れない)、生成されたバイナリコードは66 8 E D 8 2.影響:A.0 x 66のプレフィックスを付けるのはデフォルトのオペランドサイズを反転するためである.32ビットモードでは、デフォルトのオペランドサイズは4バイトで、命令のソースオペランドは16ビットのAXです.B.接頭辞がある場合、接頭辞がない場合と比較して、CPUは実行時に追加のクロックサイクルを追加する.
3.解決A.32ビットのソースオペランドを使用しますが、高アドレス部分は切り捨てられます.理解しがたい.例えば、mov ds、eaxでコンパイルされたバイナリ命令は、8 E D 8 B.NASMコンパイラを使用し、NASMコンパイラはどのようなプロセッサモードでもコンパイルされた命令は同じです.
[BITS 16]
MOV DS, AX    ;8E D8
MOV DS, EAX ;8E D8
[BITS 32]
MOV DS, AX    ;8E D8
MOV DS, EAX    ;8E D8